更新:而不是通过docker命令(testing)转动我的resque工人,而是杀死所有我的容器无花果杀死,添加到无花果configuration,并跑了起来。 这工作,我所有的容器能够和谐运行。 这给我带来另一个问题 – 当你运行起来,它分配所有可用的内存? 从而阻止你在Docker之外运行其他容器?
我正在使用Docker供应临时服务器,并且在尝试启动一个Ruby工作人员时遇到了一个奇怪的错误。 我使用的服务器是一个20美元的Linode,带有2GB RAM和2个CPU核心。
我在这个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
我想旋转另一个将运行Resque工作的Rails容器:
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容器基本上就是一个进程,所以他们可以按照通常的方式分配内存。
既然你说你在Linode,也许你有默认的256MB交换大小? 这会给你在2.25GB系统上的所有内容的总体限制; 也许这还不够?
像top这样的命令将显示正在使用多less内存。
在我的实验中,我看到了类似的消息,事实certificate,docker集装箱在停止时仍在运行。
尝试这个:
docker ps -a
可能你会看到一些仍然占用内存的“已退出”条目。 您可以使用docker rm删除不需要的容器,但我强烈build议您确保您真正理解图像和容器之间的差异,并了解容器在运行时的状态。
例如,数据库映像可能包含数据库引擎和一些基本的数据文件,但运行后(即docker run ,当从图像创build容器时)和发出一些INSERT / UPDATE / DELETE SQL语句,你的容器(不是图像!数据。 删除容器也会删除该数据。