Docker Compose 入門

Python

Docker Compose(ドッカーコンポーズ) とは、
複数の Dockerコンテナをまとめて管理・実行するためのツール です。

コンテナが複数あるときは通常、docker run コマンドでコンテナを1つずつ起動しますが、
例えば Webアプリを動かすときには以下のように 複数のコンテナ が必要になることが多いです

  • Webサーバー(例:Nginx, Flask, Node.js など)
  • データベース(例:MySQL, PostgreSQL など)
  • キャッシュ(例:Redis, Memcached など)

1.Docker Compose の役割

そこで登場するのが docker-compose.yml ファイル です
このYAMLファイルに「どのイメージを使うか」「ポート」「ボリューム」「依存関係」などを定義しておくと

docker compose up

の一発コマンドで まとめて起動 できます。

メリット

  1. 複数コンテナを一括管理
    → Web, DB, Redis を一度に起動・停止できる
  2. 環境構築の自動化
    → docker-compose.yml を共有すれば、誰でも同じ環境を再現できる
  3. 依存関係の管理
    → 例えば「DBが起動してからWebサーバーを立ち上げる」などが可能

2.インストール方法

Docker を入れただけでは docker compose が必ずしも使えるわけではありません
環境によって追加が必要です


1. Docker Desktop (Windows / macOS)

  • Docker Desktop をインストールすると、最初から docker compose コマンドが同梱されています。
  • 追加インストール不要で、そのまま docker compose up が使えます。

2. Linux (Ubuntuなど)

  • 以前は docker-compose という Python製の別パッケージをインストールする必要がありました
  • 今は Docker CLI plugin として提供されていて、推奨されるのは以下の流れです
# docker compose plugin を追加
sudo apt-get update
sudo apt-get install docker-compose-plugin

インストール後に以下で確認できます

docker compose version

3.サンプルプロジェクト

では、次に複数のコンテナを起動するサンプルとしてFlask(PythonのWebフレームワーク) + PostgreSQLDocker Compose で立ち上げる最小構成例を紹介します

📂 プロジェクト構成

flask-postgres-app/
├─ docker-compose.yml
├─ web/
│   ├─ Dockerfile
│   ├─ requirements.txt
│   └─ app.py

1. docker-compose.yml

複数コンテナを管理するメインファイルです

services:
  web:
    build: ./web
    container_name: flask-app
    ports:
      - "5000:5000"
    depends_on:
      - db

  db:
    image: postgres:14
    container_name: postgres-db
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

このファイルが重要なので分解して解説します


services:
  • アプリを構成する「サービス(コンテナ群)」をまとめるセクションです
  • この下に web や db など、複数のコンテナを定義していきます

Webサービスのコンテナ

  web:
    build: ./web
    container_name: flask-app
    ports:
      - "5000:5000"
    depends_on:
      - db
  • web:
    • Flaskアプリ用のサービス名
  • build: ./web
    • ./web フォルダの Dockerfile を使ってイメージをビルドします。
  • container_name: flask-app
    • コンテナの名前を flask-app に固定します。
    • (指定しないと自動でランダムな名前がつきます)
  • ports:
    • "ホスト側:コンテナ側" という形でポートを公開します。
    • 5000:5000 → ホストPCの http://localhost:5000 にアクセスすると、Flaskのポート 5000 に届きます。
  • depends_on:
    • db コンテナが先に起動してから web を起動するように指定。
    • DBが完全に「準備OK」になるまで待つわけではないので、Flask側で接続リトライを実装することもあります。

DBサービスのコンテナ

  db:
    image: postgres:14
    container_name: postgres-db
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
  • image: postgres:14
    • 公式の PostgreSQL バージョン14のイメージを使います
  • container_name: postgres-db
    • コンテナ名を固定。
  • environment:
    • コンテナ内で使う環境変数を指定します。
      • POSTGRES_USER: DBのユーザー名
      • POSTGRES_PASSWORD: ユーザーのパスワード
      • POSTGRES_DB: 自動で作成されるデータベース名
  • ports:
    • “5432:5432” でホストPCから直接Postgresに接続可能。
    • 例: psql -h localhost -U user -d mydb
  • volumes:
    • postgres_data:/var/lib/postgresql/data
    • データをコンテナの外(Dockerボリューム)に保存。
    • コンテナを削除してもDBデータは残ります。

ボリューム

volumes:
  postgres_data:
  • 名前付きボリュームを定義。
  • 上の db サービスで使っている postgres_data をここで登録しています。
  • 実際のデータはDockerが管理する領域に保存されるので、ホスト側でパス指定しなくても永続化されます。

4.ビルド方法

dovkerでは docker buildした後に dosker runする必要がありました

docker compose up は、必要なら勝手にビルドしてくれます

ただ、yamlファイルの書き方次第で少しだけ動き方が違います


1. build: を指定しているサービス

services:
  web:
    build: ./web
  • 初回 docker compose up
    → Dockerfile が見つかれば自動でビルド → そのまま起動
  • すでにビルド済みイメージがあれば再利用

なのでソースや Dockerfile を変更したときは再ビルドが必要です

  • なぜなら変更しても docker compose up だけだと古いイメージが使われるから
  • その場合は次のどちらかを実行する必要あり
# 起動前に必ずビルド
docker compose up --build

# ビルドだけ実行 
docker compose build 

2. image: のみ指定しているサービス

services:
  db:
    image: postgres:14
  • ビルドは発生せず、ローカルに無ければ Docker Hub から自動で pull

5.起動後の動き

docker compose up

を実行すると

  1. YAMLファイルの内容に従ってすべてのサービス(コンテナ)を起動
  2. デフォルトではフォアグラウンドで実行(ターミナルを占有する)
    • 各コンテナのログがそのままターミナルに出力され続ける
  3. サービスは「停止するまで動き続ける」
    • Webサーバーならサーバープロセスが常駐
    • DBならPostgresが常駐
    • スクレイピング等「1回実行して終わる」コードは、終了したあと Exited 状態のコンテナになります

🔹 停止方法

  • Ctrl + C
    → フォアグラウンドで動いている全コンテナを止める
  • Ctrl + C → 再度 Enter
    → Compose が全コンテナをきれいに削除して終了

🔹 バックグラウンドで動かす場合

docker compose up -d
  • detached(デタッチド)モード
  • ターミナルを占有せず、裏で常駐し続ける
  • ログを見るには: docker compose logs -f

以上が簡単なdocker composeの起動方法とその動きについての解説です

次回以降でさらに細かい操作や管理ができるコマンドを解説したいと思います

コメント