How to connect mysql in a rails appliation with docker?

I created a rails app use mysql database.
Now want to put them into docker container.
I am using docker, docker-machine, docker-compose.

My docker-compose.yml

  • CentOS 6 Docker 1.7 with error “panic: runtime error: invalid memory address or nil pointer dereference”
  • gcloud auth login with Docker does not work as it says in documentation
  • Kill processes inside docker container after daemon restart
  • Why do ping packets not reach a custom gateway in docker?
  • Starting delayed_job with Dokku
  • Restart one service in docker swarm stack
  • 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
    

    My config/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
    

    When boot app

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

    My web env

    $ 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
    ...
    

    My docker-machine ip

    $ docker-machine ip myapp
    192.168.99.100
    

    Access from browser: http://192.168.99.100:3000, then saw error:

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

    172.17.0.3, 172.17.0.5, 172.17.0.6, etc. Why they use different ips?
    Then how to connect mysql? I can’t understand the host and port written in the config/database.yml file.

  • run multiple instances in the same server
  • Private Network broken in Vagrant with Docker
  • Writing python log files to logstash
  • how to use pip to install pkg from requirement file without reinstall
  • Storring and pulling meta-information of a docker image
  • Postresql query issue when running inside alpine linux container
  • 2 Solutions collect form web for “How to connect mysql in a rails appliation with docker?”

    Adds the container name (db) to the host, Example:

    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
    

    Look at this example: docker-to-rails-with-rbenv

    IPs are assigned by internal DHCP server. This is why they can changed…

    I would recommend reading this post http://blog.carbonfive.com/2015/03/17/docker-rails-docker-compose-together-in-your-development-workflow/ which explains how to configure rails app using host name (and not IPs) to properly connect to a database while using docker-compose.

    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.