【Docker】Composeで複数コンテナを連携させる方法

Docker

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ファイルにまとめ、サービス名で通信できる仕組みを活用すれば、開発から本番に近い形の動作確認までスムーズに行えます。