たねやつの木

Photographs, Keyboards and Programming

【Dockerを知る:第5回】 Docker Composeで複数のコンテナを管理する

こんにちは、たねやつです。

これまでは、docker runコマンドを使って単一のコンテナを起動・管理してきました。しかし、実際のアプリケーションでは、Webサーバー、データベース、キャッシュサーバーなど、複数のコンテナが連携して動作することがほとんどです。 複数のコンテナをdocker runで一つずつ起動し、それらをネットワークで繋ぎ、管理するのは非常に手間がかかります。そこで登場するのがDocker Composeです。

前の記事

www.taneyats.com

この記事でできること

  • Docker Composeの役割とメリットを理解できる。
  • docker-compose.ymlファイルの基本的な書き方を習得する。
  • docker compose upコマンドで、定義ファイルからアプリケーションを起動できるようになる。

事前に必要なもの

  • これまで作成してきたFastAPIアプリケーションのファイル (main.py, Dockerfile, requirements.txt)

Docker Composeとは?

Docker Composeは、複数のコンテナで構成されるアプリケーションを、単一のYAMLファイルで定義し、管理するためのツールです。 docker runで指定していたような、イメージ名、ポートフォワーディング、ボリューム、ネットワークなどの設定を、docker-compose.ymlというファイルにまとめて記述できます。

Docker Composeを使うメリット

  • 構成管理の容易さ: アプリケーションの構成(どのコンテナをどうやって動かすか)をコードとして(IaC: Infrastructure as Code)管理できます。これにより、誰が実行しても同じ構成を再現できます。
  • コマンドの簡略化: 長くて複雑になりがちなdocker runコマンドを打つ必要がなくなります。代わりにdocker compose updocker compose downというシンプルなコマンドで、アプリケーション全体の起動・停止ができます。
  • ネットワークの自動化: Composeで起動したコンテナは、自動的に同じネットワークに接続されます。これにより、コンテナ同士がサービス名で簡単に通信できるようになります。

docker-compose.ymlを作成する

それでは、前回で作成してきたFastAPIアプリケーションを、Docker Composeで管理できるようにしてみましょう。 プロジェクトのルートディレクトリにdocker-compose.ymlという名前のファイルを新規作成し、以下の内容を記述してください。

services:
  app:
    build: .
    ports:
      - "8000:80"
    volumes:
      - .:/app

各項目の意味を解説します。

キー 説明
version 使用するDocker Composeファイルのバージョンを指定します。
services 管理するコンテナ(サービス)の定義をまとめるセクションです。
app サービスの論理的な名前。コンテナ間通信でホスト名として利用できます。
build コンテナイメージのビルド方法を指定します。.はカレントディレクトリのDockerfileを使うという意味です。
ports ポートフォワーディングの設定。"ホストのポート:コンテナのポート"で記述します。
volumes ボリュームマウントの設定。"ホストのパス:コンテナのパス"で記述します。コードの変更を即時反映させるために使います。

Docker Composeでアプリケーションを起動する

docker-compose.ymlが完成したら、コマンドを実行してみましょう。

起動 (docker compose up)

docker-compose.ymlがあるディレクトリで、以下のコマンドを実行します。

docker compose up -d

docker compose upコマンドの主要なオプションは以下の通りです。

コマンド/オプション 説明
docker compose up docker-compose.ymlの内容に基づいて、サービス(コンテナ)を起動します。
-d デタッチドモードで、バックグラウンドで実行します。

初回実行時は、Dockerfileに基づいてイメージのビルドが実行され、その後コンテナが起動します。 ブラウザで http://localhost:8000 にアクセスし、APIが動作していることを確認してください。

動作確認(ボリュームマウント)

ボリュームマウントが機能しているか試してみましょう。 main.pyのメッセージを以下のように変更して保存します。

# main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    # メッセージを変更
    return {"message": "Hello from Docker Compose!"}

--reloadオプションを付けてUvicornを起動しているので、ファイルを保存するとコンテナ内のサーバーが自動で再起動します。 再度ブラウザで http://localhost:8000 にアクセス(またはリロード)してください。 メッセージがHello from Docker Compose!に変わっていることが確認できるはずです。コンテナの再ビルドや再起動なしにコードが反映されました!

停止 (docker compose down)

アプリケーションを停止するには、以下のコマンドを実行します。

docker compose down

このコマンドは、docker-compose.ymlで定義されたコンテナを停止し、削除します。作成されたネットワークなども一緒にクリーンアップしてくれます。

最後に

お疲れ様でした!今回は、Docker Composeを使ってアプリケーションの構成をYAMLファイルに定義し、管理する方法を学びました。 docker runの長いコマンドから解放され、docker compose upだけで開発環境が立ち上がる手軽さと、ボリュームマウントによる開発効率の向上を実感いただけたかと思います。

次回は、Docker Composeの真価が発揮される、複数コンテナの連携に挑戦します。FastAPIアプリケーションにデータベース(PostgreSQL)を連携させてみましょう。

次の記事

www.taneyats.com