dockerでmysqlに接続出来ない

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 5,220

xin

score 15

いつもお世話になっております。
dockerでlaravel開発環境を作る練習をしているのですが、エラーが出てしまいググっても解決策を見つけられず、質問させて頂きます。
以下のqiita記事の通りに進めました。

https://qiita.com/RyosukeKamei/items/085b40e4e869e77b0756

開発環境:
mac os High Sierra 10.13.4
docker for mac
nginx + mysql +laravel

記事最後の

docker-compose exec workspace php artisan migrate


の手前まではうまくいったのですが、上記のコマンドを打つと

   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (SQL: select * from information_schema.tables where table_schema = default and table_name = migrations)

  at /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668| 

  Exception trace:

  1   PDOException::("PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known")
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:68

  2   PDO::__construct("mysql:host=mysql;port=3306;dbname=default", "default", "secret", [])
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:68

  Please use the argument -v to see more details.

とエラーが出てしまいました。
どなたかアドバイス頂けると有難いです。

<補足>
具体的なコマンドとエラー

laradockをダウンロード

mkdir my-laravel
cd my-laravel/
git init
git clone https://github.com/Laradock/laradock.git my-laradock
cd my-laradock/
cp env-example .env
vi .env


./mylaradock/.envを編集

### Paths #################################################

# Point to the path of your applications code on your host
APP_CODE_PATH_HOST=../src/   //ここを編集

# Point to where the `APP_CODE_PATH_HOST` should be in the container. You may add flags to the path `:cached`, `:delegated`. When using Docker Sync add `:nocopy`
APP_CODE_PATH_CONTAINER=/var/www:cached

# Choose storage path on your machine. For all storage systems
DATA_PATH_HOST=~/.laradock/data

### Drivers ################################################
 :
省略
 :
 :
### MYSQL #################################################

MYSQL_VERSION=8.0  //ここを編集
MYSQL_DATABASE=dev_db  //ここを編集
MYSQL_USER=dev_user  //ここを編集
MYSQL_PASSWORD=password //ここを編集
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d

### REDIS #################################################
docker-compose up -d nginx mysql
docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                                      NAMES
ac4e31328b53        mylaradock_nginx     "nginx"                  4 minutes ago       Up 5 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   mylaradock_nginx_1
1159ae63b755        mylaradock_php-fpm   "docker-php-entrypoi…"   4 minutes ago       Up 5 minutes        9000/tcp                                   mylaradock_php-fpm_1
c2c27660a2d7        mylaradock_mysql     "docker-entrypoint.s…"   4 minutes ago       Up 5 minutes        0.0.0.0:3306->3306/tcp                     mylaradock_mysql_1


この時点でnginxの404ページが表示されました

workspaceがなかったので個別に起動

docker-compose up -d workspace

docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                      NAMES
00072367f1c6        mylaradock_workspace   "/sbin/my_init"          14 minutes ago      Up 15 minutes       0.0.0.0:2222->22/tcp                       mylaradock_workspace_1
ac4e31328b53        mylaradock_nginx       "nginx"                  25 minutes ago      Up 25 minutes       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   mylaradock_nginx_1
1159ae63b755        mylaradock_php-fpm     "docker-php-entrypoi…"   25 minutes ago      Up 25 minutes       9000/tcp                                   mylaradock_php-fpm_1
c2c27660a2d7        myaradock_mysql       "docker-entrypoint.s…"   25 minutes ago      Up 25 minutes       0.0.0.0:3306->3306/tcp                     mylaradock_mysql_1


Laravelプロジェクトを作成

docker-compose exec workspace composer create-project --prefer-dist laravel/laravel ./
cd ./src
vi .env


laravelのウェルカム画面が表示されました

MySQLの設定を反映
./src/.envを編集

DB_CONNECTION=mysql
DB_HOST=mysql  //ここを編集
DB_PORT=3306
DB_DATABASE=dev_db //ここを編集
DB_USERNAME=dev_user //ここを編集
DB_PASSWORD=password //ここを編集


