目次

docker compose コマンド一覧:使い方と実践例

すべての docker compose コマンドは、compose.yaml があるディレクトリ(またはそのサブディレクトリ)で実行するか、-f でファイルを指定します。コマンドの後にサービス名を指定すると、そのサービスだけが操作対象になります。指定しない場合はプロジェクト全体が対象です。この節の例では、Compose 入門の compose-demo プロジェクトを使います。

docker compose の up、stop、start、down によるサービス状態の変化と、restart、up -d、down -v の違い
Compose コマンドとサービス状態の関係

起動と停止

コマンド役割
docker compose up作成して起動します。ログはフォアグラウンドに出力され、Ctrl+C で停止します
docker compose up -dバックグラウンドで起動します
docker compose up -d --buildイメージを再ビルドしてから起動します
docker compose up -d appapp(および依存するサービス)のみを起動します
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 -vVolume も削除します(データは失われます)
docker compose down --rmi localCompose がビルドしたイメージも削除します

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)。

execrun
コンテナ実行中のコンテナを使う新しいコンテナを作成
サービスを先に起動する必要があるかはいいいえ
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日