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

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

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

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

MySQL

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

Ruby on Rails

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

Docker

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

Q&A

解決済

1回答

9602閲覧

dockerでのエラー Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) を解決

kimkim0814

総合スコア4

docker-compose

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

MySQL

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

Ruby on Rails

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

Docker

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

0グッド

1クリップ

投稿2020/08/10 14:40

編集2020/08/10 15:58

前提・実現したいこと

環境
Ruby 2.7.1
Ruby on Rails 5.2.4.3
MySQL 5.6.47
AWS (S3のみ使用)

 
railsのアプリケーションにdockerを導入する際,

docker-compose up

にて
サーバーを立てようとしたが上記のエラーがおきてしまい

docker-compose run web rails db:create

のコマンドもCan't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 
と帰ってくる。
### 行ったこと
1.全てのコンテナを立ち下げ再びビルドを行った。
2.mysqlに繋がら可能性があると判断したので、mysql -u root コマンドにてmysqlに接続できるから確認しました。問題なくmysqlに接続する事はできました。
3

socket: /var/run/mysqld/mysqld.sock

上記をdatabe.ymlに記入したが治らなかった

ソースコード

database.yml

default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: development: <<: *default database: food-pictures_development test: <<: *default database: food-pictures_test production: <<: *default database: food-pictures_production username: food-pictures password: <%= ENV['FOOD-PICTURES_DATABASE_PASSWORD'] %>

Dockerfile

1FROM ruby:2.7.1 2 3 4RUN apt-get update -qq && \ 5 apt-get install -y build-essential \ 6 libpq-dev \ 7 nodejs 8 9 10RUN mkdir /food-pictures 11 12ENV APP_ROOT /food-pictures 13WORKDIR $APP_ROOT 14 15 16ADD ./Gemfile $APP_ROOT/Gemfile 17ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock 18 19 20RUN bundle install 21ADD . $APP_ROOT

docker-compose.yml

version: '3' services: db: image: mysql:5.6 environment: MYSQL_DATABASE: root MYSQL_ROOT_PASSWORD: ports: - "3306:3306" volumes: - ./tmp/db:/var/lib/mysql/data web: build: . command: rails s -p 3000 -b '0.0.0.0' volumes: - .:/food-pictures ports: - "3000:3000" links: - db

### 参考サイト
https://qiita.com/azul915/items/5b7063cbc80192343fc0

追記

database.yml
にて host: dbを記述したところ
Unknown MySQL server host 'db' (-2)
といったエラーが出た。

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

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

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

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

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

guest

回答1

0

ベストアンサー

database.ymlhost の設定が抜けています:

yaml

1default: &default 2 adapter: mysql2 3 encoding: utf8 4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 5 username: root 6 password: 7 host: db

参考:
Connect the database | Quickstart: Compose and Rails | Docker Documentation
Rails アプリケーションのデータベース接続設定を db サービスに接続できるように変更 | Docker 公式ドキュメントの Rails Quickstart 完全解説 - Qiita

サービス名を localhost にした場合に通信できない理由

ちなみに、最初の質問時に db のサービス名を localhost にしていたのを見て
興味があったので調べてみましたが、
その場合も web のコンテナー自身へのアクセスになってしまいます:

console

1$ docker-compose run --rm web bash 2Creating network "test-docker_default" with the default driver 3Creating test-docker_localhost_1 ... done 4root@b0d74fe61d07:/food-pictures# ping localhost 5PING localhost (127.0.0.1) 56(84) bytes of data. 664 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.038 ms 764 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.046 ms 864 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.046 ms 964 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.036 ms 10^C 11--- localhost ping statistics --- 124 packets transmitted, 4 received, 0% packet loss, time 106ms 13rtt min/avg/max/mdev = 0.036/0.041/0.046/0.007 ms

Docker Compose のサービス同士の通信は
Docker が別途起動する DNS サービスに各サービス名が登録されることによって行われます

しかし、それよりも各コンテナーのローカルに存在する
/etc/hostslocalhost エントリーが 127.0.0.1 を指している設定が優先されるため
サービス名 localhost への通信は自分自身への通信となってしまうようです

投稿2020/08/10 15:34

編集2020/08/10 15:43
y_shinoda

総合スコア3272

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

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

kimkim0814

2020/08/10 15:53 編集

解答ありがとうございます???? ``` default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: host: db ``` の記述をしたところ Unknown MySQL server host 'db' (-2) と別のエラーが起きてしまいました。 先ほどの記述のlocalhostの記述した場合は上記の理由でエラーが起こっていたんですね、ご教授ありがとうございます。
y_shinoda

2020/08/10 15:55

db サービスがダウンしていることが原因と思われます 一度 docker-compose down -v でコンテナーをクリアして、 docker-compose up でコンテナーを起動し、 別にもう一つターミナルを起動して docker-compose run web rails db:create を実行してみてください 上記は、回答欄の参考リンクの 「Connect the database」の手順の内容です
kimkim0814

2020/08/10 16:11 編集

細かく参考記事までありがとうございます。 shinoda様の手順も一度試してみた際、同様のエラーがまた起きてしまい docker-compose run web rails db:createを記述した際 ターミナル 上にて ``` /usr/local/bundle/gems/actionpack-5.2.4.3/lib/action_dispatch/middleware/stack.rb:37: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call /usr/local/bundle/gems/actionpack-5.2.4.3/lib/action_dispatch/middleware/static.rb:111: warning: The called method `initialize' is defined here Unknown MySQL server host 'db' (-2) Couldn't create 'food-pictures_development' database. Please check your configuration. rails aborted! Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2) /usr/local/bundle/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `connect' /usr/local/bundle/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `initialize' ``` といった形でerrorが解決いたしませんでした。
y_shinoda

2020/08/10 16:16

docker-compose up を実行したターミナルのログで db_1 が exit していませんか? もし exit していたら、すぐ上に原因が表示されていると思います 質問欄の docker-compose.yml と database.yml のパスワード設定が 隠されているのでなく、空欄であれば、 db サービスは、それが原因で exit していると思います その場合は docker-compose.yml と database.yml にパスワードを設定すれば接続できます
kimkim0814

2020/08/10 16:41

最初の段階でパスワードを両方とも空欄であれば、それはそれで大丈夫と考えていましたがshinoda様が建てた仮説通りでした。 丸1日ここのエラーにはまっていたので本当に助かりました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問