./src/config/database.phpを編集

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', 'mysql'), //ここを編集
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'dev_db'), //ここを編集
            'username' => env('DB_USERNAME', 'dev_user'), //ここを編集
            'password' => env('DB_PASSWORD', 'password'), //ここを編集
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],


ここで

docker-compose exec workspace php artisan migrate


を実行すると冒頭のエラーが出ました。


------------ 4/26追記 ----------------------------------------------------

maverixzさんにアドバイス頂いた通り、mysqlバージョン8.0で作り直してみました。

前提としてdocker system pruneを実行、全てのコンテナを消してネットワークを初期化しました。
imageはpruneでは消えなかったので念のため全て消去しました。
laradockの.envの設定でmysqlデータがホストのルートに永続化されていたため、このフォルダも消去しました。↓

# Choose storage path on your machine. For all storage systems
DATA_PATH_HOST=~/.laradock/data


1)laradock/.envを編集

### MYSQL #################################################

MYSQL_VERSION=8.0  //defaultから8.0に変更


2)docker-compose up -d nginx mysqlを実行
3)mysqlコンテナが一度はdoneになるがdocker psしても立ち上がっていない
4)以下がmysqlコンテナのlogです

018-04-26T13:18:04.820630700Z 
ERROR: mysqld failed while attempting to check config
command was: "mysqld --verbose --help"
2018-04-26T13:18:04.820716500Z 
2018-04-26T13:18:04.811937Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2018-04-26T13:18:04.812012Z 0 [ERROR] [MY-011071] [Server] /usr/sbin/mysqld: Error while setting value 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' to 'sql_mode'
2018-04-26T13:18:04.813618Z 0 [ERROR] [MY-010119] [Server] Aborting

4)再度docker環境を初期化、今度はlaradock/.envを以下のように編集

### MYSQL #################################################

MYSQL_VERSION=5.7.21  //defaultから5.7.21に変更

5)その後は同じ手順で実行するとmysqlコンテナはUPの状態になりました。

6)今回投稿した内容の通りにphp artisan migrateまで進み、無事マイグレーションできました。

mysqlのバージョンを8.0に変更した理由は、誰かとプロジェクトを共有する際にバージョンが変わるのを避けたかったので、数字で指定したかった
公式

Change the (MySQL) Version#
By default MySQL 8.0 is running.


再度maverixzさんのアドバイス通り、MYSQL_VERSION 8.0.3でトライ
→マイグレーションまで無事完了
----結論----

2018/4/26時点で
MYSQL_VERSION 8.0.3までは正常に動くが、8.0.4では動かない(8.0でプルすると8.0.4になるので同様)

細かい原因糾明まで助けてくださったmaverixzさんをベストアンサーにさせていただきました。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • DaichiYasuda

    2018/04/18 11:00

    docker-compose.ymlファイルを見せてください

    キャンセル

  • xin

    2018/04/18 12:03 編集

    すみません、、docker-compose.ymlの中身が多すぎて文字数を超えてしまいました、、
    ここはデフォルトのままで編集していないです。

    https://github.com/laradock/laradockは参考サイトの記載のある.envは修正しました。
    具体的な作業やdocker psコマンドの結果も追記させて頂きました。
    dockerが初めてで的を得ていないかもしれませんが、、わかりにくい箇所ありましたらご指摘ください。

    キャンセル

  • xenbeat

    2018/04/18 12:16

    「//ここを編集」の部分は編集後ですか編集前ですか?

    キャンセル

回答 5

checkベストアンサー

+2

追記いただいた内容が正だとすると以下でイケるかと思います。

  1. envを修正
MYSQL_VERSION=8.0
↓
MYSQL_VERSION=latest
または
MYSQL_VERSION=8.0.3
  1. ビルド
