将 Rails/Unicorn/Nginx 个容器连接到 MySQL 个容器
Connect Rails/Unicorn/Nginx container to MySQL container
与 线程相关,我正在尝试创建 2 个容器: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 容器时,我试图 link 它们,如果我指定了不正确的 MySQL 名称,确实会出现错误。我缺少什么才能成功 link 容器以便完整的应用程序在容器中运行?
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(开发和测试与生产相同)
default: &default
adapter: mysql2
encoding: utf8
pool: 5
username: root
password: root
host: localhost
#socket: /tmp/mysql.sock
production:
<<: *default
database: weblog_production
2015 年 7 月 31 日编辑
docker 日志显示 unicorn 服务器 运行:
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 解决方案感谢@Rico
db:migrate
遇到问题 运行 所以我最终 运行 在 docker run
命令中手动完成。确保在创建容器后执行此操作,或者在创建过程中执行此操作,因为它需要 linking 到数据库容器
- 这个 linking article 帮助我了解我的 link 没有被创建,所以无法正常通信。
- 一旦我了解了如何准确制作 link,我就用主机和端口值
更新了我的 database.yml
- 使用此命令检查环境变量的名称
docker run --rm --name <unique-value> --link <db-name> <non-db-image> env
。
- 使用它来查看应用程序容器中 link 的值
docker inspect -f "{{ .HostConfig.Links }}" <app-name>
您的 Dockerfile 中不能有 2 个 CMD 命令,实际上只保留最后一个。执行的CMD命令是`
CMD ["bunde", "exec", "rake", "db:migrate"]`
另一个,
CMD ["bundle", "exec","unicorn", "-p", "8080"]
已被取代。
见主管
https://docs.docker.com/articles/using_supervisord/
如果你想 运行 在你的容器中处理多个进程,或者 运行 2 个不同的容器
实际上您的 bundle exec unicorn -p 8080
CMD
正在取代 bundle exec rake db:migrate
,因为它没有 return。
你应该先 运行 你的 db:migrate
然后你应该 运行 使用 RUN
命令因为 CMD
是 [=34 中的主要命令=].
但另一个问题是您的 database.yml
文件。您将数据库指向一个数据库服务器,该服务器 运行 位于与应用程序相同的容器中。您应该从 link 源容器(应用程序)到目标容器(数据库服务器容器)之后创建的环境变量中填充 database.yml
的值。环境变量在源容器中创建。
更多信息在这里: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'] %>
与 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 容器时,我试图 link 它们,如果我指定了不正确的 MySQL 名称,确实会出现错误。我缺少什么才能成功 link 容器以便完整的应用程序在容器中运行?
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(开发和测试与生产相同)
default: &default
adapter: mysql2
encoding: utf8
pool: 5
username: root
password: root
host: localhost
#socket: /tmp/mysql.sock
production:
<<: *default
database: weblog_production
2015 年 7 月 31 日编辑
docker 日志显示 unicorn 服务器 运行:
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 解决方案感谢@Rico
db:migrate
遇到问题 运行 所以我最终 运行 在docker run
命令中手动完成。确保在创建容器后执行此操作,或者在创建过程中执行此操作,因为它需要 linking 到数据库容器- 这个 linking article 帮助我了解我的 link 没有被创建,所以无法正常通信。
- 一旦我了解了如何准确制作 link,我就用主机和端口值 更新了我的 database.yml
- 使用此命令检查环境变量的名称
docker run --rm --name <unique-value> --link <db-name> <non-db-image> env
。 - 使用它来查看应用程序容器中 link 的值
docker inspect -f "{{ .HostConfig.Links }}" <app-name>
您的 Dockerfile 中不能有 2 个 CMD 命令,实际上只保留最后一个。执行的CMD命令是`
CMD ["bunde", "exec", "rake", "db:migrate"]`
另一个,
CMD ["bundle", "exec","unicorn", "-p", "8080"]
已被取代。
见主管
https://docs.docker.com/articles/using_supervisord/
如果你想 运行 在你的容器中处理多个进程,或者 运行 2 个不同的容器
实际上您的 bundle exec unicorn -p 8080
CMD
正在取代 bundle exec rake db:migrate
,因为它没有 return。
你应该先 运行 你的 db:migrate
然后你应该 运行 使用 RUN
命令因为 CMD
是 [=34 中的主要命令=].
但另一个问题是您的 database.yml
文件。您将数据库指向一个数据库服务器,该服务器 运行 位于与应用程序相同的容器中。您应该从 link 源容器(应用程序)到目标容器(数据库服务器容器)之后创建的环境变量中填充 database.yml
的值。环境变量在源容器中创建。
更多信息在这里: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'] %>