Skip to content
VDS · Dockerとコンテナ

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 つのサービスがマシンのメモリをすべて食い尽くし、カーネルが隣のサービスを強制終了します。詳しくはリソース制限をご覧ください。