目次
Docker Compose チュートリアル:1つのファイルで複数のコンテナを管理
実際のアプリケーションは、通常1つのコンテナだけではありません。Web サイト、データベース、キャッシュなど、それぞれに長い docker run の引数を覚える必要があり、ネットワークや Volume を先に作成して、起動順序にも気を配らなければなりません。
Docker Compose を使うと、こうした設定を1つの YAML ファイルにまとめ、1つのコマンドですべてを起動できます。
docker compose up -d
インストールとバージョン
- Docker Desktop(Windows、macOS)には Compose があらかじめ含まれています。
- Linux:Docker のインストールの手順に従って
docker-compose-pluginをインストールしてください。
$ docker compose version
Docker Compose version v5.6.0
以前のスタンドアロンプログラムは
docker-compose(ハイフンあり、v1)と呼ばれ、すでにメンテナンスが終了しています。現在はdocker compose(スペースあり)を使ってください。Compose のバージョン番号は v2 から v5 に直接移行しましたが、使い方は変わっていません。古いオンラインチュートリアルでは両者が混在していることがありますが、コマンドと引数はおおむね同じです。
サンプルプロジェクト:Web サイト + データベース + 管理画面
compose-demo フォルダを作成し、次の構成にします。
compose-demo/
├── compose.yaml
└── site/
└── index.html
site/index.html には簡単な Web ページを置きます(内容は自由です)。compose.yaml は次のとおりです。
services:
web:
image: nginx:1.30-alpine
ports:
- "8080:80"
volumes:
- ./site:/usr/share/nginx/html:ro
db:
image: postgres:18
environment:
POSTGRES_PASSWORD: example
volumes:
- pgdata:/var/lib/postgresql
adminer:
image: adminer
ports:
- "8081:8080"
depends_on:
- db
volumes:
pgdata:
3つのサービスがあります。
| サービス | 役割 |
|---|---|
web | nginx。./site フォルダを Web サイトとして使い、ホストの 8080 番ポートで公開します |
db | PostgreSQL 18。データは pgdata という名前の Volume に保存されます(18 版では /var/lib/postgresql をマウントします。Volumeを参照してください) |
adminer | Web ベースのデータベース管理ツール。ホストの 8081 番ポートで公開します |
同じ設定を docker run で記述する場合は、最初に docker network create と docker volume create を実行し、その後、長い docker run コマンドを3つ実行する必要があります。
起動:docker compose up
compose-demo フォルダで次のコマンドを実行します。
$ docker compose up -d
[+] up 34/34
✔ Image nginx:1.30-alpine Pulled 7.8s
✔ Image adminer Pulled 8.7s
✔ Network compose-demo_default Created 0.1s
✔ Volume compose-demo_pgdata Created 0.0s
✔ Container compose-demo-web-1 Started 1.7s
✔ Container compose-demo-db-1 Started 0.8s
✔ Container compose-demo-adminer-1 Started 1.0s
1つのコマンドで完了しました。イメージをダウンロードし(Pulled。初回のみ表示されます)、ネットワークと Volume を作成して、3つのコンテナを起動します。
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
compose-demo-adminer-1 adminer "entrypoint.sh docke…" adminer 10 seconds ago Up 9 seconds 0.0.0.0:8081->8080/tcp, [::]:8081->8080/tcp
compose-demo-db-1 postgres:18 "docker-entrypoint.s…" db 10 seconds ago Up 10 seconds 5432/tcp
compose-demo-web-1 nginx:1.30-alpine "/docker-entrypoint.…" web 10 seconds ago Up 9 seconds 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp
$ docker network ls --filter name=compose-demo
NETWORK ID NAME DRIVER SCOPE
a722da926fbd compose-demo_default bridge local
$ docker volume ls --filter name=compose-demo
DRIVER VOLUME NAME
local compose-demo_pgdata
- コンテナ名は
プロジェクト名-サービス名-番号です。プロジェクト名はデフォルトでフォルダ名(compose-demo)になるため、別フォルダのプロジェクト同士は干渉しません。 - Compose は
compose-demo_defaultネットワークを自動で作成します。3つのサービスはこのネットワークに接続され、サービス名を使って相互に通信できます。 pgdataVolume の実際の名前はcompose-demo_pgdataです。dbにはportsが設定されていないため、PORTS 欄には5432/tcpだけが表示され、外部から接続できません。
http://localhost:8080 を開きます。

