如何处理Docker 内存管理?

如何处理Docker 内存管理?

更新:我没有通过 docker 命令启动 resque 工作器(以进行测试),而是使用 fig kill 杀死所有容器,将其添加到 fig 配置中,然后运行 ​​fig up。这很有效,我的所有容器都能够和谐运行。这让我想到另一个问题——当您运行 fig up 时,它会分配所有可用内存吗?从而阻止您在 docker 之外运行其他容器?

我现在正在使用 Docker 配置一个临时服务器,在尝试启动 ruby​​ 工作器时遇到了一个奇怪的错误。我使用的服务器是一台 20 美元的 Linode,配有 2GB RAM 和 2 个 CPU 核心。

我正在使用 Fig 在此 VPS 上运行 nginx、unicorn、mysql、redis 和 elasticsearch 容器,没有任何问题:

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 工作程序:

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

答案1

Docker 容器基本上只是进程,因此它们可以按照进程可以使用的所有常见方式分配内存。

既然你说你使用的是 Linode,那么你是不是有默认的 256MB 交换大小?这样系统上所有内容的总体限制就是 2.25GB;也许这还不够?

类似的命令top将显示正在使用的内存量。

答案2

我在实验中看到过类似的消息,事实证明,docker 容器在停止时仍然存在。

尝试这个:

docker ps -a

您可能看到一些“已退出”条目仍占用内存。您可以使用以下命令删除不需要的容器docker rm,但我敦促您确保您真正理解图像和容器之间的区别,并了解容器在运行时状态是如何变化的。

例如,数据库映像可能包含数据库引擎和一些基本数据文件,但在运行它之后(即docker run,当从镜像创建容器时)并发出一些INSERT// UPDATESQLDELETE语句时,您的容器(不是镜像!)有一些新数据。删除容器也会删除该数据。

相关内容