目次

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つのサービスがあります。

サービス役割
webnginx。./site フォルダを Web サイトとして使い、ホストの 8080 番ポートで公開します
dbPostgreSQL 18。データは pgdata という名前の Volume に保存されます(18 版では /var/lib/postgresql をマウントします。Volumeを参照してください)
adminerWeb ベースのデータベース管理ツール。ホストの 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つのサービスはこのネットワークに接続され、サービス名を使って相互に通信できます。
  • pgdata Volume の実際の名前は compose-demo_pgdata です。
  • db には ports が設定されていないため、PORTS 欄には 5432/tcp だけが表示され、外部から接続できません。

http://localhost:8080 を開きます。

Compose で起動した nginx に site/index.html が表示されている
web サービスに site/index.html の内容が表示されます

Adminerでデータベースを管理する

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

Adminerのログイン画面。デフォルトのSystemはMySQL
Adminerのデフォルト:SystemはMySQL / MariaDB、Serverにはdbが自動入力されています

次の設定でログインします。

項目入力値
SystemPostgreSQL(必ず変更してください。変更しないとMySQLの方式で接続しようとして失敗します)
Serverdb(サービス名。Composeネットワーク経由で名前解決されます)
Usernamepostgres
Passwordexample(compose.yaml の POSTGRES_PASSWORD)
Adminerのログイン画面。SystemでPostgreSQLを選択
SystemをPostgreSQLに変更してからLoginをクリックします

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

Adminerのログイン後に表示されるPostgreSQLのバージョンとデータベースの一覧
AdminerはComposeネットワーク経由でdbサービスの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;
AdminerのSQL command入力画面
SQL commandにSQLを入力して、Executeをクリックします

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

AdminerでSQLを実行した結果
テーブルの作成、データ1件の追加、クエリ結果

ログを確認する

$ 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 には複数のサービス、ネットワーク、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日