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

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

新規登録して質問してみよう
ただいま回答率
85.50%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Docker

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

Q&A

解決済

2回答

1413閲覧

dockerで立てたrailsのコンテナからmysqlのコンテナに接続できない

ryoma510

総合スコア29

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Docker

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

0グッド

0クリップ

投稿2018/03/18 02:29

編集2018/03/18 12:22

この記事を参考にdockerでrails + mysql + springな環境を作ろうとしています。
その時にrailsコンテナとmysqlコンテナの接続がうまく行きません。

## エラー内容

docker-compose.yml

version: '2' services: rails: &app_base build: context: . dockerfile: "Dockerfile.dev" command: ["bundle", "exec", "rails", "s", "-p", "3000", "-b", "0.0.0.0"] env_file: - "./.env.dev" volumes: - ".:/app" volumes_from: - data ports: - "3000:3000" depends_on: - db tty: true stdin_open: true spring: <<: *app_base command: ["bundle", "exec", "spring", "server"] ports: [] tty: false stdin_open: false db: image: "mysql:5.6" environment: - "MYSQL_USER=mysql" - "MYSQL_PASSWORD=password" volumes_from: - data ports: - "5432:5432" data: image: "busybox" volumes: - "db:/var/lib/mysql" - "bundle:/usr/local/bundle" volumes: db: driver: local bundle: driver: local

.env.dev

DATABASE_HOST=db DATABASE_PORT=5432 DATABASE_USER=mysql DATABASE_PASSWORD=password

database.yml

default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: <%= ENV.fetch('DATABASE_USER') { 'root' } %> password: <%= ENV.fetch('DATABASE_PASSWORD') { 'password' } %> host: <%= ENV.fetch('DATABASE_HOST') { 'localhost' } %> port: <%= ENV.fetch('DATABASE_PORT') { 5432 } %> development: <<: *default database: app_development test: <<: *default database: app_test production: <<: *default database: app_production

このようにしてrailsとmysqlのコンテナを繋ぎたいのですが、

#<Mysql2::Error: Unknown MySQL server host 'db' (25)>

と表示されてうまく行きません。
docker-compose.ymlのrailsサービスのところに

depends_on: - db

と書いてあるので、ちゃんとmysqlのサービスが立ち上がってから、railsが立ち上がるようにしていますが、うまく行きません。
同じ方法でpostgresqlはうまくいったのですが・・・・

どなたか知見のある方教えていただけないででしょうか?
「ここが怪しい!」とかでも教えていただけると幸いです。

追記

docker-compose.ymlからrailsコンテナのportsの宣言を削除しました。

version: '2' services: rails: &app_base build: context: . dockerfile: "Dockerfile.dev" command: ["bundle", "exec", "rails", "s", "-p", "3000", "-b", "0.0.0.0"] env_file: - "./.env.dev" volumes: - ".:/app" volumes_from: - data ports: - "3000:3000" depends_on: - db tty: true stdin_open: true spring: <<: *app_base command: ["bundle", "exec", "spring", "server"] ports: [] tty: false stdin_open: false db: image: "mysql:5.6" environment: - "MYSQL_USER=mysql" - "MYSQL_PASSWORD=password" volumes_from: - data data: image: "busybox" volumes: - "db:/var/lib/mysql" - "bundle:/usr/local/bundle" volumes: db: driver: local bundle: driver: local

database.ymlからもportの設定を削除しました
config/database.yml

default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: <%= ENV.fetch('DATABASE_USER') { 'root' } %> password: <%= ENV.fetch('DATABASE_PASSWORD') { 'password' } %> host: <%= ENV.fetch('DATABASE_HOST') { 'localhost' } %> development: <<: *default database: app_development test: <<: *default database: app_test production: <<: *default database: app_production

.env,dev

DATABASE_HOST=db DATABASE_USER=mysql DATABASE_PASSWORD=password

これでも#<Mysql2::Error: Unknown MySQL server host 'db' (25)>が出てしまいます・・・

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

shell

1$ docker logs mysqlのコンテナの名前

としたところ、

  • MYSQL_ROOT_PASSWORD
  • MYSQL_RANDOM_ROOT_PASSWORD
  • MYSQL_ALLOW_EMPTY_PASSWORD

のいづれかが設定されていないとだめと言われたので、設定したところうまく行きました。

投稿2018/03/21 05:37

ryoma510

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

docker-compose depends_onとlinksの違い - Qiita
にあるように、linksやdepends_onを利用してコンテナ間の依存関係を表現してください。

この状態でdocker-compose upコマンドでコンテナを立ち上げた場合、
依存するコンテナ(MySQL等)はRails鯖コンテナより先に立ち上がるようになります。

docker-compose.yml上で表現された依存関係は、
コンテナ内の/etc/hostsファイルに反映されます。
例えばRailsのコンテナに下記の2行を追加すれば、dbというホスト名はdbコンテナのIPアドレスとして解消されるようになります。

dependents_on: - db

ポート番号に関してですが、
コンテナは仮想マシンの中の世界と、外の世界という概念で動作しています。

例えばMySQLが使うポート番号はデフォルトで3306です。
ですが、これをホストマシンにポートフォワードして利用する場合は3306から自由に変更出来ます。

db: image: "mysql:5.6" environment: - "MYSQL_USER=mysql" - "MYSQL_PASSWORD=password" volumes_from: - data ports: - "5432:3306"

