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

と記述した場合、webdb という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 stopdocker 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. buildimage の違い

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

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_HOSTdb になっているのは、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を利用することで、環境構築と管理を大幅に簡略化できます。