・約5分で読めます

Docker Compose完全ガイド:開発環境の構築から本番運用まで【2026年版】


PRXサーバー国内シェアNo.1のレンタルサーバー。高速・安定・サポート充実で初心者にもおすすめ。
Xサーバー 公式サイト →

Docker Composeを使って複数のコンテナを一括管理したいけれど、「yamlの書き方がよくわからない」「本番環境にどうデプロイすればいいのか」と悩んでいる方は多いのではないでしょうか。この記事では、Python FastAPI・Next.js・PostgreSQLの3コンテナ構成を例に、開発環境の構築からXサーバーVPSへの本番デプロイまでを一気通貫で解説します。


Docker Composeとは?基本概念とyaml構文を理解する

Docker Composeが必要になる理由

Dockerを単体で使っていると、コンテナが増えるたびにdocker runコマンドが複雑になっていきます。たとえばAPIサーバー・フロントエンド・データベースを別々に起動し、それぞれのネットワーク設定やボリューム管理を手動で行うのは現実的ではありません。

Docker Composeは「複数コンテナの構成をyamlファイルで定義し、1コマンドで起動・停止できる」ツールです。 開発環境の再現性が上がり、チームメンバーが同じ環境を簡単に立ち上げられるようになります。

なお、Docker Desktop(バージョン3.x以降)にはComposeが同梱されており、Linux環境でもdocker compose(ハイフンなし)コマンドが標準で使えるようになっています。

docker-compose.yamlの基本構文

docker-compose.yaml(またはdocker-compose.yml)の基本構造は以下のとおりです。

services:
  サービス名:
    image: イメージ名
    build: ./ビルドコンテキスト
    ports:
      - 'ホスト側ポート:コンテナ側ポート'
    environment:
      - 環境変数名=値
    volumes:
      - ボリューム名:/コンテナ内パス
    depends_on:
      - 依存サービス名

volumes:
  ボリューム名:

networks:
  ネットワーク名:

主要なキーの役割を整理しておきましょう。

キー 役割
services 起動するコンテナを定義するトップレベルキー
build Dockerfileのパスを指定してイメージをビルド
image Docker Hubなどから既存イメージを使用
ports ポートフォワーディングの設定
volumes データの永続化やソースコードのマウント
depends_on サービスの起動順序を制御
environment 環境変数の設定
networks コンテナ間通信のネットワーク設定

FastAPI+Next.js+PostgreSQLの3コンテナ構成を実装する

実際のプロジェクトで使える3コンテナ構成を実装していきます。ディレクトリ構造は以下のとおりです。

project/
├── docker-compose.yaml
├── .env
├── backend/
│   ├── Dockerfile
│   └── main.py
└── frontend/
    ├── Dockerfile
    └── (Next.jsファイル群)

環境変数管理(.envファイル)の設計

パスワードやAPIキーをyamlファイルに直接書くのは危険です。.envファイルで管理し、Gitの管理対象から外す運用が基本になります。

.envファイルの例:

POSTGRES_USER=appuser
POSTGRES_PASSWORD=your_secure_password
POSTGRES_DB=appdb
DATABASE_URL=postgresql://appuser:your_secure_password@db:5432/appdb
NEXT_PUBLIC_API_URL=http://localhost:8000

.gitignore.envを追加するのを忘れないようにしてください。代わりに.env.example(ダミー値を入れたサンプル)をリポジトリに含めておくと、チーム開発で便利です。

docker-compose.yamlの完成版

3サービスをまとめたdocker-compose.yamlです。

services:
  db:
    image: postgres:16-alpine
    restart: unless-stopped
    env_file:
      - .env
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - app-network
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

  backend:
    build: ./backend
    restart: unless-stopped
    env_file:
      - .env
    ports:
      - '8000:8000'
    networks:
      - app-network
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - ./backend:/app

  frontend:
    build: ./frontend
    restart: unless-stopped
    env_file:
      - .env
    ports:
      - '3000:3000'
    networks:
      - app-network
    depends_on:
      - backend

volumes:
  postgres_data:

networks:
  app-network:
    driver: bridge

ヘルスチェック設定の重要性

上記のdbサービスにhealthcheckを定義している点に注目してください。depends_onだけではコンテナが「起動した」だけを確認するため、PostgreSQLがリクエストを受け付けられる状態になる前にバックエンドが接続を試みてエラーになるケースがあります。

condition: service_healthyと組み合わせることで、PostgreSQLが実際に応答できる状態になってからバックエンドが起動するように制御できます。本番環境では特に重要な設定です。

ヘルスチェックの主要オプションをまとめます。

オプション 意味 推奨値の目安
interval チェックの間隔 10〜30秒
timeout タイムアウト時間 5〜10秒
retries 失敗とみなすまでの回数 3〜5回
start_period 起動猶予時間 30〜60秒

