ウェブエンジニア問題集
第4章

Docker Compose入門 — 複数コンテナをまとめて動かす

3
この章の目次開く

Docker Composeは、複数のコンテナをまとめて定義・起動するための仕組みです。

Webアプリ開発では、アプリ本体だけでなく、MySQL、Redis、メール確認用ツールなどを一緒に動かすことがあります。これらを毎回 docker run で起動するのは大変です。Composeを使うと、構成を compose.yaml に書いて、docker compose up でまとめて起動できます。

Docker Composeは「複数コンテナの開発環境」をファイルで再現するための道具です。

compose.yamlの基本

Node.jsアプリとMySQLを動かす例です。

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      DATABASE_HOST: db
      DATABASE_USER: app
      DATABASE_PASSWORD: password
      DATABASE_NAME: app_db
    depends_on:
      - db
 
  db:
    image: mysql:8.4
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: app_db
      MYSQL_USER: app
      MYSQL_PASSWORD: password
    volumes:
      - db-data:/var/lib/mysql
 
volumes:
  db-data:
yaml

このファイルでは、appdb という2つのサービスを定義しています。

項目役割
services起動するコンテナ群を定義する
buildDockerfileからイメージをビルドする
image既存イメージを使う
portsホストとコンテナのポートをつなぐ
environment環境変数を渡す
volumesデータやファイルを永続化・共有する
depends_on起動順の依存関係を指定する

起動・停止する

Composeで起動するには、compose.yaml があるディレクトリで次のコマンドを実行します。

docker compose up
bash

バックグラウンドで起動するなら -d を付けます。

docker compose up -d
bash

停止するには down を使います。

docker compose down
bash

ログを見るには logs を使います。

docker compose logs -f app
bash

サービス名で通信する

Composeでは、同じComposeプロジェクト内のサービス名をホスト名として使えます。上の例では、アプリからMySQLへ接続するときのホスト名は db です。

DATABASE_HOST=db

ここで localhost と書くと、アプリコンテナ自身を指してしまいます。DBコンテナではありません。

depends_onの注意点

depends_on は起動順を指定できますが、「DBが完全に接続可能になるまで待つ」ことを保証するものではありません。

depends_on:
  - db
yaml

この指定は、app より先に db コンテナを起動する、という意味です。DBの初期化完了まで待つわけではないため、アプリ側でリトライしたり、ヘルスチェックを使ったりする設計が必要になることがあります。

ちゃんと使うためのポイント

  • Composeは複数コンテナをまとめて定義する
  • docker compose up で起動、docker compose down で停止
  • アプリからDBへは localhost ではなくサービス名で接続する
  • volumes でDBデータを永続化する
  • depends_on は起動順であり、サービスの準備完了を完全には保証しない