質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

解決済

docker導入後のMysql2::Error::ConnectionError (Unknown MySQL server host 'db' (0)):

lyon
lyon

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

1回答

0評価

0クリップ

2244閲覧

投稿2021/02/07 08:01

編集2022/01/12 10:58

やりたいこと

既存のrailsアプリケーションにdockerを導入し、以下のことをできるようにしたいと考えています。

  • docker-composeを使ってdocker開発環境を構築したい
  • 同じアプリのホスト環境にて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

FROM ruby:2.6.5 RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/* RUN apt-get update && apt-get install -y mariadb-client --no-install-recommends && rm -rf /var/lib/apt/lists/* RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN apt-get install -y vim RUN mkdir /myproject WORKDIR /myproject ADD Gemfile /myproject/Gemfile ADD Gemfile.lock /myproject/Gemfile.lock RUN bundle install ADD . /myproject

dockercompose

version: '3' services: db: image: mysql:5.6.50 command: mysqld --character-set-server=utf8 environment: MYSQL_DATABASE: app_development MYSQL_ROOT_PASSWORD: password MYSQL_USER: root ports: - "3306:3306" web: build: context: . dockerfile: Dockerfile command: bundle exec rails s -p 3000 -b '0.0.0.0' tty: true stdin_open: true depends_on: - db ports: - "3000:3000" volumes: - .:/myproject environment: - "SELENIUM_DRIVER_URL=http://selenium_chrome:4444/wd/hub" selenium_chrome: image: selenium/standalone-chrome-debug logging: driver: none

database

default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password host: db development: <<: *default database: app_development test: <<: *default database: app_test production: <<: *default database: app_production username: root password: <%= ENV['DATABASE_PASSWORD'] %> socket: /var/lib/mysql/mysql.sock

行ったこと

エラーの内容からして、database.ymlのhost:dbが怪しいと思いdocker-compose.ymldatabase.ymlを下記の通り書き換えました。
docker環境からアクセスした場合と、それ以外の場合でmysqlの権限情報やホストを変えることができるようにするという考え方です。
考え方は下記Qiitaの記事を参考にしました。
https://qiita.com/waniwaninowani/items/21d677a6c455e5b76d45

dockercompose

version: '3' services: db: image: mysql:5.6.50 command: mysqld --character-set-server=utf8 environment: MYSQL_DATABASE: app_development MYSQL_ROOT_PASSWORD: password MYSQL_USER: root MYSQL_HOST: db ports: - "3306:3306" web: build: context: . dockerfile: Dockerfile command: bundle exec rails s -p 3000 -b '0.0.0.0' tty: true stdin_open: true depends_on: - db ports: - "3000:3000" volumes: - .:/myproject environment: - "SELENIUM_DRIVER_URL=http://selenium_chrome:4444/wd/hub" selenium_chrome: image: selenium/standalone-chrome-debug logging: driver: none

database

default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: <%= ENV['MYSQL_USERNAME'] || 'root' %> password: <%= ENV['MYSQL_PASSWORD'] || '' %> host: <%= ENV['MYSQL_HOST'] || 'localhost' %> socket: /tmp/mysql.sock development: <<: *default database: app_development test: <<: *default database: app_test production: <<: *default database: app_production username: root password: <%= ENV['DATABASE_PASSWORD'] %> socket: /var/lib/mysql/mysql.sock 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に入れない状態でした。

質問

以下ポイントに関して教えを乞いたいと考えています

  1. そもそものゴールの設定が間違っていないか

当方はゴールを①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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

suama
suama

2021/02/07 09:37

こんにちは。「ホスト環境」とありますが、これは別のサーバのことでしょうか?なにか情報を添えていただければと思います。 database.yml で host: xxxx としている箇所は、本来はデータベースを起動しているサーバーのIPアドレスやホスト名が入ります。
lyon
lyon

2021/02/07 09:49 編集

こんにちは。ここで言うホスト環境とは、dockerコンテナを起動しない状態で、rails sを入力し、PC上のいわゆるlocalhost:3000にアクセスしようとした時のことです。
suama
suama

2021/02/07 11:41 編集

ありがとうございます!回答してみますね!

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです