Docker Composeを使って複数コンテナをまとめて管理する方法
Docker Composeは、複数のコンテナをまとめて管理できる非常に強力なツールです。
これにより、開発・本番環境を問わず、システム全体を効率的に構築・運用できます。
今回は、Docker Composeの基本的な使い方と複数コンテナの連携を、初心者の方にもわかりやすくご紹介いたします。
公式ドキュメントもあわせてご参照ください:Docker公式Composeドキュメント
Docker Composeとは何か
Docker Composeは、複数のコンテナをまとめて定義し、操作できるツールです。
単体のコンテナ起動とは異なり、データベースやアプリケーションサーバーなど、関連するサービスをまとめて一括管理できることが最大の魅力です。
| 項目 | 内容 |
|---|---|
| 使用ファイル | docker-compose.yml |
| 主なコマンド | docker-compose up, docker-compose down |
| メリット | 複数コンテナの一括起動、設定管理、ネットワーク自動構築 |
インストール方法
Docker Desktopをインストールしている場合、Composeも一緒にインストールされています。
個別にインストールしたい場合は、以下を参考にしてください。
公式インストールガイド:Compose installation guide
基本的な構成ファイル:docker-compose.yml
Composeを使うには、まず docker-compose.yml ファイルを作成する必要があります。
このファイルには、起動したいサービスごとの設定を記述します。
以下に最もシンプルな例を示します。
yamlversion: "3.9" # Composeファイルのバージョン指定
services:
web:
image: nginx:latest
ports:
- "8080:80"
この例では、Nginxの最新イメージを使って、ポート8080でアクセスできるWebサーバーを起動しています。
Composeの基本コマンド
Docker Composeでは、以下のコマンドが基本になります。
| コマンド | 内容 |
|---|---|
docker-compose up | コンテナを起動(ビルドも自動で実施) |
docker-compose down | コンテナを停止して破棄 |
docker-compose ps | 実行中のサービス一覧を表示 |
docker-compose logs | サービスのログを確認 |
docker-compose build | イメージをビルド |
実際にコマンドを打つ例を見てみましょう。
bash# サービスを起動(バックグラウンドで実行)
docker-compose up -d
# コンテナを停止してネットワークなども破棄
docker-compose down
# 起動中サービスを一覧表示
docker-compose ps
複数サービスを定義する方法
実際のアプリケーションでは、Webサーバーとデータベースを同時に起動したいケースが多いです。
例えば、Nginx + MySQL の場合、次のように記述できます。
yamlversion: "3.9"
services:
web:
image: nginx:latest
ports:
- "8080:80"
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
この設定では、webサービスがdbサービスに依存して起動順が制御されます。
depends_onの詳細は公式リファレンスをご覧ください:depends_on - Compose file reference
ネットワーク設定を理解する
Docker Composeでは、デフォルトで専用のネットワークが作成されます。
そのため、異なるサービス間でホスト名(サービス名)を使って通信できます。
例えば、上記の例ではwebからdbというホスト名でMySQLにアクセス可能です。
さらに、カスタムネットワークを明示的に定義することも可能です。
yamlversion: "3.9"
services:
web:
image: nginx
networks:
- mynetwork
db:
image: mysql
networks:
- mynetwork
networks:
mynetwork:
driver: bridge
これにより、複数プロジェクト間でネットワークを分離管理できるようになります。
ボリューム設定を理解する
データをコンテナ削除後も保持したい場合は、ボリューム設定を活用します。
yamlversion: "3.9"
services:
db:
image: mysql:5.7
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
これで、データベースデータがホスト側に保存され、コンテナを消してもデータが消えません。
ボリュームの詳細はこちらをご参照ください:Docker volumes公式ドキュメント
環境変数を使った設定
Composeファイルでは、環境変数(.envファイル) を使って設定値を管理できます。
例えば以下のように .env ファイルを用意します。
iniMYSQL_ROOT_PASSWORD=mysecretpassword
そしてComposeファイル内では次のように参照できます。
yamlversion: "3.9"
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
これにより、設定値をファイル分離して管理できるので、セキュリティやメンテナンス性が向上します。
開発・本番環境を切り替える方法
通常、開発環境と本番環境では使用する設定が異なります。
Docker Composeでは、複数のComposeファイルを組み合わせて管理できます。
例えば次のようなファイル構成にすることが一般的です。
plaintextdocker-compose.yml # 共通設定
docker-compose.override.yml # 開発用設定
docker-compose.prod.yml # 本番用設定
開発用のdocker-compose.override.ymlは、docker-compose upコマンド実行時に自動で読み込まれる仕様です。
一方、本番用設定を使う場合は、明示的にファイルを指定して起動します。
bashdocker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
ファイルを複数指定すると、後に指定したファイルが優先されます。
つまり、共通設定に対して本番用の上書きを行う流れになります。
参考リンク:複数Composeファイルの活用方法
サービスを柔軟に制御するprofiles機能
Compose v3.9以降では、profilesという機能も追加されています。
これは、起動するサービスをプロファイル単位で制御できる機能です。
たとえば、開発時だけ使うモックサーバーなどをプロファイルに分けられます。
yamlversion: "3.9"
services:
web:
image: nginx
mock-server:
image: my-mock-server
profiles:
- dev
起動時に以下のように指定できます。
bashdocker-compose --profile dev up
これにより、本番環境には不要なサービスを簡単に除外できるようになります。
公式ドキュメントもぜひご参照ください:profiles機能について
コンテナの正常性をチェックするhealthcheck
運用面で非常に重要なのが、コンテナのヘルスチェック機能です。
サービスが正しく動いているかをチェックし、異常時にはリトライ処理などに活かせます。
設定例は以下の通りです。
yamlversion: "3.9"
services:
db:
image: mysql:5.7
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 30s
timeout: 10s
retries: 5
この設定では、30秒ごとにMySQLへの接続確認を行い、5回失敗したら異常と判定します。
コンテナのヘルスチェック詳細:Docker Healthcheckガイド
サービス間で環境変数を共有する方法
複数コンテナ間で共通設定を持たせたい場合は、環境変数を共有できます。
env_fileを使う方法が簡単です。
yamlversion: "3.9"
services:
web:
image: nginx
env_file:
- ./common.env
api:
image: node
env_file:
- ./common.env
この例では、common.envファイルの内容が、両方のサービスに適用されます。
サービス間で設定を統一できるため、環境構築ミスを防ぎやすくなります。
ビルド用DockerfileをComposeから直接指定する
アプリケーションを独自ビルドしたい場合、Composeから直接Dockerfileを指定することも可能です。
yamlversion: "3.9"
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
この設定では、プロジェクトルートにあるDockerfile.devを使ってイメージをビルドし、その上でコンテナを起動します。
contextとdockerfileの使い方:Compose buildオプション
実際の運用パターン例
ここでは、開発・本番両方で運用する具体例をご紹介します。
1. 開発環境
bashdocker-compose up -d
- overrideファイルでボリュームマウント
- ホットリロード対応(Node.jsなど)
2. 本番環境
bashdocker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
- 本番ビルドイメージ使用
- ボリュームマウント無し
- キャッシュ戦略最適化
よくあるトラブルと対策
Docker Composeを使っていると、いくつか典型的なトラブルに遭遇することもあります。
| 問題 | 原因 | 解決策 |
|---|---|---|
| コンテナが起動しない | depends_onだけではサービスの起動完了は保証しない | healthcheckを設定してリトライ設計にする |
| ネットワークで通信できない | サービス名を間違えている | services間ではサービス名がホスト名となる |
| 環境変数が反映されない | .envファイルの位置・記述ミス | ファイルの位置とフォーマットを再確認 |
まとめ
Docker Composeは、複数のコンテナをまとめて定義・操作できるツールであり、開発・運用において非常に大きな効果を発揮いたします。
この記事では、基本的な使い方から、応用的な活用方法まで幅広くご紹介してまいりました。
ポイントを振り返ってみましょう。
| カテゴリ | 内容 |
|---|---|
| 基本操作 | docker-compose.ymlで複数サービスを管理、upとdownで起動停止 |
| ネットワーク・ボリューム管理 | 自動生成されるネットワーク、データ永続化のためのボリューム活用 |
| 環境変数管理 | .envファイルやenv_fileで設定値の外部化 |
| 複数環境対応 | 開発用・本番用のComposeファイルを切り替えて管理 |
| profiles機能 | 必要なサービスだけを選択的に起動できる柔軟性 |
| healthcheck機能 | コンテナの正常性をチェックし、堅牢な運用を実現 |
| カスタムビルド | 独自Dockerfileによるイメージ作成とCompose連携 |
| トラブル対策 | 通信不良や環境設定ミスへの基本的な対応法 |
Composeの導入により、一貫性のある環境構築と運用効率の劇的な向上が期待できます。
また、開発だけでなく、本番環境でも活用できる点は大きな強みであり、特にチーム開発・CI/CDパイプラインと相性が良い点も魅力です。
これからDocker Composeを使い始める方は、まず小さなプロジェクトで練習し、次第にサービス数を増やしていくと、自然と使いこなせるようになります。
さらに詳しい情報は、以下の公式リンクも活用しながら、ぜひ実際に手を動かして学んでみてください。
Docker Composeを味方につければ、開発も運用も、もっと自由に、もっと強くなります。
皆様のDockerライフが素晴らしいものになることを心より願っております!
articleDocker イメージ署名と検証:cosign でサプライチェーンを防衛する運用手順
articleDocker で DNS 解決に失敗する時の原因と対処:overlay2・systemd-resolved・WSL2 対応
articleDocker を用いた統一ローカル環境:新人オンボーディングを 1 日 → 1 時間へ
articleDocker で Dev Container を構築:VS Code/Codespaces で即戦力環境を配布
articleDocker マルチステージビルド設計大全:テスト分離・依存最小化・キャッシュ戦略
articleDocker コマンド早見表:build/run/exec/logs/prune を 1 枚で網羅
articlePHP 基本文法を 90 分で速習:型宣言・null 合体・スプレッド構文の実践
articleHaystack チートシート:主要クラス・関数・CLI コマンド一枚まとめ
articleNotebookLM 活用事例:営業提案書の下書きと顧客要件の整理を自動化
articleGrok RAG 設計入門:社内ドキュメント検索を高精度にする構成パターン
articlegpt-oss 運用監視ダッシュボード設計:Prometheus/Grafana/OTel で可観測性強化
articleNode.js 標準テストランナー完全理解:`node:test` がもたらす新しい DX
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来