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

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

ただいまの
回答率

87.58%

Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (0)の解決方法について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,389

score 19

docker+Mysql+railsにてrials db:migrateを実行するもMysql2::Error::ConnectionError:Unknown MySQL server host 'db' (0)となりポートフォリオ制作が進まない状態です。(Rspecも動作しません)
いつも通りネットから情報を仕入れて解決しようとするも良い情報にヒットせず、ここ何日間か解決できずにいます。
(サーバーは立ち上がるが、Mysqlとの接続がうまくいっていないと思われます)

FROM ruby:2.6.3

# リポジトリを更新し依存モジュールをインストール
RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       nodejs

# ルート直下にmy_appという名前で作業ディレクトリを作成(コンテナ内のアプリケーションディレクトリ)
RUN mkdir /my_app
WORKDIR /my_app

# ホストのGemfileとGemfile.lockをコンテナにコピー
ADD Gemfile /my_app/Gemfile
ADD Gemfile.lock /my_app/Gemfile.lock

# bundle installの実行
RUN bundle install

# ホストのアプリケーションディレクトリ内をすべてコンテナにコピー
ADD . /my_app

# puma.sockを配置するディレクトリを作成
RUN mkdir -p tmp/sockets
version: '3'
services:
  app:
    build:
      context: .
    env_file:
      - ./environments/db.env
    command: bundle exec puma -C config/puma.rb
    volumes:
      - .:/my_app
      - public-data:/my_app/public
      - tmp-data:/my_app/tmp
      - log-data:/my_app/log
    depends_on:
      - db
    tty: true
  db:
    image: mysql:5.7
    env_file:
      - ./environments/db.env
    volumes:
      - db-data:/var/lib/mysql
    ports:
      - "3306:3306"
    tty: true
  web:
    build:
      context: containers/nginx
    volumes:
      - public-data:/my_app/public
      - tmp-data:/my_app/tmp
    ports:
      - "3000:80"
    depends_on:
      - app
volumes:
  public-data:
  tmp-data:
  log-data:
  db-data:
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch('MYSQL_USER') { 'root' } %>
  password: <%= ENV.fetch('MYSQL_ROOT_PASSWORD') { 'db_root_password' } %>
  host: <%= ENV.fetch('DATABASE_HOST') { 'db' } %>
  port: <%= ENV.fetch('DATABASE_PORT') { 3306 } %>

development:
  <<: *default
  database: my_app_development

test:
  <<: *default
  database: my_app_test
MYSQL_ROOT_PASSWORD=db_root_password
MYSQL_USER=root
MYSQL_PASSWORD=password
DATABASE_HOST=db

docker-compose ps
my_app_app_1   bundle exec puma -C config ...   Up                                       
my_app_db_1    docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp, 33060/tcp
my_app_web_1   /bin/sh -c /usr/sbin/nginx ...   Up      0.0.0.0:3000->80/tcp   

なお、独学者かつ駆け足で環境構築したこともあり、基本的な知識が欠如しております。
根本的に間違っている場合は、それを教えて頂くだけでも構いません。
また、実際にMysqlよりpostgresqlの方が扱いやすかったりするのでしょうか?
二重の質問になってしまい申し訳ありませんが、どうかご教示ください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

追記

次の記事を参照している前提で回答します
Docker + Rails + Puma + Nginx + MySQL - Qiita

MYSQL_USER には root 以外を設定

MYSQL_USER には root を設定することはできません:

db_1   | 2020-08-14 09:42:31+00:00 [Note] [Entrypoint]: Creating user root
db_1   | ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'root'@'%'
db_1   |
test-docker-compose_db_1 exited with code 1

root でも良いですが、データベースの標準的な利用法に則って
アプリケーションがアクセスするための一般ユーザーを作成しましょう:

MYSQL_ROOT_PASSWORD=db_root_password
MYSQL_USER=app
MYSQL_PASSWORD=password
DATABASE_HOST=db

database.yml は password を MYSQL_ROOT_PASSWORD から MYSQL_PASSWORD に変更します:

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch('MYSQL_USER') { 'root' } %>
  password: <%= ENV.fetch('MYSQL_PASSWORD') { 'db_root_password' } %>
  host: <%= ENV.fetch('DATABASE_HOST') { 'db' } %>
  port: <%= ENV.fetch('DATABASE_PORT') { 3306 } %>

nginx.conf のディレクトリー設定

ディレクトリーを記事の設定から変更されているので、
次の 2 箇所の変更も必要になります:

  # ソケット通信したいのでpuma.sockを指定
-  server unix:///webapp/tmp/sockets/puma.sock;
+  server unix:///my_app/tmp/sockets/puma.sock;

  # ドキュメントルートの指定
-  root /webapp/public;
+  root /my_app/public;

データベースの作成

記事ではコマンドで作成する手順となっています:

DBの作成 | Docker + Rails + Puma + Nginx + MySQL - Qiita

$ docker-compose exec app rails db:create

しかし、これは MySQL 公式イメージの正しい使い方ではありません
MySQL 公式イメージでは環境変数 MYSQL_DATABASE でデータベース名を指定することで
コンテナー起動時に自動的にデータベースを作成します:

MYSQL_ROOT_PASSWORD=db_root_password
MYSQL_USER=app
MYSQL_PASSWORD=password
DATABASE_HOST=db
MYSQL_DATABASE=my_app_development

参考: mysql - Docker Hub

元の回答

ぱっと見問題なさそうに見えますね
次の点について確認してみるとどうでしょうか?

1
docker-compose ps を実行したとき、 my_app_db_1 は exit していませんか?

2
docker-compose logs を実行すると、特に my_app_db_1 について、どのようなログが表示されますか?db.env

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/18 00:01 編集

    viewにおいては、Access denied for user 'app'@'%' to database 'my_app_development'

    bin/rspecとrails db:migrateにおいては、
    Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (0)
    です。
    申し訳ありません、もう一度現在のコードをgithubに載せて確認して頂くことは可能でしょうか?
    色々とコードをいじってしまったこともあり、何がなんだか、、、、

    キャンセル

  • 2020/08/18 00:56

    それをやってしまうと永遠に終わらなくなってしまうので、
    PR をマージした直後に戻って動作確認を行って、一旦こちらの質問は解決した後、
    変更後の動作確認については新たに質問を立て直してください

    新たに質問を投稿すると次のようなメリットがあります:

    - 質問者も回答者も新たにポイントを取得できます
    - すべての回答者が質問を確認し、回答が得られる確率が上がります
    - 検索でこの質問にたどり着いた人が質問のタイトルに対するシンプルな回答を得ることができ、質問に高評価が得られやすくなります
    次のコマンドでマージ直後の状態を確認できます:

    git branch after-merge d864baf36232b95d0fb3e4cd143229d3fd2923c2
    git checkout after-merge

    キャンセル

  • 2020/08/18 23:57

    マージ直後の状態を確認した結果、やはりエラーが変わりませんでした。
    y_shinodaさんのおっしゃる通り新たに質問を立て直したいと思います。
    dockerに対する知識やgitのコミットの作法など勉強になることがたくさんありました。ど素人に分かりやすく簡潔に教えてくださり、大変ありがとうございます。

    キャンセル

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

  • ただいまの回答率 87.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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