Docker Compose完全ガイド:開発環境の構築から本番運用まで【2026年版】
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.yamlにnginxサービスを追加します:
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)を使う場合は、UpgradeとConnectionヘッダーの設定が必要になります。
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 --versionとdocker 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への理解を一気に深めてくれるはずです。
関連記事
- WordPressは古い?Astroを選ぶべき理由【2026年比較】
- 知識ゼロからClaude×Astroで110記事の爆速サイトを作った全手法 — Claude Code × Astro で一人メディアを構築した実績公開