こんにちは、たねやつです。
これまでは、docker runコマンドを使って単一のコンテナを起動・管理してきました。しかし、実際のアプリケーションでは、Webサーバー、データベース、キャッシュサーバーなど、複数のコンテナが連携して動作することがほとんどです。
複数のコンテナをdocker runで一つずつ起動し、それらをネットワークで繋ぎ、管理するのは非常に手間がかかります。そこで登場するのがDocker Composeです。
- 前の記事
- この記事でできること
- 事前に必要なもの
- Docker Composeとは?
- docker-compose.ymlを作成する
- Docker Composeでアプリケーションを起動する
- 最後に
- 次の記事
前の記事
この記事でできること
- 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 upとdocker 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)を連携させてみましょう。