Docker Compose入門

Dockerを利用したアプリケーションでは、1つのコンテナだけで構成されるケースだけでなく、Webサーバー、アプリケーションサーバー、データベースなど、複数のコンテナを組み合わせて構築するケースが一般的です。

例えば、以下のような構成が考えられます。

クライアント
    ↓
  Nginx
    ↓
 FastAPI
    ↓
PostgreSQL

このような複数コンテナを個別に docker run で起動すると、コンテナ名、ポート、環境変数、ネットワークなどを毎回指定する必要があります。

Docker Composeは、このような複数コンテナで構成されるアプリケーションを、設定ファイルに定義してまとめて管理するための仕組みです。

1. Docker Composeとは

Docker Composeでは、アプリケーションを構成するコンテナを compose.yaml というYAMLファイルに定義します。

例えば、NginxとPostgreSQLを利用する構成であれば、以下のように定義できます。

services:
  nginx:
    image: nginx:latest
    ports:
      - "8080:80"

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: password
      POSTGRES_DB: sample

この設定では、2つのサービスを定義しています。

  • nginx:Nginxコンテナ
  • db:PostgreSQLコンテナ

Composeでは、これらを1つのアプリケーションとして管理できます。

2. compose.yamlの基本構造

現在のDocker Composeでは、基本的に以下のような形式で設定します。

services:
  サービス名:
    image: 使用するイメージ
    ports:
      - "ホスト側ポート:コンテナ側ポート"

services の下に、アプリケーションを構成する各コンテナを定義します。

例えば、

services:
  web:
    image: nginx:latest

  db:
    image: postgres:16

と記述した場合、web と db という2つのサービスが作成されます。

サービス名はCompose内部でコンテナ間通信を行う際のホスト名としても利用できます。

例えば、FastAPIからPostgreSQLへ接続する場合、PostgreSQLのサービス名が db であれば、接続先として以下を指定できます。

db:5432

localhost:5432 ではない点が重要です。

3. Docker Composeの起動

compose.yaml を作成したディレクトリで、以下を実行します。

docker compose up -d

-d を指定すると、バックグラウンドでコンテナが起動します。

起動状態は以下で確認できます。

docker compose ps

ログを確認する場合は、

docker compose logs

特定のサービスだけ確認する場合は、

docker compose logs nginx

のように指定できます。

4. Docker Composeの停止

構成したコンテナを停止・削除する場合は、

docker compose down

を使用します。

docker stop や docker rm を個別に実行する必要はありません。

Docker Composeでは、compose.yaml に定義されたアプリケーション単位でコンテナを管理できます。

5. FastAPIとPostgreSQLを構成する

Docker Composeの特徴を理解するため、FastAPIとPostgreSQLを組み合わせた構成を考えます。

                Docker Compose
┌────────────────────────────────────┐
│                                    │
│   ┌──────────┐                     │
│   │  Nginx   │                     │
│   │  :80     │                     │
│   └────┬─────┘                     │
│        ↓                           │
│   ┌──────────┐                     │
│   │ FastAPI  │                     │
│   │  :8000   │                     │
│   └────┬─────┘                     │
│        ↓                           │
│   ┌──────────┐                     │
│   │PostgreSQL│                     │
│   │  :5432   │                     │
│   └──────────┘                     │
│                                    │
└────────────────────────────────────┘

この構成では、3つのサービスを定義します。

services:
  nginx:
    image: nginx:latest
    ports:
      - "8080:80"
    depends_on:
      - api

  api:
    build: ./api
    environment:
      DB_HOST: db
      DB_PORT: 5432
      DB_NAME: sample
      DB_USER: app
      DB_PASSWORD: password
    depends_on:
      - db

  db:
    image: postgres:16
    environment:
      POSTGRES_DB: sample
      POSTGRES_USER: app
      POSTGRES_PASSWORD: password

ここでは、

  • nginx が外部からのHTTPリクエストを受け取る
  • api がFastAPIアプリケーションを実行する
  • db がPostgreSQLを実行する

という役割分担になります。

6. build と image の違い

Composeでは、コンテナの作成方法として image と build を使用できます。

image

既存のDockerイメージを使用します。

db:
  image: postgres:16

Docker Hubなどに存在するイメージをそのまま利用できます。

build

Dockerfileからイメージを作成します。

api:
  build: ./api

例えば、

project/
├── compose.yaml
└── api/
    ├── Dockerfile
    └── main.py

という構成の場合、

api:
  build: ./api

とすることで、apiディレクトリにあるDockerfileを使用してイメージをビルドできます。

7. 環境変数の設定

PostgreSQLなどのサービスでは、環境変数によって初期設定を指定できます。

environment:
  POSTGRES_DB: sample
  POSTGRES_USER: app
  POSTGRES_PASSWORD: password

FastAPI側からPostgreSQLへ接続する場合も、環境変数を利用できます。

environment:
  DB_HOST: db
  DB_PORT: 5432
  DB_NAME: sample
  DB_USER: app
  DB_PASSWORD: password

ここで DB_HOST が db になっているのは、Composeによってサービス間のネットワークが構成されるためです。

8. ポート公開とコンテナ間通信

以下の設定を指定すると、

ports:
  - "8080:80"

ホストOSの8080番ポートから、コンテナの80番ポートへアクセスできます。

http://localhost:8080
       ↓
ホスト :8080
       ↓
Nginx :80

一方、FastAPIからPostgreSQLへ接続する場合、PostgreSQLの5432番ポートをホストへ公開する必要はありません。

FastAPI
   ↓
db:5432
   ↓
PostgreSQL

同じComposeネットワーク内であれば、サービス名を利用して通信できます。

この仕組みにより、外部へ公開する必要のないデータベースポートを閉じた状態で構成できます。

9. よく使用するコマンド

Docker Composeでは、以下のコマンドを使用する機会が多くなります。

# コンテナを起動
docker compose up -d

# コンテナの状態を確認
docker compose ps

# ログを確認
docker compose logs

# 特定サービスのログを確認
docker compose logs api

# コンテナを再起動
docker compose restart

# コンテナを停止・削除
docker compose down

# イメージを再ビルドして起動
docker compose up -d --build

設定やDockerfileを変更した場合は、

docker compose up -d --build

を使用すると、イメージの再ビルドとコンテナの起動をまとめて実行できます。

10. Docker Composeを利用するメリット

Docker Composeを利用すると、複数コンテナの構成をYAMLファイルとして管理できます。

主なメリットは以下のとおりです。

  • 複数コンテナをまとめて起動できる
  • コンテナ間のネットワークを自動的に構成できる
  • 環境変数を設定ファイルで管理できる
  • Dockerfileと組み合わせてアプリケーション環境を構築できる
  • 開発環境を他の環境へ再現しやすい
  • 起動・停止・ログ確認などをComposeコマンドで統一できる

特に、Nginx、FastAPI、PostgreSQLのような複数のサービスを利用するアプリケーションでは、各コンテナを個別に管理するよりも、Composeで構成をまとめて管理する方が運用しやすくなります。

まとめ

Docker Composeは、複数のコンテナから構成されるアプリケーションを定義・起動・停止するための仕組みです。

compose.yaml にサービス、イメージ、ポート、環境変数などを定義することで、アプリケーション全体の構成をコードとして管理できます。

単一コンテナの操作では docker run が基本となりますが、複数コンテナの構成ではDocker Composeを利用することで、環境構築と管理を大幅に簡略化できます。