【问题标题】:How to connect mysql in a rails application with docker?如何将rails应用程序中的mysql与docker连接?
【发布时间】:2015-11-10 02:03:28
【问题描述】:

我创建了一个使用 mysql 数据库的 rails 应用程序。 现在想将它们放入 docker 容器中。 我正在使用 docker、docker-machine、docker-compose。

我的 docker-compose.yml

db:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD: <%= ENV['MYSQL_ROOT_PASSWORD'] %>
  ports:
    - "3306:3306"

web:
  build: .
  command: bundle exec rails s -p 3000 -b '0.0.0.0'
  volumes:
    - .:/myapp
  ports:
    - "3000:3000"
  links:
    - db

我的配置/database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: <%= ENV['MYSQL_ROOT_PASSWORD'] %>
  host: <%= ENV['DB_PORT_3306_TCP_ADDR'] %>
  port: <%= ENV['DB_PORT_3306_TCP_PORT'] %>

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production

启动应用时

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

我的网络环境

$ docker-compose run web env
...
DB_PORT=tcp://172.17.0.3:3306
DB_PORT_3306_TCP=tcp://172.17.0.3:3306
DB_PORT_3306_TCP_ADDR=172.17.0.3
DB_PORT_3306_TCP_PORT=3306
DB_PORT_3306_TCP_PROTO=tcp
WEB_PORT=tcp://172.17.0.6:3000
WEB_PORT_3000_TCP=tcp://172.17.0.6:3000
WEB_PORT_3000_TCP_ADDR=172.17.0.6
WEB_PORT_3000_TCP_PORT=3000
WEB_PORT_3000_TCP_PROTO=tcp
...

我的码头机器ip

$ docker-machine ip myapp
192.168.99.100

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

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

172.17.0.3172.17.0.5172.17.0.6等。为什么他们使用不同的ips? 那么如何连接mysql呢?看不懂config/database.yml文件里写的hostport

【问题讨论】:

    标签: mysql ruby-on-rails docker


    【解决方案1】:

    在我的例子中,我在 host 中运行 Rails,在官方镜像 docker 中运行 MySQL。

    添加host: 127.0.0.1 解决了这个问题。

    config/database.yml

    default: &default
      adapter: mysql2
      encoding: utf8
      pool: 5
      username: root
      password:
      host: 127.0.0.1
    

    【讨论】:

      【解决方案2】:

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

      config/database.yml

      default: &default
        adapter: mysql2
        encoding: utf8
        pool: 5
        username: root
        password: <%= ENV['MYSQL_ROOT_PASSWORD'] %>
        host: db
      development:
        <<: *default
        database: myapp_development
      
      test:
        <<: *default
        database: myapp_test
      
      production:
        <<: *default
        database: myapp_production
      

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

      【讨论】:

      • 这不是公认的答案???非常感谢您,先生。
      【解决方案3】:

      IP 由内部 DHCP 服务器分配。这就是为什么他们可以改变......

      我建议阅读这篇文章 http://blog.carbonfive.com/2015/03/17/docker-rails-docker-compose-together-in-your-development-workflow/,它解释了如何使用主机名(而不是 IP)配置 rails 应用程序,以便在使用 docker-compose 时正确连接到数据库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多