はじめに
この記事では、Docker Compose を使った App / DB / Mail コンテナの開発環境の構築手順について記載します。
以下の記事では、 Docker Compose を使わずに構築する手順を記載しています。
また、構築する開発環境の要件や各種リソース情報もこちらの記事に記載があります。
開発環境
開発環境は以下の通りです。
- Windows 11
- Docker Engine 26.1.1
- Docker Compose 2
- PHP 8.3
- MySQL 8.4.0
- Mailpit 1.18
compose.yaml を作成する
ファイルを作成する
まずはプロジェクト直下に compose.yaml
を作成します。
├─compose.yaml
├─docker
│ ├─app
│ ├─db
│ └─mail
└─src
サービスを定義する
Docker Compose では、コンテナ1つずつをサービスとして扱います。
まず services
というプロパティを定義します。その下に3つのコンテナ分のサービスを定義します。
services:
app:
db:
mail:
この先、次はボリュームを定義しますが、それ以降は今回定義した3つのサービスの先に docker container run
のオプションを定義していきます。
ネットワークの定義は不要です。デフォルトで Docker Compose はコンテナ起動時にブリッジネットワークを作成し、全てのコンテナを作成したネットワークに接続します。コンテナはサービス名で相互に通信できます。
docker container run
で利用していた以下のオプションの追加は不要です。
-
--name
: サービス名で代替できるため -
--rm
:docker compose down
でコンテナを停止すると、自動で削除されるため -
--detach
:compose.yaml
で利用できないため(docker compose up
のオプションで利用する) -
--network
: 前述の通りデフォルトでネットワークに接続されるため
ボリュームの定義
オプションを追加する前にボリュームを定義しておきます。
services:
app:
db:
mail:
volumes:
db-compose-volume:
mail-compose-volume:
環境変数
db
と mail
に環境変数を定義します。
services:
app:
db:
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_USER=app
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=sample
- TZ=Asia/Tokyo
mail:
environment:
- TZ=Asia/Tokyo
- MP_DATABASE=/data/mailpit.db
volumes:
db-compose-volume:
mail-compose-volume:
ポートの公開
services:
app:
ports:
- "8000:8000"
db:
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_USER=app
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=sample
- TZ=Asia/Tokyo
ports:
- "3306:3306"
mail:
environment:
- TZ=Asia/Tokyo
- MP_DATABASE=/data/mailpit.db
ports:
- "8025:8025"
volumes:
db-compose-volume:
mail-compose-volume:
ボリュームのマウント
db
と mail
にボリュームのマウントを定義します。
services:
app:
ports:
- "8000:8000"
db:
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_USER=app
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=sample
- TZ=Asia/Tokyo
ports:
- "3306:3306"
volumes:
- type: volume
source: db-compose-volume
target: /var/lib/mysql
mail:
environment:
- TZ=Asia/Tokyo
- MP_DATABASE=/data/mailpit.db
ports:
- "8025:8025"
volumes:
- type: volume
source: mail-compose-volume
target: /data
volumes:
db-compose-volume:
mail-compose-volume:
バインドマウント
app
と db
にバインドマウントを定義します。
services:
app:
ports:
- "8000:8000"
volumes:
- type: bind
source: ./src
target: /my-work
db:
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_USER=app
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=sample
- TZ=Asia/Tokyo
ports:
- "3306:3306"
volumes:
- type: volume
source: db-compose-volume
target: /var/lib/mysql
- type: bind
source: ./docker/db/init
target: /docker-entrypoint-initdb.d
mail:
environment:
- TZ=Asia/Tokyo
- MP_DATABASE=/data/mailpit.db
ports:
- "8025:8025"
volumes:
- type: volume
source: mail-compose-volume
target: /data
volumes:
db-compose-volume:
mail-compose-volume:
相対パスは .
で書き始めます。
利用イメージ
db
と mail
に利用イメージを定義します。
services:
app:
ports:
- "8000:8000"
volumes:
- type: bind
source: ./src
target: /my-work
db:
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_USER=app
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=sample
- TZ=Asia/Tokyo
ports:
- "3306:3306"
volumes:
- type: volume
source: db-compose-volume
target: /var/lib/mysql
- type: bind
source: ./docker/db/init
target: /docker-entrypoint-initdb.d
image: mysql:8.4.0
mail:
environment:
- TZ=Asia/Tokyo
- MP_DATABASE=/data/mailpit.db
ports:
- "8025:8025"
volumes:
- type: volume
source: mail-compose-volume
target: /data
image: axllent/mailpit:v1.18
volumes:
db-compose-volume:
mail-compose-volume:
イメージビルド
app
はベースイメージをそのまま使わず Dockerfile からイメージをビルドします。
そのため、build
プロパティの値に Dockerfile のパスを渡し、イメージビルドを定義します。
services:
app:
ports:
- "8000:8000"
volumes:
- type: bind
source: ./src
target: /my-work
build: ./docker/app
db:
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_USER=app
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=sample
- TZ=Asia/Tokyo
ports:
- "3306:3306"
volumes:
- type: volume
source: db-compose-volume
target: /var/lib/mysql
- type: bind
source: ./docker/db/init
target: /docker-entrypoint-initdb.d
image: mysql:8.4.0
mail:
environment:
- TZ=Asia/Tokyo
- MP_DATABASE=/data/mailpit.db
ports:
- "8025:8025"
volumes:
- type: volume
source: mail-compose-volume
target: /data
image: axllent/mailpit:v1.18
volumes:
db-compose-volume:
mail-compose-volume:
これで compose.yaml
は完成です。
Docker Compose の操作
compose.yaml
が完成したので、Docker Compose のコマンドを利用して、コンテナの動作を確認します。
コンテナの作成と起動 docker compose up
docker compose up --detach --build
-
--detach
: バックグラウンドで実行 -
--build
: コンテナを起動する前にイメージをビルド
ブラウザで動作確認をします。
App コンテナ( http://localhost:8000/ )にアクセスすると、以下の画面が表示されます。
ユーザー一覧と各ユーザーにメールを送信したことが確認できます。
Mail コンテナ( http://localhost:8025/ )にアクセスすると、以下の画面が表示されます。
2通のメールが確認できます。また、メールのタイトル、本文ともに実装通りの文言になっています。
コンテナ一覧の確認
docker container ps
起動中のコンテナでコマンドを実行 docker compose exec
docker compose exec app bash
docker compose exec
はデフォルトで --interactive
と --tty
オプションが有効になっているため、対話操作時、これらのオプションの指定は不要です。
コンテナの停止と削除 docker compose down
docker compose down
コンテナとネットワークが削除されます。
参考
- docker compose exec
- docker compose down
- docker compose ps
- Docker Compose Quickstart
- docker compose up
- 鈴木亮「開発系エンジニアのためのDocker絵とき入門」秀和システム、2024
関連URL