Adminerでデータベースを管理する
http://localhost:8081 を開くと、Adminerのログイン画面が表示されます。SystemのデフォルトはMySQLです。

次の設定でログインします。
| 項目 | 入力値 |
|---|---|
| System | PostgreSQL(必ず変更してください。変更しないとMySQLの方式で接続しようとして失敗します) |
| Server | db(サービス名。Composeネットワーク経由で名前解決されます) |
| Username | postgres |
| Password | example(compose.yaml の POSTGRES_PASSWORD) |

ログインに成功すると、PostgreSQLのバージョンとデータベースの一覧が表示されます。

左側の SQL command をクリックし、SQLを入力します。
CREATE TABLE guestbook (id serial PRIMARY KEY, name text, message text);
INSERT INTO guestbook (name, message) VALUES ('Docker', 'Hello from Compose!');
SELECT * FROM guestbook;

Execute をクリックすると、3つのコマンドが順に実行され、最後の SELECT で先ほど追加したデータが表示されます。

ログを確認する
$ docker compose logs --tail 2
web-1 | 2026/10/13 00:14:23 [notice] 1#1: start worker processes
web-1 | 2026/10/13 00:14:23 [notice] 1#1: start worker process 30
db-1 | 2026-10-13 00:14:24.205 UTC [71] LOG: database system was shut down at 2026-10-13 00:14:24 UTC
db-1 | 2026-10-13 00:14:24.210 UTC [1] LOG: database system is ready to accept connections
adminer-1 | [Tue Oct 13 00:14:22 2026] PHP 8.4.26 Development Server (http://[::]:8080) started
docker compose logs はすべてのサービスのログをまとめて表示し、各行の先頭にサービス名を付けます。--tail 2 は各サービスの最後の2行だけを表示し、-f はログを継続して追跡します。docker compose logs db は db のログだけを表示します。
停止と起動
$ docker compose stop
[+] stop 3/3
✔ Container compose-demo-adminer-1 Stopped 0.4s
✔ Container compose-demo-web-1 Stopped 0.4s
✔ Container compose-demo-db-1 Stopped 0.3s
$ docker compose ps -a
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
compose-demo-adminer-1 adminer "entrypoint.sh docke…" adminer 53 seconds ago Exited (0) Less than a second ago
compose-demo-db-1 postgres:18 "docker-entrypoint.s…" db 53 seconds ago Exited (0) Less than a second ago
compose-demo-web-1 nginx:1.30-alpine "/docker-entrypoint.…" web 53 seconds ago Exited (0) Less than a second ago
$ docker compose start
[+] start 3/3
✔ Container compose-demo-db-1 Started 0.3s
✔ Container compose-demo-web-1 Started 1.0s
✔ Container compose-demo-adminer-1 Started 0.4s
stop はコンテナを停止するだけです(Exited (0))。コンテナ、ネットワーク、Volumeは残ります。start で再び起動できます。
down:コンテナを削除してデータを保持する
$ docker compose down
[+] down 4/4
✔ Container compose-demo-adminer-1 Removed 0.7s
✔ Container compose-demo-web-1 Removed 0.7s
✔ Container compose-demo-db-1 Removed 0.3s
✔ Network compose-demo_default Removed 0.1s
down はコンテナとネットワークを削除しますが、Volumeは削除しません。再度 up すると、データは残っています。
$ docker compose up -d
[+] up 4/4
✔ Network compose-demo_default Created 0.1s
✔ Container compose-demo-web-1 Started 0.7s
✔ Container compose-demo-db-1 Started 1.1s
✔ Container compose-demo-adminer-1 Started 1.6s
$ docker compose exec db psql -U postgres -c "SELECT * FROM guestbook;"
id | name | message
----+--------+---------------------
1 | Docker | Hello from Compose!
(1 row)
down -v:データも含めて削除する
$ docker compose down -v
[+] down 5/5
✔ Container compose-demo-adminer-1 Removed 0.7s
✔ Container compose-demo-web-1 Removed 0.7s
✔ Container compose-demo-db-1 Removed 0.2s
✔ Volume compose-demo_pgdata Removed 0.1s
✔ Network compose-demo_default Removed 0.1s
-v を付けると compose-demo_pgdata Volumeも削除され、データベースのデータは失われます。本番環境では down -v を慎重に使用してください。
基本操作の整理
docker compose up -d # すべてのサービスを作成してバックグラウンドで起動
docker compose ps # サービスの状態を確認
docker compose logs -f # すべてのサービスのログを追跡
docker compose logs -f db # db のみ表示
docker compose stop # 停止(コンテナは保持)
docker compose start # 再起動
docker compose down # 停止してコンテナとネットワークを削除(Volume は保持)
docker compose down -v # Volume も削除(データは消えます!)
compose.yaml を変更したら、もう一度 docker compose up -d を実行します。Compose は変更のあったサービスだけを再作成します(例は docker compose コマンドを参照)。
プロジェクト名とファイル名
- プロジェクト名はデフォルトでフォルダー名になります。また、
compose.yamlの先頭でname: myprojectを指定するか、docker compose -p myprojectを使って指定することもできます。 - Compose はデフォルトで
compose.yaml、compose.yml、docker-compose.yaml、docker-compose.ymlの順に探します。新しいプロジェクトではcompose.yamlの使用をおすすめします。 - ファイル冒頭の
version: "3.8"は古い形式の書き方です。現在は不要で、記述すると警告が表示されます。
次のステップ
- compose.yaml の構文を詳しく解説:build、ports、volumes、environment、depends_on、healthcheck……
- docker compose のよく使うコマンド
- 実践:Compose で WordPress を構築する
まとめ
- compose.yaml には複数のサービス、ネットワーク、Volume を記述します。1つのコマンドですべてを起動できます。
- Compose はプロジェクト用のネットワークを自動で作成します。サービス間の接続にはサービス名を使います。
docker compose downは Volume を保持します。down -vはデータを削除します。- Docker Desktop では Compose のプロジェクトがグループとして表示されます。
練習問題
練習 1:この章のプロジェクトで、1つのコマンドを使って db サービスのログの末尾5行だけを表示してください。
解答
docker compose logs --tail 5 db
練習 2:docker compose down を実行してから up -d を実行すると、Adminer で作成したテーブルは残っていますか?down -v の場合はどうでしょうか?
解答
down の後もデータは残ります。pgdata Volume が保持されるためです。down -v は Volume を削除するため、データベースが再初期化され、テーブルも消えます。
よくある質問
docker-compose と docker compose は何が違いますか?
docker-compose(ハイフンあり)はメンテナンスが終了した v1 のスタンドアロンプログラムです。現在は Docker CLI のプラグイン docker compose(スペースあり)を使います。このチュートリアルでは v5 を使用します。
compose.yaml と docker-compose.yml のどちらも使えますか?
どちらも使えます。Compose は順番にファイルを探します。新しいプロジェクトでは compose.yaml をおすすめします。
プロジェクト名はどのように決まりますか?
デフォルトでは compose.yaml があるフォルダの名前です。コンテナ、ネットワーク、Volume の名前には、この名前が接頭辞として付きます。name: または -p で指定することもできます。
更新日 2026年10月14日