【问题标题】:Connect Rails/Unicorn/Nginx container to MySQL container将 Rails/Unicorn/Nginx 容器连接到 MySQL 容器
【发布时间】:2015-07-31 18:05:32
【问题描述】:

this 线程相关,我正在尝试创建 2 个容器:1 个使用 rails 应用程序,另一个使用 MySQL 数据库,但在我点击后,我的应用程序 production.log 文件中不断收到 Mysql2::Error (Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'容器IPhttp://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(开发和测试与生产相同)

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 日志显示独角兽服务器正在运行:

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

  1. db:migrate 运行时遇到问题,所以我最终在 docker run 命令中手动运行它。确保在容器已创建后或在创建过程中执行此操作,因为它需要链接到数据库容器
  2. linking article 帮助我了解我的链接没有被创建,因此无法正常通信。
  3. 一旦我了解了如何准确地建立链接,我确实使用主机和端口值更新了我的 database.yml
  4. 使用此命令检查环境变量的名称docker run --rm --name &lt;unique-value&gt; --link &lt;db-name&gt; &lt;non-db-image&gt; env
  5. 使用它来查看应用容器中链接的值docker inspect -f "{{ .HostConfig.Links }}" &lt;app-name&gt;

【问题讨论】:

  • 我应该给这个问题 10 ups... 它拯救了我的一天

标签: mysql docker containers


【解决方案1】:

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

您应该先运行db:migrate,然后使用RUN 命令运行它,因为CMD 是docker 中的主要命令。

但另一个问题是您的database.yml 文件。您将您的数据库指向一个数据库服务器,该服务器在与应用程序相同的容器上运行。您应该从将源容器(应用程序)链接到目标容器(数据库服务器容器)后创建的环境变量中填充 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'] %>

【讨论】:

  • 你赢得了今天的金星!这让我大部分时间都在那里,我终于能够使用修改后的命令链接到 DB 容器,并验证该链接。我最终不得不在另一个 Docker 运行命令中运行 db:create 命令,所以我应该更好地将它打包到 Dockerfile 中。非常感谢你的帮助!更新了原始帖子的命令。
【解决方案2】:

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

CMD ["bunde", "exec", "rake", "db:migrate"]`

另一个,那个

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

已被取代。

见主管

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

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

【讨论】:

  • 谢谢@user2915097。我对此并不完全确定,但如果我只有 unicorn 命令,问题仍然存在,并且 unicorn 服务器正在运行。
猜你喜欢
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 2020-01-20
相关资源
最近更新 更多