Docker Composeを使えば複数のコンテナをひとつのサービス群として定義し、ネットワークで連携させることができます。Webサーバーとアプリケーション、データベースをまとめて起動できるため、開発環境構築が効率的になります。ここではComposeで複数コンテナを連携させる基本手順を紹介します。
Composeの基本構成
Docker ComposeではYAMLファイル(docker-compose.yml)にサービスを記述します。各サービスはコンテナに対応し、共通ネットワークで通信できます。以下はWebアプリケーション(Nginx+PHP)とMySQLを連携させる例です。
version: "3.9"
services:
app:
build: ./app
container_name: my_app
volumes:
- ./app:/var/www/html
depends_on:
- db
networks:
- backend
web:
image: nginx:1.27-alpine
container_name: my_web
ports:
- "8080:80"
volumes:
- ./app:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- app
networks:
- backend
db:
image: mysql:8.0
container_name: my_db
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: sampledb
MYSQL_USER: sample
MYSQL_PASSWORD: samplepass
volumes:
- db_data:/var/lib/mysql
networks:
- backend
volumes:
db_data:
networks:
backend:
driver: bridge
サービス間の通信
Composeでは同一ネットワーク上のサービス名をホスト名として使えます。例えばアプリからMySQLに接続する場合は、ホスト名を「db」、ユーザー名やパスワードを環境変数に合わせて設定します。
$dsn = "mysql:host=db;dbname=sampledb;charset=utf8mb4";
$user = "sample";
$pass = "samplepass";
起動と停止
定義したコンテナ群は以下のコマンドで一括管理できます。
# 初回ビルドと起動
docker compose up -d --build
# ログを確認
docker compose logs -f
# 停止
docker compose down
よくある応用
– キャッシュサービスの追加:RedisやMemcachedをservicesに追加するだけで簡単に導入可能
– 複数ネットワーク:frontendとbackendを分け、外部公開と内部通信を切り分ける
– ボリューム管理:データ永続化のためにvolumesを定義
まとめ
Docker Composeを使うと、Webアプリ・DB・キャッシュといった複数コンテナを一括で管理できます。サービス定義はYAMLファイルにまとめ、サービス名で通信できる仕組みを活用すれば、開発から本番に近い形の動作確認までスムーズに行えます。