はじめに
docker run で1コンテナずつ起動するのは問題ありません。
ただ、Web サーバーと補助コンテナのように 複数を毎回セットで動かす と、起動・停止のたびにコマンドを打ち直すのは面倒です。
この記事では Docker Compose を使い、YAML ファイル1本で複数コンテナを一括起動・停止する手順を、WSL2 上の Ubuntu ターミナルから進めます。
この記事でやることは次のとおりです。
-
docker-compose.yamlの基本構造(services / ports / volumes / environment)を理解する -
docker compose up/down/ps/logsでスタックを操作する -
--scaleで同じサービスのレプリカを増やす -
docker runのオプションと YAML の対応関係を確認する
※ この記事では、Ubuntu 環境のターミナルで Docker CLI / Compose を実行します。コンテナ間のネットワークや DNS の詳細は、シリーズ ⑥ Docker ネットワークとコンテナ間通信の図解 を参照してください。
環境設定につきましては以下の記事を参考にしてください。
Docker Compose とは
Docker Compose は、複数コンテナの定義と起動を YAML 1本で管理する 仕組みです。
docker compose up で定義したサービスをまとめて起動し、docker compose down でまとめて停止・削除できます。
たとえば nginx(Web)と busybox(補助)の2つを毎回動かす場合、docker run だけだと起動・停止のたびに 2回コマンドを打つ 必要があります。Compose なら YAML に書いておけば、up / down で一括操作できます。
全体の流れ
- 作業ディレクトリと
docker-compose.yamlを用意する -
docker compose up -dでスタックを起動する -
docker compose ps/curl/logsで確認する -
docker compose downで停止・削除する - (任意)
--scaleで web サービスを3台に増やす
Step 1: 作業ディレクトリとファイルを用意する
WSL 上の Linux ファイルシステムで実行します(/mnt/c/... よりマウントが安定しやすいです)。
ディレクトリ作成・移動
mkdir -p ~/hands-on/compose_demo/web
cd ~/hands-on/compose_demo
web/index.html
hello from compose
docker-compose.yaml
services:
web:
image: nginx:latest
environment:
- APP_ENV=demo
ports:
- "8080:80"
volumes:
- ./web:/usr/share/nginx/html:ro
worker:
image: busybox
command: ["sleep", "infinity"]
YAML の読み方
| キー | 意味 |
|---|---|
services |
起動するコンテナの一覧 |
web / worker
|
サービス名(Compose 内で識別子になる) |
image |
使用する Docker イメージ |
ports |
"ホスト:コンテナ" のポート公開 |
volumes |
ホストの ./web をコンテナ内 /usr/share/nginx/html に読み取り専用でマウント |
environment |
コンテナ内の環境変数 |
command |
イメージ既定 CMD の上書き |
Step 2: スタックを起動する
docker compose -f docker-compose.yaml -p compose_demo up -d
-p compose_demo は プロジェクト名 です。コンテナ名やネットワーク名の接頭辞になります。
出力例:
[+] up 3/3
✔ Network compose_demo_default Created
✔ Container compose_demo-web-1 Started
✔ Container compose_demo-worker-1 Started
Step 3: 状態を確認する
Compose 管理下の一覧
docker compose -p compose_demo ps
ホストから HTTP 確認
curl localhost:8080
出力例:
hello from compose
ログを追う(任意)
docker compose -p compose_demo logs -f web
Ctrl + C でログ表示だけ止めます。コンテナは -d 起動のままです。
Step 4: 停止・削除する
docker compose -p compose_demo down
ネットワークとコンテナがまとめて削除されます。
出力例:
[+] down 3/3
✔ Container compose_demo-worker-1 Removed
✔ Container compose_demo-web-1 Removed
✔ Network compose_demo_default Removed
Step 5: --scale でレプリカを増やす(任意)
同じ nginx サービスを3台起動する例です。scale 用に ポートレンジ を使い、container_name は指定しません。
docker-compose.scale.yaml
services:
web:
image: nginx:latest
ports:
- "8080-8082:80"
volumes:
- ./web:/usr/share/nginx/html:ro
worker:
image: busybox
command: ["sleep", "infinity"]
起動
docker compose -f docker-compose.scale.yaml -p compose_demo up -d --scale web=3
docker compose -p compose_demo ps
curl localhost:8080
curl localhost:8081
curl localhost:8082
3つとも hello from compose が返れば OK です。
片付け
docker compose -p compose_demo down
docker run と YAML の対応
Compose は、繰り返し使う docker run オプションを YAML に移したものと考えると整理しやすいです。
| docker run | docker-compose.yaml |
|---|---|
--name my-nginx |
container_name: my-nginx(scale 時は省略推奨) |
-p 8080:80 |
ports: ["8080:80"] |
--env KEY=VAL |
environment: ["KEY=VAL"] |
-v $(pwd):/path |
volumes: ["./dir:/path"] |
nginx(末尾のイメージ) |
image: nginx:latest |
sleep infinity(末尾 CMD) |
command: ["sleep", "infinity"] |
まとめ
この記事では、Docker Compose で複数コンテナを YAML 1本から一括起動・停止する手順を確認しました。
- Compose は YAML 1本 で複数コンテナを定義し、
up/downで一括操作できる -
docker compose ps/logsでスタック単位の確認ができる -
--scaleで同一サービスの台数を増やせる(ポートレンジとcontainer_name非指定が前提) - コンテナ間通信の仕組みは Docker ネットワークとコンテナ間通信の図解(シリーズ ⑥)を参照
参考
本記事を作成するうえで、以下の資料を参考にさせていただきました。
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください: