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

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

新規登録して質問してみよう
ただいま回答率
85.47%
MySQL

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Docker

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

Q&A

解決済

1回答

2399閲覧

Docker環境構築 MySQL繋がらない

jona3

総合スコア5

MySQL

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Docker

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

0グッド

0クリップ

投稿2020/02/01 09:49

前提・実現したいこと

初めての質問になります。質問するにあたり記載事項が不足していたらご指摘ください。
Dockerを使ってLaravelの環境構築をしています。

MySQLとの接続がうまくいかず、⬇︎のコマンドを入力すると
$ docker-compose exec app php artisan migrate
以下のエラーが発生します。

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

Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = hachinohe and table_name = migrations and table_type = 'BASE TABLE')

該当のソースコード

docker-compose.yml

version: "3" services: app: build: context: ./docker/php args: - TZ=${TZ:-Asia/Tokyo} ports: - ${APP_PORT:-18000}:8000 volumes: - ${PROJECT_PATH:-./src}:/work - ./docker/ash:/etc/profile.d - ./docker/php/psysh:/root/.config/psysh - ./logs:/var/log/php - ./docker/php/php.ini:/usr/local/etc/php/php.ini working_dir: /work environment: - DB_CONNECTION=mysql - DB_HOST=db - DB_DATABASE=${DB_NAME:-homestead} - DB_USERNAME=${DB_USER:-homestead} - DB_PASSWORD=${DB_PASS:-secret} - TZ=${TZ:-Asia/Tokyo} - MAIL_HOST=${MAIL_HOST:-mail} - MAIL_PORT=${MAIL_PORT:-1025} - CACHE_DRIVER=redis - SESSION_DRIVER=redis - QUEUE_DRIVER=redis - REDIS_HOST=redis web: image: nginx:1.17-alpine depends_on: - app ports: - ${WEB_PORT:-10080}:80 volumes: - ${PROJECT_PATH:-./src}:/work - ./logs:/var/log/nginx - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf environment: - TZ=${TZ:-Asia/Tokyo} db: image: mysql:8.0 volumes: - db-store:/var/lib/mysql - ./logs:/var/log/mysql - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf environment: - MYSQL_DATABASE=${DB_NAME:-homestead} - MYSQL_USER=${DB_USER:-homestead} - MYSQL_PASSWORD=${DB_PASS:-secret} - MYSQL_ROOT_PASSWORD=${DB_PASS:-secret} - TZ=${TZ:-Asia/Tokyo} ports: - ${DB_PORT:-13306}:3306 db-testing: image: mysql:8.0 volumes: - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf tmpfs: - /var/lib/mysql - /var/log/mysql environment: - MYSQL_DATABASE=${DB_NAME:-homestead} - MYSQL_USER=${DB_USER:-homestead} - MYSQL_PASSWORD=${DB_PASS:-secret} - MYSQL_ROOT_PASSWORD=${DB_PASS:-secret} - TZ=${TZ:-Asia/Tokyo} ports: - ${DB_TESTING_PORT:-13307}:3306 node: image: node:12.14-alpine tty: true volumes: - ${PROJECT_PATH:-./src}:/work working_dir: /work redis: image: redis:5.0-alpine volumes: - redis-store:/data mail: image: mailhog/mailhog ports: - ${MAILHOG_PORT:-18025}:8025 volumes: db-store: redis-store:

.env(laravel側)

APP_NAME=Laravel APP_ENV=local APP_KEY=base64:gmN/TKWH9K55J63tTwyfCxUj5IyJ0fuMD5FQuyMW5KE= APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack DB_CONNECTION=mysql DB_HOST=db DB_PORT=3307 DB_DATABASE=hachinohe DB_USERNAME=hachinohe DB_PASSWORD=hachinohe BROADCAST_DRIVER=log CACHE_DRIVER=file QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=null MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

.env(docker側)

#COMPOSE_PROJECT_NAME=myproject PROJECT_PATH=./src TZ=Asia/Tokyo WEB_PORT=10070 APP_PORT=18000 DB_PORT=3307 DB_TESTING_PORT=13307 DB_NAME=hachinohe DB_USER=hachinohe DB_PASS=hachinohe MAILHOG_PORT=18025 MAIL_HOST=mail MAIL_PORT=1025

試したこと

調べてみたところ.envファイルのDB_HOSTの値が怪しいと思い、DB_HOST=に
db、hachinohe_db、mysql等の値を入れてマイグレーションを実行しましたが、うまくいきません。

dockerに詳しい方、お助けください。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ちなみにこの設定であればappコンテナに入れるDB_HOSTはdbで大丈夫です。
接続が確立できないのはenvのポート番号が間違ってるからではないでしょうか。3307ではなく3306に変えてみたら動くと思います。

投稿2020/02/01 13:17

inductor

総合スコア428

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

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

jona3

2020/02/01 14:55

ご回答ありがとうございます。今回ご指摘いただいたポート番号は、どちらの.envファイルでしょうか?Laravel用、docker用どちらも3306に変更してみましたがうまくいきません… ちなみに3307と設定したのはMAMPとポート番号が被るためです。
inductor

2020/02/02 02:20

このへんはDockerのネットワークに関わる話なので少し深めに説明します。 Dockerにはnetworkという要素があって、docker create networkというコマンドを実行することでDocker内で使える任意のネットワークを作成することができます。また、コンテナを立ち上げる時にそのネットワークを指定することで特定のネットワーク空間をコンテナ間で共有できます。 今回、Docker Composeの設定ではネットワークを指定していませんので、デフォルトのDocker用ネットワークに接続されます。このネットワークはブリッジという構成になっていて、「つながっているすべてのコンテナ間の通信を内部ネットワークで許可する」というような意味を持ちます。 コンテナ間でネットワークをまたいだ通信をする場合、その通信には内部ネットワークを使います。このとき使われるポートはコンテナが直接持つポートなので、例えばMySQLで仮に 13306:3306 や 3307:3306 というようなポート開放を設定していたとしても、phpで実際に接続する時に使うべきなのは db:3306 (Docker内DNSによって解決される名前と、Dockerネットワーク内で使われるポートの組み合わせ) です。 MySQLのポートをわざわざ開放する意味はアプリケーションを動かす上では必要ないのですが、手元のMacやLinuxマシンなどからSequel ProのようなSQLクライアントを使ってデータを閲覧したい場合などがある時に設定を入れる場合があります。 MAMPの場合、MySQLはローカルにインストールされるため、ポートはローカルのポートを直接使用します。 一方で、Docker上でMySQLコンテナを立ち上げ、それをDockerで立ち上げたPHPコンテナで使いたい場合、先程も書いたようにDocker内のネットワークを使うため、内部でポートを変更する必要はないです。 Docker Composeで設定するホスト側のポート番号や、そこで参照される手元のマシンの環境変数(DB_PORT)は変えても問題有りませんが、コンテナ内で参照される.envのポートとホストはdb:3306になるように設定する必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問