ruby-on-rails 如何在Rails应用程序中使用Docker连接MySQL?

iqjalb3h  于 2023-10-21  发布在  Ruby
关注(0)|答案(4)|浏览(194)

我用mysql数据库创建了一个rails应用程序。现在我们把它们放到Docker容器中。我使用Docker,Docker-机器,Docker-编写。
我的docker-composite.yml

  1. db:
  2. image: mysql
  3. environment:
  4. MYSQL_ROOT_PASSWORD: <%= ENV['MYSQL_ROOT_PASSWORD'] %>
  5. ports:
  6. - "3306:3306"
  7. web:
  8. build: .
  9. command: bundle exec rails s -p 3000 -b '0.0.0.0'
  10. volumes:
  11. - .:/myapp
  12. ports:
  13. - "3000:3000"
  14. links:
  15. - db

我的配置/数据库.yml

  1. default: &default
  2. adapter: mysql2
  3. encoding: utf8
  4. pool: 5
  5. username: root
  6. password: <%= ENV['MYSQL_ROOT_PASSWORD'] %>
  7. host: <%= ENV['DB_PORT_3306_TCP_ADDR'] %>
  8. port: <%= ENV['DB_PORT_3306_TCP_PORT'] %>
  9. development:
  10. <<: *default
  11. database: myapp_development
  12. test:
  13. <<: *default
  14. database: myapp_test
  15. production:
  16. <<: *default
  17. database: myapp_production

当 Boot 应用程序

  1. $ docker-compose up
  2. ...
  3. sidekiq_1 | Host '172.17.0.5' is not allowed to connect to this MySQL server
  4. ...

我的Web环境

  1. $ docker-compose run web env
  2. ...
  3. DB_PORT=tcp://172.17.0.3:3306
  4. DB_PORT_3306_TCP=tcp://172.17.0.3:3306
  5. DB_PORT_3306_TCP_ADDR=172.17.0.3
  6. DB_PORT_3306_TCP_PORT=3306
  7. DB_PORT_3306_TCP_PROTO=tcp
  8. WEB_PORT=tcp://172.17.0.6:3000
  9. WEB_PORT_3000_TCP=tcp://172.17.0.6:3000
  10. WEB_PORT_3000_TCP_ADDR=172.17.0.6
  11. WEB_PORT_3000_TCP_PORT=3000
  12. WEB_PORT_3000_TCP_PROTO=tcp
  13. ...

我的docker-machine ip

  1. $ docker-machine ip myapp
  2. 192.168.99.100

从浏览器访问:http://192.168.99.100:3000,然后看到错误:

  1. Mysql2::Error
  2. Host '172.17.0.6' is not allowed to connect to this MySQL server

172.17.0.3172.17.0.5172.17.0.6等。为什么他们使用不同的ip?如何连接MySQL?我无法理解config/database.yml文件中写入的hostport

qnyhuwrf

qnyhuwrf1#

在我的例子中,我在host中运行Rails,在docker中运行MySQL,官方镜像。
添加host: 127.0.0.1解决了这个问题。

config/database.yml

  1. default: &default
  2. adapter: mysql2
  3. encoding: utf8
  4. pool: 5
  5. username: root
  6. password:
  7. host: 127.0.0.1
xlpyo6sf

xlpyo6sf2#

您必须将容器名称(db)添加到主机,示例:

config/database.yml

  1. default: &default
  2. adapter: mysql2
  3. encoding: utf8
  4. pool: 5
  5. username: root
  6. password: <%= ENV['MYSQL_ROOT_PASSWORD'] %>
  7. host: db
  8. development:
  9. <<: *default
  10. database: myapp_development
  11. test:
  12. <<: *default
  13. database: myapp_test
  14. production:
  15. <<: *default
  16. database: myapp_production

看看这个例子:docker-to-rails-with-rbenv

展开查看全部
5w9g7ksd

5w9g7ksd3#

IP由内部DHCP服务器分配。这就是为什么他们可以改变…
我推荐阅读这篇文章http://blog.carbonfive.com/2015/03/17/docker-rails-docker-compose-together-in-your-development-workflow/,它解释了如何使用主机名(而不是IP)配置rails应用程序,以便在使用docker-compose时正确连接到数据库。

hmtdttj4

hmtdttj44#

不同方法:
通过MapDB端口:

  1. ports:
  2. - "3306:3306"

你正在连接你的主机的端口3306到容器内的相同端口。
因此,您可以通过“localhost”上的端口连接到数据库。
所以database.yml看起来像这样:

  1. default: &default
  2. adapter: mysql2
  3. encoding: utf8
  4. pool: 5
  5. username: root
  6. password: <%= ENV['dont use MYSQL_ROOT_PASSWORD'] %>
  7. host: localhost
  8. port: 3306
  9. development:
  10. <<: *default
  11. database: myapp_development
  12. test:
  13. <<: *default
  14. database: myapp_test
  15. production:
  16. <<: *default
  17. database: myapp_production

你必须记住,数据库中的用户不是从本地主机连接的,而是从docker网络(默认172.x.x.x)连接的,所以为所有主机创建你的用户(user@%
永远不要使用root作为数据库用户。
如果你不想用SQL命令为Rails设置一个用户作为root,你可以在启动docker容器时通过环境变量创建一个。
请参见DockerHub-mysql
您可以在docker-compose.yml中或在运行docker compose up时定义这些环境变量

展开查看全部

相关问题