NginxリバースプロキシでHTTPS対応する

なぜリバースプロキシが必要なのか

本番環境では、フロントエンドとバックエンドを別々のポートで公開するのは好ましくありません。Nginxをリバースプロキシとして挟むことで、以下のメリットが得られます。

  • 80番・443番ポートで統一的にリクエストを受け付けられる
  • SSL証明書(Let’s Encrypt等)を一元管理できる
  • 静的ファイルのキャッシュや負荷分散に対応できる

docker-compose.yamlnginxサービスを追加します:

nginx:
  image: nginx:alpine
  restart: unless-stopped
  ports:
    - '80:80'
    - '443:443'
  volumes:
    - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
    - ./nginx/ssl:/etc/nginx/ssl:ro
  networks:
    - app-network
  depends_on:
    - frontend
    - backend

nginx.confの設定例

./nginx/nginx.confに以下の内容を記述します。/api/へのリクエストをFastAPIへ、それ以外はNext.jsへルーティングする構成です。

server {
    listen 80;
    server_name your-domain.com;

    location /api/ {
        proxy_pass http://backend:8000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location / {
        proxy_pass http://frontend:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Next.jsのWebSocketやHMR(Hot Module Replacement)を使う場合は、UpgradeConnectionヘッダーの設定が必要になります。


XサーバーVPSへのデプロイ手順

VPSの初期設定とDockerインストール

XサーバーVPSはUbuntu 22.04 LTSのイメージが用意されており、コストパフォーマンスの高いVPS選択肢の一つです。スペックとコストのバランスを見ながら、プロジェクトの規模に合ったプランを選ぶとよいでしょう。

SSHでVPSに接続したら、まずDockerをインストールします。公式ドキュメントに従ったapt経由のインストールが安定しています。

# Dockerの公式インストールスクリプトを使う場合
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 現在のユーザーをdockerグループに追加(sudo不要にする)
sudo usermod -aG docker $USER
newgrp docker

インストール後はdocker --versiondocker compose versionでそれぞれ動作確認しておきましょう。

ソースコードの転送とデプロイ

Gitリポジトリを使う方法が最も管理しやすいです。

# VPS上でリポジトリをクローン
git clone https://github.com/username/myproject.git
cd project

# .envファイルを手動で作成(リポジトリには含まれないため)
nano .env
# → 本番用の環境変数を記入

# バックグラウンドで起動
docker compose up -d --build

--buildオプションを付けることで、キャッシュを使わずに最新のコードからイメージをビルドします。初回デプロイやDockerfileを変更した際には必ず付けるようにしてください。

運用時によく使うコマンド一覧

コマンド 用途
docker compose up -d バックグラウンドで起動
docker compose down コンテナを停止・削除
docker compose logs -f ログをリアルタイム確認
docker compose ps 起動中のサービスを確認
docker compose exec backend bash コンテナ内でシェルを起動
docker compose pull 最新イメージを取得
docker compose restart nginx 特定サービスのみ再起動

ドメイン設定とSSL証明書

独自ドメインを使う場合、お名前.comなどのドメインレジストラでドメインを取得し、AレコードにXサーバーVPSのIPアドレスを設定します。DNS反映には数分〜数時間かかることがあるため、デプロイ作業の前にドメイン設定を済ませておくとスムーズです。

SSL証明書はCertbotを使ってLet’s Encryptから無料で取得できます。Nginxコンテナと組み合わせる場合、certbot/certbotの公式Dockerイメージを使う方法か、ホスト側にCertbotをインストールして証明書ファイルをボリュームでマウントする方法が一般的です。


開発効率をさらに高めるためのNext Steps

ここまで解説した内容を実践すれば、ローカル開発から本番デプロイまでの基本的な流れをDocker Composeで管理できるようになります。

次に取り組むとよい内容として以下が挙げられます。

  • CI/CDパイプラインの構築:GitHub ActionsとDocker Composeを組み合わせ、git pushで自動デプロイする仕組みを作る
  • マルチステージビルドの活用:本番イメージのサイズを削減するためにDockerfileを最適化する
  • ログ・モニタリング:GrafanaやPrometheusをサービスに追加し、コンテナの状態を可視化する
  • プロジェクト管理の効率化:AIを活用したタスク管理ツールの導入で、開発の進捗を一元管理する方法もあります。AI鬼管理のようなサービスはエンジニアのプロジェクト管理をサポートする選択肢の一つです

まずは本記事のサンプル構成をローカルで動かしてみることをおすすめします。docker compose up -dが成功し、ブラウザでフロントエンドにアクセスできた瞬間の達成感は、Docker Composeへの理解を一気に深めてくれるはずです。

関連記事