Docker Compose:1つのコマンドで複数のサービスを起動
アプリケーション、データベース、Webサーバーの組み合わせを1つのファイルに記述し、1つのコマンドで起動して、手動での再ビルドなしに更新する方法を説明します。
更新日 2026年8月23日
単一のサービスなら、長い docker run コマンド 1 つで起動できます。しかし、互いを認識する必要がある 2 つのサービスとなると、もううまくいきません。翌日にはパラメータを忘れてしまうでしょう。Compose は、その説明全体を、読んで編集でき、リポジトリに保存できるファイルへと移します。
最小構成の例
/opt/myapp ディレクトリに compose.yaml を置きます:
services:
db:
image: postgres:17
restart: unless-stopped
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: app
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
retries: 5
app:
image: ghcr.io/example/app:1.4.2
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
DATABASE_URL: postgres://postgres:${DB_PASSWORD}@db:5432/app
ports:
- "127.0.0.1:8080:8080"
volumes:
db-data:
その隣に .env ファイルを置きます:
DB_PASSWORD=long-random-password
chmod 600 .env
docker compose up -d
docker compose ps
docker compose logs -f app
ここで重要なポイント
- アドレスではなく名前。 アプリケーションは
dbという名前でデータベースに到達します。Compose はサービス名が自動的に解決される共有ネットワークを作成します。データベースのポートを外部に公開する必要はなく、公開すべきでもありません。 restart: unless-stopped。 これがないと、マシンの再起動後に何も復帰しません。- ヘルスチェックを伴う
depends_on。 通常のdepends_onはコンテナの起動のみを待ち、データベースが接続を受け付けられる状態になるまで待ちません。アプリケーションは早く起動しすぎてクラッシュします。 - 正確なイメージバージョン。
postgres:latestではなくpostgres:17を使用します。latestでは、次のpullである日メジャーバージョンが導入され、古いデータを開けなくなります。 127.0.0.1での公開。 ポートを外部に公開するのは、証明書を備えた Web サーバーを経由する場合のみにしてください。
日常的なコマンド
docker compose up -d # bring up or apply changes
docker compose down # stop and remove containers (volumes intact)
docker compose down -v # ...and remove volumes too
docker compose restart app # restart one service
docker compose exec app sh # go inside
docker compose pull && docker compose up -d # update images
docker compose config # show final file with substitutions
docker compose config は、起動前にファイルを確認する最良の方法です。変数が何に展開されたか、インデントが失われていないかが表示されます。
docker compose down -vはボリュームをデータベースごと削除します。これは元に戻せません。-vを伴う操作の前には、必ずコピーがあることを確認してください。詳しくはバックアップをご覧ください。
環境ファイル
同じスタックをテスト用と本番用に分けるには、オーバーレイを使うと便利です:
docker compose -f compose.yaml -f compose.prod.yaml up -d
2 つ目のファイルは差分のみを上書きします。メモリ制限、公開ポート、ログレベルなどです。
よくある間違い
- リポジトリに保存された
compose.yaml内のシークレット。 シークレットはパーミッション 600 の.envに保管し、コミットしないでください。 docker-composeとdocker composeの混在。 旧 v1 バージョンは一部の構文を理解せず、プロジェクトを異なる名前で保存します。プラグインをインストールしてください。詳しくはDocker のインストールをご覧ください。- ボリュームではなくコンテナ内のデータ。
docker compose downの後で消えてしまいます。詳しくはボリュームをご覧ください。 - メモリ制限がない。 1 つのサービスがマシンのメモリをすべて食い尽くし、カーネルが隣のサービスを強制終了します。詳しくはリソース制限をご覧ください。