1
2
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

Docker Compose を使って App / DB / Mail コンテナの開発環境を構築する

Last updated at Posted at 2024-07-04

はじめに

この記事では、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つのコンテナ分のサービスを定義します。

compose.yaml
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 : 前述の通りデフォルトでネットワークに接続されるため

ボリュームの定義

オプションを追加する前にボリュームを定義しておきます。

compose.yaml
services:
  app:
  db:
  mail:
volumes:
  db-compose-volume:
  mail-compose-volume:

環境変数

dbmail に環境変数を定義します。

compose.yaml
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:
  

ボリュームのマウント

dbmail にボリュームのマウントを定義します。

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:

バインドマウント

appdb にバインドマウントを定義します。

compose.yaml
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:

相対パスは . で書き始めます。

利用イメージ

dbmail に利用イメージを定義します。

compose.yaml
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 のパスを渡し、イメージビルドを定義します。

compose.yaml
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 : コンテナを起動する前にイメージをビルド

image.png

ブラウザで動作確認をします。

App コンテナ( http://localhost:8000/ )にアクセスすると、以下の画面が表示されます。
ユーザー一覧と各ユーザーにメールを送信したことが確認できます。

image.png

Mail コンテナ( http://localhost:8025/ )にアクセスすると、以下の画面が表示されます。
2通のメールが確認できます。また、メールのタイトル、本文ともに実装通りの文言になっています。

image.png

コンテナ一覧の確認

docker container ps

image.png

起動したコンテナは docker container ls でも確認できます。

docker container ls

image.png

起動中のコンテナでコマンドを実行 docker compose exec

docker compose exec app bash

image.png

docker compose exec はデフォルトで --interactive--tty オプションが有効になっているため、対話操作時、これらのオプションの指定は不要です。

コンテナの停止と削除 docker compose down

docker compose down

コンテナとネットワークが削除されます。

image.png

オプションを追加すると、イメージとボリュームも削除されます。

docker compose down --rmi all --volumes
  • --rmi all : イメージの削除
  • --volumes : ボリュームの削除

image.png

参考

関連URL

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2