Como lidar com o gerenciamento de memória do Docker?

1

Atualização: Em vez de girar o meu trabalhador de resque pelo comando docker (para teste), em vez disso, matei todos os meus contêineres com o figo kill, adicionei à configuração do figo e executei o figo. Isso funcionou e todos os meus contêineres foram capazes de funcionar em harmonia. Isso me leva a outra questão - quando você executa o figo, ele aloca toda a memória disponível? Evitando assim que você execute outros contêineres, fora da janela de encaixe?

Estou provisionando agora um servidor de teste usando o Docker e estou com um erro estranho ao tentar iniciar um trabalhador do ruby. O servidor que estou usando é um Linode de US $ 20 com 2 GB de RAM e 2 núcleos de CPU.

Estou executando contêineres nginx, unicorn, mysql, redis e elasticsearch neste VPS usando o Fig sem nenhum problema:

ONTAINER ID        IMAGE                             COMMAND                CREATED             STATUS              PORTS                                              NAMES
a04cce025794        dockerfile/nginx:latest           "nginx"                21 hours ago        Up 21 hours         0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp           arthouse_nginx_1
607139f9ba16        rails:latest                      "/bin/bash -l -c 'cd   21 hours ago        Up 21 hours         3000/tcp, 0.0.0.0:49222->8080/tcp                  arthouse_app_1
6274f8fe5dc0        dockerfile/elasticsearch:latest   "/elasticsearch/bin/   21 hours ago        Up 21 hours         0.0.0.0:49220->9200/tcp, 0.0.0.0:49221->9300/tcp   arthouse_elasticsearch_1
55d68c470ce5        dockerfile/redis:latest           "redis-server /etc/r   21 hours ago        Up 21 hours         0.0.0.0:49219->6379/tcp                            arthouse_redis_1
50635616ddaa        mysql:latest                      "/entrypoint.sh mysq   21 hours ago        Up 21 hours         0.0.0.0:49218->3306/tcp                            arthouse_database_1

Estou tentando ativar outro contêiner do Rails que executará um trabalhador do Resque:

docker run -it --link arthouse_elasticsearch_1:elasticsearch --link arthouse_redis_1:redis --link arthouse_database_1:db rails /bin/bash

Quando eu lanço meu contêiner e tento executar o Resque, recebo um erro de alocação de memória:

root@741f3a425908:~/rails# bundle exec rake environment resque:work VERBOSE=true QUEUE=*
Digest::Digest is deprecated; use Digest
Amazon Web Services Initialized.
Digest::Digest is deprecated; use Digest
Digest::Digest is deprecated; use Digest
---- Redis Initialization ----
Connecting to 172.17.0.194 on 6379 in the development environment
Redis is initialized.
*** DEPRECATION WARNING: Resque::Worker#verbose and #very_verbose are deprecated. Please set Resque.logger.level instead
Called from: /root/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/resque-1.25.2/lib/resque/worker.rb:746:in 'verbose='
    /root/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/resque-1.25.2/lib/resque/tasks.rb:16:in 'block (2 levels) in <top (required)>'
    /root/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/task.rb:240:in 'call'
    /root/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/task.rb:240:in 'block in execute'
    /root/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/task.rb:235:in 'each'
    /root/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/task.rb:235:in 'execute'
*** Starting worker 741f3a425908:171:*
WARNING: This way of doing signal handling is now deprecated. Please see http://hone.heroku.com/resque/2012/08/21/resque-signals.html for more info.
*** Registered signals
*** Running before_first_fork hooks
*** Checking mailer
*** Found job on mailer
*** got: (Job{mailer} | CustomerMailer | ["customer_registered", 2])
*** resque-1.25.2: Processing mailer since 1416336015 [CustomerMailer]
*** Running before_fork hooks with [(Job{mailer} | CustomerMailer | ["customer_registered", 2])]
*** Failed to start worker : #<Errno::ENOMEM: Cannot allocate memory - fork(2)>
    
por Thomas V. 18.11.2014 / 19:58

2 respostas

1

Os contêineres do Docker são basicamente apenas processos, para que possam alocar memória de todas as formas usuais que um processo pode.

Já que você diz que está no Linode, talvez tenha o tamanho padrão de swap de 256MB? Isso lhe daria um limite geral para tudo no sistema de 2,25 GB; talvez isso não seja suficiente?

Um comando como top mostrará quanta memória está em uso.

    
por 20.11.2014 / 18:01
1

Eu vi mensagens semelhantes durante meus experimentos, e descobriu-se que o contêiner docker ainda está por perto quando está parado.

Tente isto:

docker ps -a

Provavelmente você verá algumas entradas "Exited" que ainda ocupam memória. Você pode remover contêineres desnecessários com docker rm , mas peço que você compreenda realmente o diferenças entre imagens e contêineres e também perceber como o estado de seus contêineres é alterado quando estão em execução.

Por exemplo a imagem do banco de dados pode conter o mecanismo do banco de dados e alguns arquivos de dados básicos, mas depois de executá-lo (ou seja, docker run , quando o contêiner é criado a partir da imagem) e emitindo algumas instruções INSERT / UPDATE / DELETE SQL, seu contêiner (não a imagem!) possui alguns novos dados. Remover o contêiner também excluirá esses dados.

    
por 23.12.2014 / 07:08