左がホストマシンで利用したいポート番号、右がコンテナ内のポート番号です。
まぁ、これを使う場合はホストマシンにMySQLサーバが存在しているかのように振る舞う事になりますので、
Railsコンテナの連携を意識する場合、postsの指定ごと全て削除してしまって、上記のlinksやdependents_onで管理するようにしましょう。

投稿2018/03/18 02:45

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryoma510

2018/03/18 04:12

ありがとうございます。 > 例えばRailsのコンテナに下記の2行を追加すれば、dbというホスト名はdbコンテナのIPアドレスとして解消されるようになります。 すでにしているのですが、エラー( #<Mysql2::Error: Unknown MySQL server host 'db' (25)> )が出てしまいます MySQLのポートの指定は、動かすには問題ないと思っているのですが、どうでしょうか?
miyabi-sun

2018/03/18 04:34

あ、書かれてますね。見落としていました。 では残った2点を解消すれば解決すると思います。 - 5432をホストマシンに接続している為に、dependents_onの設定によりアクセスできなくなっています。dbのposts指定を除外してください。 - MySQLのデフォルトコンテナは3306番を使う設定になっていますが、5432番というのはどこから出てきましたか?
ryoma510

2018/03/18 04:44

ありがとうございます。 > - 5432をホストマシンに接続している為に、dependents_onの設定によりアクセスできなくなっています。dbのposts指定を除外してください。 dbコンテナのports指定を削除して、database.ymlのportを3306番に変更しました。 しかし同じエラーが出てしまいます・・・ > - MySQLのデフォルトコンテナは3306番を使う設定になっていますが、5432番というのはどこから出てきましたか? 参考にした記事 ( https://qiita.com/kawasin73/items/2253523be18e5afd994f )でpostgresqlを使っていた際にこのような指定になっていたため、そのままにしていました。
miyabi-sun

2018/03/18 04:56

ポスグレはデフォルト5432番を利用します。 http://d.hatena.ne.jp/nyanplus/20100910/1284079223 MySQLは特別変更しない限り3306番です。 DockerHubで公開されているmysqlコンテナは3306に接続する前提でビルドされています。 https://github.com/docker-library/mysql/blob/f279c9cc0d20407a2c4d9465adae6b077dcf1b51/5.6/Dockerfile ですので、特別何かしない限り3306に繋げる必要があるわけです。 今回のケースでは5432が誤り、3306番で統一すれば解消されるでしょう。 ホストマシンの3306番が既に潰れている場合は下記のような使い方でポート番号をずらす事はありますが、 このような使いかたが出来る以上、コンテナのポート番号を変更するメリットはありません。 ``` port: - 5000:3306 ```
ryoma510

2018/03/18 05:14

dbコンテナのports指定を削除して、database.ymlのportを3306番に変更しました。 しかし同じエラーが出てしまいます・・・ 他にmiyabi-sun様の考えられる原因ってございますか? なければ、自分でまた何とか原因探してみようと思っています。
miyabi-sun

2018/03/18 05:55

> database.ymlのportを3306番に変更しました。 変更しないで、port宣言ごと取っ払って下さい。 これはホストマシンにフォワーディングさせてしまい、リンクで接続して使えなくなります。 また、Railsなどの設定ファイルは全て3306番を向くように修正してください。
ryoma510

2018/03/18 06:51

docker-compose.ymlからrailsコンテナのportsの宣言を削除しました。 ``` version: '2' services: rails: &app_base build: context: . dockerfile: "Dockerfile.dev" command: ["bundle", "exec", "rails", "s", "-p", "3000", "-b", "0.0.0.0"] env_file: - "./.env.dev" volumes: - ".:/app" volumes_from: - data ports: - "3000:3000" depends_on: - db tty: true stdin_open: true spring: <<: *app_base command: ["bundle", "exec", "spring", "server"] ports: [] tty: false stdin_open: false db: image: "mysql:5.6" environment: - "MYSQL_USER=mysql" - "MYSQL_PASSWORD=password" volumes_from: - data data: image: "busybox" volumes: - "db:/var/lib/mysql" - "bundle:/usr/local/bundle" volumes: db: driver: local bundle: driver: local ``` database.ymlからもportの設定を削除しました config/database.yml ``` default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: <%= ENV.fetch('DATABASE_USER') { 'root' } %> password: <%= ENV.fetch('DATABASE_PASSWORD') { 'password' } %> host: <%= ENV.fetch('DATABASE_HOST') { 'localhost' } %> development: <<: *default database: app_development test: <<: *default database: app_test production: <<: *default database: app_production ``` .env,dev ``` DATABASE_HOST=db DATABASE_USER=mysql DATABASE_PASSWORD=password ``` これでも#<Mysql2::Error: Unknown MySQL server host 'db' (25)>が出てしまいます・・・
miyabi-sun

2018/03/18 12:05

コメント欄はスペースが飛んでスペースが超重要なyamlファイルが悲惨な事になるので、 質問文を追記でお願いします。
ryoma510

2018/03/18 12:23

失礼しました。 質問文に追記したのでお願いします
ryoma510

2018/03/21 05:39

miyabi-sun様 docker logsを使ってlogを調べて自己解決することができました。 ご助言本当に助かりました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問