将Rails / Unicorn / Nginx容器连接到MySQL容器

关于这个线程,我试图创build2个容器:1与rails应用程序,另一个与MySQL数据库,但我不断得到Mysql2::Error (Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'在我的应用程序production.log文件中,当我点击容器的IP http://192.168.59.103

当我启动rails容器时,我试图链接它们,如果指定了错误的MySQL名称,会发生错误。 我错过了什么成功链接容器,以便完整的应用程序在容器中运行?

Rails容器命令

 docker run --name games-app --link test-mysql:mysql -p 8080 -d -e SECRET_KEY_BASE=test sample_rails_games_app Here are my files: 

Dockerfile

 # Publish port 8080 EXPOSE 8080 CMD ["bundle", "exec","unicorn", "-p", "8080"] CMD ["bunde", "exec", "rake", "db:migrate"] 

Rails的database.yml(开发和testing是相同的生产)

 default: &default adapter: mysql2 encoding: utf8 pool: 5 username: root password: root host: localhost #socket: /tmp/mysql.sock production: <<: *default database: weblog_production 

7/31/15编辑

docker日志显示运行的独angular兽服务器:

 docker logs a13bf7851c6d I, [2015-07-31T18:10:59.860203 #1] INFO -- : listening on addr=0.0.0.0:8080 fd=9 I, [2015-07-31T18:10:59.860583 #1] INFO -- : worker=0 spawning... I, [2015-07-31T18:10:59.864143 #1] INFO -- : master process ready I, [2015-07-31T18:10:59.864859 #7] INFO -- : worker=0 spawned pid=7 I, [2015-07-31T18:10:59.865097 #7] INFO -- : Refreshing Gem list I, [2015-07-31T18:11:01.796690 #7] INFO -- : worker=0 ready 

7/31/15解决scheme感谢@Rico

  1. db:migrate有问题,所以我最终在docker run命令中手动docker run 。 确保在容器已经创build之后,或者在创build过程中,因为它需要链接到数据库容器
  2. 这个链接文章帮助我了解,我的链接没有被创build,所以没有办法正确沟通。
  3. 一旦我了解了如何准确地build立链接,我用主机和端口值更新了我的database.yml
  4. 使用此命令检查您的envvariables的名称docker run --rm --name <unique-value> --link <db-name> <non-db-image> env
  5. 使用它来查看应用程序容器中链接的值docker inspect -f "{{ .HostConfig.Links }}" <app-name>

实际上,你的bundle exec unicorn -p 8080 CMD正在取代bundle exec rake db:migrate因为它不会返回。

你应该先运行你的db:migrate ,然后用RUN命令运行它,因为CMDCMD中的主要命令。

但另一个问题是你的database.yml文件。 您正在将数据库指向与应用程序在同一容器上运行的数据库服务器。 在将源容器(应用程序)链接到目标容器(数据库服务器容器)之后,应该从创build的envvariables中填充database.yml的值。 envvariables是在源容器中创build的。

更多信息在这里: https : //docs.docker.com/userguide/dockerlinks/

举个例子:

 $ docker run --rm --name web2 --link db:db training/webapp env . . . DB_NAME=/web2/db DB_PORT=tcp://172.17.0.5:5432 DB_PORT_5432_TCP=tcp://172.17.0.5:5432 DB_PORT_5432_TCP_PROTO=tcp DB_PORT_5432_TCP_PORT=5432 DB_PORT_5432_TCP_ADDR=172.17.0.5 

你的database.yml应该是这样的:

 default: &default adapter: mysql2 encoding: utf8 pool: 5 database: <%= ENV['DB_NAME'] %> username: root password: root host: <%= ENV['DB_PORT_5432_TCP_ADDR'] %> port: <%= ENV['DB_PORT_5432_TCP_PORT'] %> 

您的Dockerfile中不能有2个CMD命令,实际上只有最后一个被保留。 执行的CMD命令是`

CMD [“bunde”,“exec”,“rake”,“db:migrate”]

另一方面

CMD ["bundle", "exec","unicorn", "-p", "8080"]

被取代。

见主pipe

https://docs.docker.com/articles/using_supervisord/

如果你想在你的容器中运行多个进程,或者运行2个不同的容器