docker-compose build --no-cache mysql

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/27 00:40 編集

    >「MYSQL_VERSION=8.0.3」で試してみました!
    >マイグレーションまで無事完了しました!

    なるほど、V8.0.4以降のMySQLが悪さをした可能性が高いですね。

    てか、ものすごくタイムリーにISSUEが上がってますね。
    https://github.com/laradock/laradock/issues/1492

    > 8.0でも良いのかなと思ったのですが、8.0や8.0.4では設定できないという事でしょうか
    この世界、必ずしもドキュメントが正とは限らないので、
    ソースコード(今回はlaradoc)をベースに、それが依存しているプロダクト(今回はMySQL)に何か起こってないかというのを総合的に判断しないといけない場合が多々あります。

    前回QAのオライリー本の誤植もそうですが、あくまでも今手元で動いているソースコードやプログラムが正なのです。

    キャンセル

  • 2018/04/27 01:03

    なるほど、、

    >前回QAのオライリー本の誤植もそうですが、あくまでも今手元で動いているソースコードやプログラムが正なのです。
    プログラミングを始めたばかりですが、その点が難しいなあと思う気持ちと面白いなあという気持ちで半々です、、
    総合的に判断出来るよう勉強していきます!

    遅くまで有難うございました!

    キャンセル

  • 2018/04/27 01:15

    調査にご協力いただきありがとうございました!
    お疲れさまでした!

    キャンセル

+1

他の回答者様が指摘されているようにおそらくDB接続設定の問題かと思います。
どうしても解決しないようであれば一度公式ドキュメントの手順で組み直されてみると上手くいくかもしれません。

http://laradock.io/getting-started/

ご質問の回答からはズレますが、LaravelをDockerで組む練習ということでしたらDockerfileとDockerComposeをシンプルに自作するとコントロールしやすいかと思います。
初めてLaradockを見てみましたが初心者の手元の開発環境としてはオーバーエンジニアリングな気がします・・・

私もLaravel on Docker開発環境を自作しています。

https://github.com/dyoshikawa/laravel-devkit

今後、自作検討される機会があるようでしたらご参考になればと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/23 20:29

    お返事が遅くなってしまってすみません、、
    一度コンテナもimageも永続化データも全て消して、やり直すとできました、、
    何が原因だったのかは分からず、、
    ご回答の通り、laradockは高機能ですが初心者が少しカスタマイズしようとすると大変なようですね。
    ご提示頂いた開発環境で勉強してみようと思います!
    有難うございました。

    キャンセル

0

構成が分かりませんが、、、

PDO::__construct("mysql:host=mysql;port=3306;dbname=default", "default", "secret", [])


host=mysqlに接続できてないのではないでしょうか。
DB_HOST=mysqlはコンテナ名を記述しなければならないですが、コンテナ名はmysqlですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/18 12:09 編集

    ご回答有難うございます。
    ./src/.envと./src/config/database.phpを編集してHOSTをmysqlにしたのですが、他に設定しなければならない箇所があるのでしょうか、、?
    docker psしてみると、
    mylaradock_mysql_1
    という名前になっています。

    キャンセル

0

DB_HOSTにmysqlのコンテナのNAME(mylaradock_mysql_1)を指定してみてもだめでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

  2   PDO::__construct("mysql:host=mysql;port=3306;dbname=default", "default", "secret", [])

エラーメッセージの上の部分からは、以下に接続しようとしているように見えます。

データベース: default
ユーザー: default
パスワード: secret

掲載された .env や config/database.php の内容と異なりますので、再度、それらのファイルを確認してみてください。
あと、設定変更後は php artisan config:clear で設定キャッシュのクリアもしてみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/23 20:24

    お返事が遅くなってしまってすみません、、
    mysqlのバージョンを変更してみる、という方法を先にやってみたのですが、mysqlのコンテナが一瞬立ち上がって起動できなくなり、今度はそこから進めなくなってしまいました、、
    最終的に一度コンテナとimageを全て決して、~/.laradockに永続化されていたdbデータも全部消して作り直すとマイグレーションできました、、
    原因分からず申し訳ありません、ご協力有難うございました。

    キャンセル

  • 2018/04/23 20:40

    承知しました。
    おそらく、mysqlコンテナの再ビルドを行なっていなかったか、Laravelの設定キャッシュが悪さをしていたか、のどちらかではないかと思いました。
    ご報告のコメントありがとうございました。

    キャンセル

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

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