やりたいこと
既存のrailsアプリケーションにdockerを導入し、以下のことをできるようにしたいと考えています。
- docker-composeを使ってdocker開発環境を構築したい
- 同じアプリのホスト環境(dockerコンテナを起動していないlocal環境)にてrails sやdb関連のコマンドを使いたい
- EC2にデプロイしたい(Capistranoを使って)
※docker導入前はcapistranoを使った自動デプロイはできている状態でした。
現状できないこと
docker環境にてアプリを立ち上げることはできるようになりましたが、
ホスト環境でのrails server立ち上げ、データベース操作を行うと下記エラーが出ます。
Mysql2::Error::ConnectionError (Unknown MySQL server host 'db' (0)):
またcapistranoを使って自動デプロイを試みたところ、deploy:migrating
のところで下記エラーが出ます。
Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (2)
ソースコード
Dockerfile
1FROM ruby:2.6.5 2RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/* 3RUN apt-get update && apt-get install -y mariadb-client --no-install-recommends && rm -rf /var/lib/apt/lists/* 4RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs 5RUN apt-get install -y vim 6 7RUN mkdir /myproject 8 9WORKDIR /myproject 10 11ADD Gemfile /myproject/Gemfile 12ADD Gemfile.lock /myproject/Gemfile.lock 13 14RUN bundle install 15 16ADD . /myproject
dockercompose
1version: '3' 2services: 3 db: 4 image: mysql:5.6.50 5 command: mysqld --character-set-server=utf8 6 environment: 7 MYSQL_DATABASE: app_development 8 MYSQL_ROOT_PASSWORD: password 9 MYSQL_USER: root 10 ports: 11 - "3306:3306" 12 web: 13 build: 14 context: . 15 dockerfile: Dockerfile 16 command: bundle exec rails s -p 3000 -b '0.0.0.0' 17 tty: true 18 stdin_open: true 19 depends_on: 20 - db 21 ports: 22 - "3000:3000" 23 volumes: 24 - .:/myproject 25 environment: 26 - "SELENIUM_DRIVER_URL=http://selenium_chrome:4444/wd/hub" 27 selenium_chrome: 28 image: selenium/standalone-chrome-debug 29 logging: 30 driver: none
database
1default: &default 2 adapter: mysql2 3 encoding: utf8 4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 5 username: root 6 password: password 7 host: db 8 9development: 10 <<: *default 11 database: app_development 12 13test: 14 <<: *default 15 database: app_test 16 17production: 18 <<: *default 19 database: app_production 20 username: root 21 password: <%= ENV['DATABASE_PASSWORD'] %> 22 socket: /var/lib/mysql/mysql.sock 23
行ったこと
エラーの内容からして、database.ymlのhost:db
が怪しいと思いdocker-compose.yml
とdatabase.yml
を下記の通り書き換えました。
docker環境からアクセスした場合と、それ以外の場合でmysqlの権限情報やホストを変えることができるようにするという考え方です。
考え方は下記Qiitaの記事を参考にしました。
https://qiita.com/waniwaninowani/items/21d677a6c455e5b76d45
dockercompose
1version: '3' 2services: 3 db: 4 image: mysql:5.6.50 5 command: mysqld --character-set-server=utf8 6 environment: 7 MYSQL_DATABASE: app_development 8 MYSQL_ROOT_PASSWORD: password 9 MYSQL_USER: root 10 MYSQL_HOST: db 11 ports: 12 - "3306:3306" 13 web: 14 build: 15 context: . 16 dockerfile: Dockerfile 17 command: bundle exec rails s -p 3000 -b '0.0.0.0' 18 tty: true 19 stdin_open: true 20 depends_on: 21 - db 22 ports: 23 - "3000:3000" 24 volumes: 25 - .:/myproject 26 environment: 27 - "SELENIUM_DRIVER_URL=http://selenium_chrome:4444/wd/hub" 28 selenium_chrome: 29 image: selenium/standalone-chrome-debug 30 logging: 31 driver: none
database
1default: &default 2 adapter: mysql2 3 encoding: utf8 4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 5 username: <%= ENV['MYSQL_USERNAME'] || 'root' %> 6 password: <%= ENV['MYSQL_PASSWORD'] || '' %> 7 host: <%= ENV['MYSQL_HOST'] || 'localhost' %> 8 socket: /tmp/mysql.sock 9 10development: 11 <<: *default 12 database: app_development 13 14test: 15 <<: *default 16 database: app_test 17 18production: 19 <<: *default 20 database: app_production 21 username: root 22 password: <%= ENV['DATABASE_PASSWORD'] %> 23 socket: /var/lib/mysql/mysql.sock 24 host: localhost
結果
上記の変更を行ったところ、ホスト環境のrails serverのアクセスはできるようになりましたが、
今度はdocker環境で立ち上げを行う際に下記エラーが出てしまいました。
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
エラー文からsocket通信の記載を外したらできるのでは、と思いリトライすると、
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
となってしまいます。
またこの状態でcapistranoを試すのは怖くてできていないですし、そもそもdocker環境が正常に作動しないので仮にcapistranoを実行できても意味がない、という状況です。
ちなみにこの状態でdbのコンテナからシェルに入り、mysql -u root
を実行すると
Host '172.18.0.2' is not allowed to connect to this MySQL server
とエラーが吐かれ、mysqlに入れない状態でした。
質問
以下ポイントに関して教えを乞いたいと考えています
- そもそものゴールの設定が間違っていないか
当方はゴールを①docker環境での開発が可能 ②ホスト環境でも開発が可能 ③capistranoによる自動デプロイが可能
に設定していますが、考え方が間違っているということはありませんか?
※正直②ホスト環境での開発 は必要なければ飛ばしてしまえば良いと思っています。
2. 上記1を踏まえ、以下をご教授願いたいです。
- ゴール設定が間違っていない場合
→上記ソースコードに対しご指摘をいただきたいです。
- ゴール設定が間違っている場合
→dockerを開発環境に導入した場合の開発の考え方(ホスト環境への接続の必要はないetc..)、または考え方を学べる記事や書籍等の情報ソースを教えてください。
ここまで参考にした書籍/記事等
書籍
- Docker/Kubernetes 実践コンテナ開発入門(途中まで)
webサイト/記事
- 入門Docker
https://y-ohgi.com/introduction-docker/
- Dockerをrailsアプリに組み込む方法
https://qiita.com/kkyouhei/items/653760627bf9d4bc9e71
https://qiita.com/y-suna/items/e52b3af1d80c52b66b31
- docker環境とホスト環境を両立する方法
https://qiita.com/waniwaninowani/items/21d677a6c455e5b76d45
環境
- Ruby:2.6.5
- Rails:6.0.0
- Mysql:5.6.50
- Docker:20.10.2
- docker-compose:1.27.4
回答1件
あなたの回答
tips
プレビュー