目次
docker compose コマンド一覧:使い方と実践例
すべての docker compose コマンドは、compose.yaml があるディレクトリ(またはそのサブディレクトリ)で実行するか、-f でファイルを指定します。コマンドの後にサービス名を指定すると、そのサービスだけが操作対象になります。指定しない場合はプロジェクト全体が対象です。この節の例では、Compose 入門の compose-demo プロジェクトを使います。
起動と停止
| コマンド | 役割 |
|---|---|
docker compose up | 作成して起動します。ログはフォアグラウンドに出力され、Ctrl+C で停止します |
docker compose up -d | バックグラウンドで起動します |
docker compose up -d --build | イメージを再ビルドしてから起動します |
docker compose up -d app | app(および依存するサービス)のみを起動します |
docker compose up -d --force-recreate | 設定に変更がなくてもコンテナを再作成します |
docker compose up -d --remove-orphans | 設定ファイルからなくなったサービスのコンテナを削除します |
docker compose stop | 停止します。コンテナは保持されます |
docker compose start | 停止中のコンテナを起動します |
docker compose restart app | サービスを再起動します(新しい設定は反映されません。下の実測を参照) |
docker compose down | コンテナとネットワークを停止して削除します |
docker compose down -v | Volume も削除します(データは失われます) |
docker compose down --rmi local | Compose がビルドしたイメージも削除します |
up、stop、start、down の実際の出力はCompose 入門を参照してください。
状態を確認する
$ 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 9 seconds 5432/tcp
compose-demo-web-1 nginx:1.30-alpine "/docker-entrypoint.…" web 10 seconds ago Up 8 seconds 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp
$ docker compose ls
NAME STATUS CONFIG FILES
compose-demo running(3) /work/compose-demo/compose.yaml
$ docker compose images
CONTAINER REPOSITORY TAG PLATFORM IMAGE ID SIZE CREATED
compose-demo-adminer-1 adminer latest linux/amd64 74f29c416e14 164MB 2 weeks ago
compose-demo-db-1 postgres 18 linux/amd64 74935e722416 644MB 6 days ago
compose-demo-web-1 nginx 1.30-alpine linux/amd64 0985e772fb9f 92.8MB 2 weeks ago
$ docker compose top web
SERVICE # PID USER TIME COMMAND
web 1 21356 root 0:00 nginx: master process nginx -g daemon off;
web 1 21425 101 0:00 nginx: worker process
| コマンド | 内容 |
|---|---|
docker compose ps | このプロジェクトのコンテナと状態(-a で停止中も含む) |
docker compose ls | このマシン上のすべての Compose プロジェクトと設定ファイルの場所 |
docker compose images | 各コンテナが使用するイメージ、プラットフォーム、サイズ |
docker compose top web | サービスコンテナ内のプロセス |
ログを確認する
$ docker compose logs --tail 2 -t web
web-1 | 2026-10-13T00:18:19.618825771Z 2026/10/13 00:18:19 [notice] 1#1: start worker processes
web-1 | 2026-10-13T00:18:19.619080382Z 2026/10/13 00:18:19 [notice] 1#1: start worker process 30
docker compose logs # すべてのサービス
docker compose logs -f app # app を継続的に追跡
docker compose logs --tail 50 -t # 末尾 50 行を時刻付きで表示
サービス内でコマンドを実行する
exec:実行中のコンテナ内
$ docker compose exec web nginx -v
nginx version: nginx/1.30.5
$ docker compose exec db psql -U postgres -c "SELECT now();"
now
-------------------------------
2026-10-13 00:18:28.618314+00
(1 row)
$ docker compose exec -T db pg_dump -U postgres postgres > backup.sql && wc -l backup.sql
27 backup.sql
$ rm backup.sql
- コンテナはサービス名(
web、db)で指定するため、実際のコンテナ名を気にする必要はありません。 -Tは仮想端末を無効にします。出力をファイルにリダイレクトする場合(上のpg_dump > backup.sqlなど)やスクリプトで使う場合は必ず付けてください。付けないと、出力に端末制御文字が混入することがあります。docker compose exec web shで対話型シェルを開きます。
run:新しい使い捨てコンテナを起動する
$ docker compose run --rm web nginx -t
Container compose-demo-web-run-80040d25219f Creating
Container compose-demo-web-run-80040d25219f Created
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
run はサービスの設定(イメージ、環境変数、Volume、ネットワーク)を使って新しいコンテナ(名前は compose-demo-web-run-…)を作成し、コマンドを実行します。--rm を指定すると、終了後に自動で削除されます。上記では、実行中のサービスに影響を与えずに nginx の設定を確認しています(nginx -t)。
| exec | run | |
|---|---|---|
| コンテナ | 実行中のコンテナを使う | 新しいコンテナを作成 |
| サービスを先に起動する必要があるか | はい | いいえ |
ports が適用されるか | — | デフォルトでは適用されない。必要な場合は --service-ports を追加 |
| 用途 | 入ってデバッグする、実行中のサービス内で操作する | テストやデータベースのマイグレーションなど、一度だけ実行するタスク |
設定変更後:restart では不十分。up -d を使う
これは最もよくある誤解です。試してみましょう。compose.yaml の web サービスに環境変数 SITE_TITLE: v2 を追加し、restart と up -d をそれぞれ試します。
$ docker compose --progress plain restart web
Container compose-demo-web-1 Restarting
Container compose-demo-web-1 Started
$ docker compose exec web sh -c "echo SITE_TITLE=\$SITE_TITLE"
SITE_TITLE=
$ docker compose up -d
[+] up 3/3
✔ Container compose-demo-db-1 Running 0.0s
✔ Container compose-demo-adminer-1 Running 0.0s
✔ Container compose-demo-web-1 Started 0.4s
$ docker compose exec web sh -c "echo SITE_TITLE=\$SITE_TITLE"
SITE_TITLE=v2
restartは既存のコンテナを停止して再起動するだけです。コンテナの設定は作成時に決まるため、新しい環境変数は反映されません(SITE_TITLE=が空です)。up -dはcompose.yamlと既存のコンテナを比較し、webの設定が変わっていればwebを再作成します(Started)。変更のないdbとadminerはそのままです(Running)。
compose.yamlまたは.envを変更した後は、必ずdocker compose up -dを使ってください。
ビルドとイメージ
docker compose build # build 設定があるすべてのサービスをビルド
docker compose build --no-cache app
docker compose pull # すべてのサービスの最新イメージをダウンロード
docker compose push # image 名が設定されたサービスをプッシュ
$ docker compose pull
[+] pull 3/3
✔ Image adminer Pulled 0.7s
✔ Image nginx:1.30-alpine Pulled 0.5s
✔ Image postgres:18 Pulled 1.3s
既存のイメージを使うサービスを更新するときの一般的な手順です。
docker compose pull
docker compose up -d
docker image prune -f # 置き換えられた古いイメージを削除
設定を確認する
$ docker compose config --services
db
adminer
web
$ docker compose config --volumes
pgdata
$ docker compose port web 80
0.0.0.0:8080
docker compose config # マージと変数置換後の完全な設定を表示
docker compose config --services # すべてのサービス名を一覧表示
docker compose config --volumes # Volume を一覧表示
docker compose port web 80 # サービスのコンテナポートがホストのどこに割り当てられているか
docker compose config の出力例全体はcompose.yaml の構文を参照してください。
その他
docker compose cp web:/etc/nginx/nginx.conf ./nginx.conf # ファイルをコピー
docker compose watch # 開発中にファイルの変更を検知して自動で同期または再ビルド
docker compose up -d --scale worker=3 # worker を3つ起動
グローバルオプション
これらのオプションは docker compose とサブコマンドの間に指定します。
docker compose -f compose.yaml -f compose.prod.yaml up -d
docker compose -p myproject up -d # プロジェクト名を指定
docker compose --env-file .env.prod up -d # .env ファイルを指定
docker compose --profile tools up -d # profile を有効化
docker compose --progress plain up -d # テキスト形式で進捗を出力(CI ログに適しています)
日常的な場面で使うコマンド
| したいこと… | コマンド |
|---|---|
| 1日の開発を始める | docker compose up -d |
compose.yaml または .env を変更した | docker compose up -d |
| Dockerfile またはパッケージ一覧を変更した | docker compose up -d --build |
| サービスが停止した理由を確認する | docker compose logs app |
| データベースで SQL を実行する | docker compose exec db psql -U postgres |
| データベースのマイグレーションを一度だけ実行する | docker compose run --rm app <migration command> |
| 作業を終える | docker compose stop または down |
| データも含めて完全にやり直す | docker compose down -v |
まとめ
compose.yamlまたは.envを変更した後は、必ずdocker compose up -dを使います。execは実行中のコンテナに使い、run --rmは使い捨てコンテナを起動します。docker compose configでマージ後の最終設定を確認します。upとdownのオプションの詳細は、docker compose up と docker compose down を参照してください。
練習問題
練習 1:compose.yaml の web のホストポートを変更し、docker compose restart web と docker compose up -d をそれぞれ試してください。新しいポートが適用されるのはどちらですか?
解答
up -d だけです。restart は既存のコンテナを再起動します。ポート設定はコンテナの作成時に決まります。
練習 2:使い捨てコンテナを使い、db サービスのネットワーク内で psql --version を実行してください。終了後、コンテナを自動で削除します。
解答
docker compose run --rm db psql --version
よくある質問
docker compose restart と up -d の違いは何ですか?
restart は同じコンテナを再起動するだけなので、compose.yaml と .env の変更は反映されません。up -d は設定を比較し、変更のあるサービスを再作成します。
docker compose exec と run はどちらを使えばよいですか?
exec は実行中のコンテナ内でコマンドを実行します。run は新しい一時コンテナを起動し、データベースのマイグレーションなどに適しています。--rm を付けると終了後に削除されます。
すべての Compose プロジェクトを確認するには?
docker compose ls で、このマシン上のすべての Compose プロジェクトと設定ファイルの場所を一覧表示できます。
更新日 2026年10月14日