Назад | Перейти на главную страницу

Как справиться с управлением памятью Docker?

Обновить: Вместо того, чтобы запускать моего resque worker с помощью команды docker (для тестирования), я вместо этого убил все свои контейнеры с помощью fig kill, добавил его в конфигурацию fig и запустил fig up. Это сработало, и все мои контейнеры могли работать в гармонии. Это подводит меня к другому вопросу - когда вы запускаете fig up, он распределяет всю доступную память? Таким образом, вы не можете запускать другие контейнеры вне докера?

Я настраиваю промежуточный сервер прямо сейчас с помощью Docker, и у меня возникает странная ошибка при попытке запустить ruby ​​worker. Я использую сервер Linode за 20 долларов с 2 ГБ ОЗУ и 2 ядрами ЦП.

Я без проблем запускаю контейнеры nginx, unicorn, mysql, redis и elasticsearch на этом VPS, используя Fig:

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

Я пытаюсь запустить другой контейнер Rails, который будет запускать Resque worker:

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

Когда я запускаю свой контейнер и пытаюсь запустить Resque, я получаю ошибку выделения памяти:

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)>

Я видел подобные сообщения во время своих экспериментов, и оказалось, что контейнер докеров все еще существует, когда он остановлен.

Попробуй это:

docker ps -a

Вероятно, вы видите какие-то «Завершенные» записи, которые все еще занимают память. Вы можете удалить ненужные контейнеры с помощью docker rm, но я настоятельно призываю вас убедиться, что вы действительно понимаете различия между изображениями и контейнерами, а также понимаете, как изменяется состояние ваших контейнеров при их запуске.

Например. образ базы данных может содержать ядро ​​базы данных и некоторые базовые файлы данных, но после его запуска (т.е. docker run, когда контейнер создается из образа) и выдавая некоторые INSERT/UPDATE/DELETE Операторы SQL, ваш контейнер (не изображение!) Содержит некоторые новые данные. Удаление контейнера приведет к удалению и этих данных.

Контейнеры Docker - это в основном просто процессы, поэтому они могут выделять память всеми обычными способами, которыми может процесс.

Поскольку вы говорите, что используете Linode, возможно, у вас размер свопа по умолчанию 256 МБ? Это даст вам общий предел для всего в системе в 2,25 ГБ; может этого просто недостаточно?

Команда вроде top покажет вам, сколько памяти используется.