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

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

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

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

Docker

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

Q&A

1回答

1365閲覧

【Docker】Unknown MySQL server host 'db' (-2)を解消したいです

Unimaru

総合スコア4

docker-compose

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

Docker

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

0グッド

0クリップ

投稿2021/09/19 11:13

編集2021/09/21 12:24

■ 実現したいことは以下の通りです。
①ローカルでDocker-compose.ymlにてアプリ用コンテナ(Rails)とデータベース用コンテナ(MySQL)を作成
②作成したアプリ用コンテナとデータベース用コンテナからDockerイメージを作成 (docker commitコマンド使用)
③作成したアプリ用コンテナイメージとデータベース用コンテナイメージを第三者に公開
④第三者がアプリ用コンテナイメージとデータベース用コンテナイメージから各々、コンテナを起動

■前提
Mac Catalina(10.15.4)
Rails:6.0.3
Ruby:2.6.5
MySQl:5.6

発生している問題・エラーメッセージ

上の手順において、④で配布したイメージからアプリ用コンテナ、データベース用コンテナを起動しましたが、
ブラウザで「localhost:3000」接続した時に、以下エラーが表示されます。railsとdbの接続がうまくいっていない模様。

Mysql2::Error::ConnectionError Unknown MySQL server host 'db' (-2) Extracted source (around line #90): 88 89 90 91 92 93 conn_attrs = parse_connect_attrs(opts[:connect_attrs]) connect user, pass, host, port, database, socket, flags, conn_attrs end def parse_ssl_mode(mode)

①で使用したDockerComposeファイル

version: "2" services: db: #データベース用コンテナの定義 image: mysql:5.6 #ベースとなるバージョン5,6のmysqlイメージを公式リポジトリより取得 command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci #文字コードの設定 environment: MYSQL_ROOT_PASSWORD: xxxxxxx #データベースユーザ「root」のパスワード MYSQL_DATABASE: memory_tank_development #データベース名 volumes: - mysql-data:/var/lib/mysql #名前付きボリュームでデータを永続化 ※ Dockerの管理下にデータを保管 ports: - "4306:3306" #ポート設定 app: #アプリ用コンテナの定義 tty: true #コンテナ上でbinding.pryするために必要 stdin_open: true #コンテナ上でbinding.pryするために必要 build: . #DockerFileを素にコンテナイメージを作成 command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" #railsの起動 volumes: - .:/memory_tank #ローカルのディレクトリをコンテナにマウント - bundle:/usr/local/bundle #bundle installした後buildし直さなくてよくなる ports: - "3000:3000" #ポート設定 depends_on: #作成順序の設定 「db」→「app」 - db volumes: mysql-data: #名前付きボリューム bundle: #bundle installした後buildし直さなくてよくなる

①で使用したDockerファイル

#アプリ用コンテナの素 #以下、「memory_tank」の部分は適宜、自分のアプリ名にする #ベースとなるバージョン2.6.5のrubyイメージを公式リポジトリより取得 FROM ruby:2.6.5 #コンテナ内のパッケージ管理を最新状態にする #前提ソフトウェア(nodejs、mysql)や保守用にvimをインストール。「--no-install-recommends」オプションを付け、recommendされた不要なソフトウェアはインストールしない #イメージ軽量化のためにapt-getリストをクリア RUN apt-get update && \ apt-get install -y nodejs default-mysql-client vim --no-install-recommends && \ rm -rf /var/lib/apt/lists/* #アプリ用ディレクトリの作成 RUN mkdir /memory_tank #ワークディレクトリを設定 WORKDIR /memory_tank #ローカルのGemfileをアプリ用コンテナにコピーする ADD Gemfile /memory_tank/Gemfile ADD Gemfile.lock /memory_tank/Gemfile.lock #アプリ用コンテナにgemをインストール RUN gem install bundler RUN bundle install #ローカルのアプリファイルをまるっとアプリ用コンテナにコピー ADD . /memory_tank

ローカルのrailsアプリにおける「database.yml」ファイル

default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: xxxxxxx host: db  ←docker-compose.ymlの記載と合わせる development: <<: *default database: memory_tank_development test: <<: *default database: memory_tank_test production: <<: *default database: memory_tank_production username: memory_tank password: <%= ENV['MEMORY_TANK_DATABASE_PASSWORD'] %>

④にてきちんとコンテナ自体は起動できています

docker run -d --network test-network -p 3000:3000 (②で作成したイメージのID) ←アプリコンテナの起動 docker run -d --network test-network -p 4306:3300 (②で作成したイメージのID) ←データベース用コンテナの起動 name@nameMacBook-Pro ~ % docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 12e7c17671af 7f34804a3d43 "docker-entrypoint.s…" 11 seconds ago Up 7 seconds 0.0.0.0:4306->3306/tcp, :::4306->3306/tcp kind_kapitsa a390537ec8e3 b1a36b20edc6 "/bin/sh -c 'rm -f t…" About a minute ago Up About a minute 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp goofy_gagarin 022d3a5f2721 b1a36b20edc6 "/bin/sh -c 'rm -f t…" 2 minutes ago Created admiring_euler

最後に

Docker学習仕立てで理解が不十分なところもありますが、アドバイス等頂けますと幸いです。

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

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

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

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

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

guest

回答1

0

コンテナを docker runで起動してるからではないかと思います

docker-compose.ymlのあるディレクトリ上で
$ docker-compose up -d
でコンテナを起動したらおそらく dbでデータベースへ疎通するのではないでしょうか

投稿2021/09/24 06:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問