Docker Composeは、複数のDockerコンテナを定義・管理し、コマンド1つでまとめて起動するためのツールです。実際のアプリケーション開発では、Webサーバ・データベース・キャッシュサーバなど、複数のコンテナを組み合わせて利用するケースが一般的です。
この記事では、Docker Composeの基本概念と、Nginx+MySQLのマルチコンテナ環境を構築する実践例を解説します。
Docker Composeとは
Docker Composeは、複数のDockerコンテナの構成をYAMLファイル(docker-compose.yml)に定義し、docker compose upコマンド1つでまとめて起動できるツールです。
単一コンテナの起動はdocker runで行えますが、実用的なシステムでは複数のコンテナを連携させる構成が主流です。Docker Composeを使うことで、以下のメリットが得られます。
- 一括操作: 複数コンテナの起動・停止をコマンド1つで実行できる
- 構成の可視化: コンテナ間の関係を
docker-compose.ymlで一元管理できる - 環境変数の管理: データベースのパスワードなどの設定値をファイル内に定義できる
- ネットワーク管理: コンテナ間のネットワーク接続を簡潔に定義できる
Docker Compose実践
動作確認
Docker Composeは、Docker Desktopをインストールした際に同梱されています。以下のコマンドでヘルプが表示されることを確認します。
docker composeUsage: docker compose [OPTIONS] COMMAND
Define and run multi-container applications with Docker
Options:
--all-resources Include all resources, even those not
used by services
....構築する環境
今回は、Nginx(Webサーバ)+MySQL(データベース)で構成された簡易Webサーバ環境を構築します。
必要ファイルの準備
以下のディレクトリ構成でファイルを準備します。
demo-compose/
├── docker-compose.yml
└── nginx/
└── index.htmldocker-compose.yml
docker-compose.ymlに起動するコンテナの構成を定義します。
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./nginx:/usr/share/nginx/html:ro
depends_on:
- db
networks:
- demo-net
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: demo_db
MYSQL_USER: demo_user
MYSQL_PASSWORD: demopass
ports:
- "3306:3306"
networks:
- demo-net
networks:
demo-net:
driver: bridge各設定項目の説明は以下の通りです。
| 項目 | 説明 |
|---|---|
services | 起動するコンテナの定義。今回はweb(Nginx)とdb(MySQL)を定義 |
image | 使用するDockerイメージ。Docker Hubから自動的にPullされる |
ports | ホストとコンテナのポートマッピング |
volumes | ホストのディレクトリをコンテナにマウント |
depends_on | コンテナの起動順序を制御(dbが先に起動してからwebを起動) |
networks | コンテナ間で通信するためのネットワーク定義 |
environment | コンテナ内の環境変数を設定 |
今回はdemo-netというブリッジネットワークを定義し、NginxコンテナとMySQLコンテナ間の通信を可能にしています。
index.html
Nginxで表示するHTMLファイルをnginx/ディレクトリに配置します。
<!DOCTYPE html>
<html>
<head>
<title>Docker Compose Demo</title>
</head>
<body>
<h1>Hello, Docker Compose with Nginx and MySQL!</h1>
</body>
</html>起動
docker-compose.ymlが存在するディレクトリで以下のコマンドを実行します。-dオプションにより、バックグラウンドで起動されます。
docker compose up -d作成されたイメージを確認します。
docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE
mysql 8.0 bfeba808a667 11 days ago 1.07GB
nginx latest 84ec966e61a8 2 weeks ago 279MB起動中のコンテナを確認します。
docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eba54eeefc46 nginx:latest "/docker-entrypoint.…" 16 hours ago Up 10 seconds 0.0.0.0:8080->80/tcp docker_compose-web-1
670d149771c8 mysql:8.0 "docker-entrypoint.s…" 16 hours ago Up 10 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp docker_compose-db-1NginxとMySQLの両コンテナが起動していることが確認できます。
ブラウザでhttp://localhost:8080にアクセスすると、index.htmlの内容が表示されます。

このように、複数コンテナの起動をコマンド1つで実行できるのがDocker Composeの大きなメリットです。
Docker Composeを使わない場合との比較
同じ構成をDocker Composeを使わずに構築する場合、以下の3つのコマンドが必要になります。
# 1. ネットワークの作成
docker network create demo-net
# 2. MySQLコンテナの起動
docker run -d --name demo-mysql --network demo-net \
-e MYSQL_ROOT_PASSWORD=rootpass \
-e MYSQL_DATABASE=demo_db \
-e MYSQL_USER=demo_user \
-e MYSQL_PASSWORD=demopass \
-p 3306:3306 mysql:8.0
# 3. Nginxコンテナの起動
docker run -d --name demo-nginx --network demo-net \
-p 8080:80 \
-v "$(pwd)/nginx:/usr/share/nginx/html:ro" \
nginx:latestDocker Composeとの比較をまとめると、以下の通りです。
| 観点 | Docker Compose | docker runの個別実行 |
|---|---|---|
| コマンド数 | 1コマンド | 構成要素ごとに個別コマンドが必要 |
| 構成管理 | YAMLファイルで一元管理 | コマンド履歴に依存しがち |
| 環境変数 | ファイル内に記述 | コマンドライン引数で指定 |
| 再現性 | 同一のYAMLファイルで再現可能 | コマンドの再実行が必要 |
まとめ
この記事では、Docker Composeの基本概念と実践的な使い方を解説しました。
- Docker Composeは複数コンテナを
docker-compose.ymlで一元管理するツール servicesでコンテナ定義、networksでコンテナ間通信、volumesでファイル共有を設定するdocker compose up -dでバックグラウンド起動、docker compose downで一括停止が可能- 個別の
docker runと比較して、構成の可視化・再現性・運用効率が大幅に向上する
複数コンテナを組み合わせたシステム構築では、Docker Composeは必須ともいえるツールです。ぜひ積極的に活用してください。