はじめに
業務でLaravelの開発環境をdocker-composeで構築することがありました。
しかし詳しいことは全く知らなかったので、自分で1から作ってみようと思います。
環境はWEB(nginx)、PHP、DB(MySQL)サーバーの構成となります。
今回は目次の6についてです。
1、2に関してはこちら、3、4、5についてはこちらをご覧ください。
目次
1. docker-compose.ymlについて
2. 必要なディレクトリ、ファイルの準備
3. nginxコンテナの作成
4. PHPコンテナの作成
5. Laravelプロジェクトの作成
6. MySQLコンテナの作成 → 今回はここ
MySQLコンテナの作成
それでは、MySQLコンテナの作成をしていきます。
前回作成したdbディレクトリ配下にある、Dockerfileとmy.confに書き込みを行い、それに伴いdocker-compose.ymlにもコンテナについて定義していきます。
laravel
└── docker
├── docker-compose.yml --> 書き込み
├── web
│ ├── Dockerfile
│ └── default.conf
└── php
│ ├── Dockerfile
│ ├── php.ini
└── db
├── Dockerfile --> 書き込み
└── my.conf --> 書き込み
1. MySqlの設定ファイルmy.confの作成
文字コードの設定を定義します。
# 文字コードの指定
[mysqld]
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
2. Dockerfileの作成
コンテナ作成に必要なDockerfileを作成します。
# ベースイメージの指定
FROM mysql:8.0
# 作成した設定ファイルをmysqlコンテナの設定ファイルにコピー
COPY ./db/my.conf /etc/my.conf
3. docker-compose.ymlの作成
上で作成したファイルを元にdocker-compose.ymlにMySQLコンテナを定義します。
# docker-composeのバージョン
version: "3"
# コンテナの定義
services:
# nginxコンテナ
web:
### 省略 ###
# PHPコンテナ
php:
### 省略 ###
# DBコンテナ
db:
# コンテナ名
container_name: "db"
# コンテナ作成に使用するDockerfileのパス
build:
dockerfile: "./db/Dockerfile"
# ホストとコンテナのポート番号の対応付け
ports:
- "3306:3306"
# 環境変数の指定
environment:
- "MYSQL_ROOT_PASSWORD=password"
- "MYSQL_DATABASE=database"
- "MYSQL_USER=laravel"
- "MYSQL_PASSWORD=password"
# volumeをバインド
volumes:
- "./db/data:/var/lib/mysql"
以上でDBコンテナを起動する準備ができました。
コマンドで起動をして、正常に起動したのを確認します。
$ docker compose up -d --build
[+] Running 4/4
⠿ Network docker_default Created
⠿ Container web Started
⠿ Container php Started
⠿ Container db Started
これでDBコンテナ作成が完了しました。
ではLaravelプロジェクトからDatabaseに接続できるよう設定してみましょう。
接続確認
先ほどdocker-compose.ymlで指定した環境変数を、Laravelプロジェクト内のenvファイルにも設定します。
# 省略
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=laravel
DB_PASSWORD=password
# 省略
設定したら再度コンテナを立ち上げて、PHPコンテナでマイグレーションを行います。
$ docker compose up -d --build
$ docker compose exec php bash
$ php artisan migrate
INFO Preparing database.
Creating migration table ................................... 129ms DONE
INFO Running migrations.
2014_10_12_000000_create_users_table ....................... 145ms DONE
2014_10_12_100000_create_password_reset_tokens_table ....... 161ms DONE
2019_08_19_000000_create_failed_jobs_table ................. 156ms DONE
2019_12_14_000001_create_personal_access_tokens_table ...... 209ms DONE
正常に接続ができ、マイグレーションできました。
SQLクライアントからも確認してみましょう。(ここではdbeaverを使って接続してみます。)
① 新しい接続を作成するボタンをクリックします。
② 今回作成したDBと同じMySQLを選択します。
③ 次へボタンをクリックします。

④ Database、ユーザー名、パスワードにそれぞれdocker-compose.ymlで指定した環境変数(Laravelプロジェクト内のenvファイルに設定した値)を入力します。
⑤ テスト接続ボタンをクリックします。

【補足】
④の工程でServer Hostにはlocalhostと記載しました。
他の項目と同じようにdocker-compose.ymlで指定した環境変数を記載しなかったのは、
3.docker-compose.ymlの作成でポートの対応付け(ポートフォワーディング)をしているためです。
# ホストとコンテナのポート番号の対応付け
ports:
- "3306:3306"
このようにdocker-compose.ymlに設定することで、ホストのポート番号3306に接続するとコンテナのポート番号3306に接続されます。
つまりSQLクライアントでホストをLocalhost、ポートを3306で指定すれば、コンテナに接続されるということです。
⑥ 無事に接続できたことが確認できました。OKボタンでダイアログを閉じます。

⑦ テーブルリストにも先ほどマイグレーションしたテーブルが確認できました。

まとめ
今回はMySQLのコンテナ作成と接続確認を行いました!
これでdocker-composeでnginx、PHP、MySQL3つのコンテナを作成して、Laravelの開発環境を構築することができました。
今回は基本的な設定のみで環境構築を行いました。
まだまだdocker-composeでできることはたくさんあると思うので、一つずつ勉強していきたいと思います!
参考