今回の例:
https://github.com/docker-mailserver/docker-mailserver
Docker Compose の使い方
1. docker compose は「どこ」を見ているか
基本ルール
docker compose up -d
は👇を暗黙にやっている:
- カレントディレクトリを基準に
- 以下のファイル名を探す
優先順:
compose.yamlcompose.ymldocker-compose.yamldocker-compose.yml
👉 今回は
[user@test docker-mailserver]$ ls
compose.yaml
があるので、自動的にこれが対象
2. docker compose build とは何か
役割
Dockerfile から Docker イメージを作る
compose.yaml との関係
services:
mailserver:
image: ghcr.io/docker-mailserver/docker-mailserver:latest
-
build:が ない -
image:のみ
👉 この構成では:
-
docker compose build→ 基本的に不要 -
docker compose up -d→ pull して起動
※ build がある repo だけ docker compose build が意味を持つ
3. docker compose up -d がやっていること
docker compose up -d
内部的には👇
- image がなければ pull
- コンテナ作成
- ネットワーク自動作成
- コンテナ起動
- ENTRYPOINT 実行
4. ネットワークは自動作成される
compose.yaml に networks がない場合
Docker Compose が自動で:
-
種類:bridge
-
名前:
<ディレクトリ名>_default今回:
docker-mailserver_default
重要ポイント
- image にネットワーク情報は 含まれない
- IP は 起動時に動的割当
- 再起動で変わる可能性あり
👉 IP に依存する設計はしない
5. コンテナ IP はどこで決まるか
❌ image
❌ compose.yaml
✅ Docker network
image(設計図)
→ container(実体)
→ network(IP割当)
確認方法:
docker inspect mailserver
docker network inspect docker-mailserver_default
6. ports の意味(ネットワークと別レイヤー)
ports:
- "25:25"
これは:
- ホストの 25 番
- → コンテナの 25 番へ転送
内部通信(同一 network)では ports 不要
外部公開では ports 必須
了解。
ここでは このスレッドで使っている docker-mailserver の compose.yaml を題材にして、
Docker Compose の書き方そのものを「読み方が分かる」レベルまで解説します。
Docker Compose の書き方
services:
mailserver:
image: ghcr.io/docker-mailserver/docker-mailserver:latest
container_name: mailserver
hostname: mail.example.com
env_file: mailserver.env
ports:
- "25:25"
- "143:143"
- "465:465"
- "587:587"
- "993:993"
volumes:
- ./docker-data/dms/mail-data/:/var/mail/
- ./docker-data/dms/mail-state/:/var/mail-state/
- ./docker-data/dms/mail-logs/:/var/log/mail/
- ./docker-data/dms/config/:/tmp/docker-mailserver/
- /etc/localtime:/etc/localtime:ro
restart: always
stop_grace_period: 1m
healthcheck:
test: "ss --listening --ipv4 --tcp | grep --silent ':smtp' || exit 1"
timeout: 3s
retries: 0
1. compose.yaml の全体構造
services:
サービス名:
設定項目: 値
重要な考え方
-
1 service = 1 コンテナ
-
サービス名は:
- Docker network 内の DNS 名
- compose の論理名
今回:
services:
mailserver:
👉 mailserver という名前のコンテナを1つ作る
2. image / build(最重要)
image
image: ghcr.io/docker-mailserver/docker-mailserver:latest
意味:
- すでにビルド済みのイメージを使う
-
docker compose up時に pull される
build(今回は未使用)
build: .
意味:
- Dockerfile から ローカルでビルド
- GitHub のソースを元に改造したい時に使う
👉 image か build のどちらか
3. container_name
container_name: mailserver
-
Docker 上の 実コンテナ名
-
省略すると:
<dir>_<service>_1
使い所
docker exec -it mailserver bashdocker logs mailserver
👉 明示指定は 運用上かなり便利
4. hostname(超重要:メール特有)
hostname: mail.example.com
これは:
- コンテナ内部の hostname
- Postfix が名乗る名前
- SMTP の EHLO/HELO
- TLS 証明書の CN/SAN
❌ IP とは無関係
❌ DNS 設定ではない
👉 メールでは必須レベル
5. env_file / environment
env_file
env_file: mailserver.env
- 環境変数を外部ファイルで定義
- docker-mailserver の設定は ほぼ全部 env
例(mailserver.env):
DOMAIN=example.com
ENABLE_IMAP=1
ENABLE_SMTP=1
environment(直書き)
environment:
- TZ=Asia/Tokyo
👉 量が多い場合は env_file が正解
6. ports(外部公開)
ports:
- "25:25"
形式:
"ホスト側:コンテナ側"
意味:
- ホストの 25 番 → コンテナの 25 番
注意
- 同一 network 内通信では不要
- 外部(PC / Internet)から使うなら必須
7. volumes(永続化・設定注入)
volumes:
- ホスト:コンテナ
docker-mailserver での役割
| マウント | 意味 |
|---|---|
| /var/mail | メール本体 |
| /var/log/mail | ログ |
| /tmp/docker-mailserver | 設定注入 |
| /etc/localtime | 時刻同期 |
👉 コンテナを消してもデータは残る
8. restart ポリシー
restart: always
意味:
- 異常終了 → 自動再起動
- Docker daemon 再起動後も起動
選択肢:
noon-failureunless-stoppedalways
👉 サーバ用途は always or unless-stopped
9. stop_grace_period(メール特有)
stop_grace_period: 1m
-
docker stop時に - SIGTERM → SIGKILL まで待つ時間
👉 メールキューを安全に吐かせるため
👉 メールサーバでは必須レベル
10. healthcheck
healthcheck:
test: "ss --listening --ipv4 --tcp | grep --silent ':smtp' || exit 1"
意味:
- SMTP が LISTEN してるか確認
- NG → unhealthy
確認:
docker ps
Up (healthy)
👉 「起動した」≠「使える」を防ぐ
11. networks(今回は省略)
networks:
mailnet:
書かない場合:
-
compose が自動で
<dir>_defaultを作る
👉 単体構成では省略が正解