0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Doker Compose

Last updated at Posted at 2026-01-11

今回の例:
https://github.com/docker-mailserver/docker-mailserver

Docker Compose の使い方

1. docker compose は「どこ」を見ているか

基本ルール

docker compose up -d

は👇を暗黙にやっている:

  • カレントディレクトリを基準に
  • 以下のファイル名を探す

優先順:

  1. compose.yaml
  2. compose.yml
  3. docker-compose.yaml
  4. docker-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 -dpull して起動

※ build がある repo だけ docker compose build が意味を持つ


3. docker compose up -d がやっていること

docker compose up -d

内部的には👇

  1. image がなければ pull
  2. コンテナ作成
  3. ネットワーク自動作成
  4. コンテナ起動
  5. 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-mailservercompose.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 bash
  • docker 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 再起動後も起動

選択肢:

  • no
  • on-failure
  • unless-stopped
  • always

👉 サーバ用途は 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
    

    を作る

👉 単体構成では省略が正解


0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?