はじめに
この記事では、Docker Composeを使用してマルチコンテナを実行する方法について説明し、基本的な内容、Composeファイルの構造、サービスの定義、ネットワークやボリュームの設定、そしてアプリケーションライフサイクルの管理についてカバーします。
Composeファイルの構造
Docker Composeファイルは、マルチコンテナのアプリケーションに必要なサービス、ネットワーク、およびボリュームを定義するYAMLファイルです。ファイルは通常、プロジェクトディレクトリのルートにdocker-compose.yml
という名前で配置されます。Composeファイルの基本的な構造は、次のトップレベル要素を含みます。
-
version
Composeファイルのフォーマットバージョンを指定します。異なるバージョンは、異なる機能と構文をサポートしています。 -
services
アプリケーションを構成するサービスのリスト。各サービスは、Dockerイメージまたはビルドコンテキストで定義されるコンテナに対応します。 -
networks
(オプション)
アプリケーションのカスタムネットワークのリスト。ネットワークは、サービス間の通信を可能にし、特定のドライバとオプションで構成することができます。 -
volumes
(オプション)
アプリケーションの名前付きボリュームのリスト。ボリュームは、コンテナの永続的なストレージを提供し、サービス間でデータを共有するために使用できます。
サービスの定義
サービスはアプリケーションの中心的なコンポーネントであり、Composeファイルのサービスセクション内で定義されます。各サービスはコンテナを表し、Dockerイメージまたはビルドコンテキストから構築されます。サービスを定義するには、次の手順に従ってください。
services
セクションの下に、サービスの説明的な名前(例:web
、database
、redis
)を持つ新しいエントリを追加image
キーを使用してサービスに使用するDockerイメージを指定。Docker Hubから公式イメージを使用するか、プライベートリポジトリからカスタムイメージを使用することができます。- (オプション)カスタムイメージをビルドする必要がある場合は、
image
キーの代わりにbuild
キーを使用し、ビルドコンテキスト(通常はDockerfileへのパス)を指定 - (オプション) 現在のサービスに依存する任意のサービスを指定するために
depends_on
キーを使用。これにより、依存するサービスが現在のサービスの前に開始されるようになります。 - (オプション) ポート、ボリューム、環境、ネットワークなど、サービスに対して任意の追加設定を構成
以下は、相互依存関係を持つWebサービス、Redisサービス、およびPostgreSQLサービスを定義するComposeファイルの例です。
version: '3.9'
services:
web:
image: nginx:latest
ports:
- "80:80"
depends_on:
- app
app:
build: ./app
depends_on:
- redis
- db
redis:
image: redis:alpine
db:
image: postgres:13-alpine
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydb
この例では、web
サービスがapp
サービスに依存しており、app
サービスはredis
サービスとdb
サービスの両方に依存しています。この構成により、サービスが正しい順序で開始されることが保証されます。例では、redis
とdb
が最初に開始され、次にapp
が開始され、最後にweb
が開始されます。
ネットワークの構成
デフォルトでは、Docker Composeはアプリケーションの単一のデフォルトネットワークを作成し、全てのサービスをそれに接続します。ただし、より詳細な制御のためにカスタムネットワークを定義することができます。カスタムネットワークを作成するには、次の手順に従ってください。
networks
セクションの下に、ネットワークの説明的な名前(例:frontend
、backend
)を持つ新しいエントリを追加- (オプション)
driver
およびdriver_opts
キーを使用してネットワークドライバとオプションを指定 services
セクションで、カスタムネットワークに接続する各サービスに対してnetworks
キーを使用。ネットワーク名をネットワークキーのリストアイテムとして指定します。
以下は、異なるサービスをそれらに接続する2つのカスタムネットワークを定義するComposeファイルの例です。
version: '3.9'
services:
web:
image: nginx:latest
ports:
- "80:80"
depends_on:
- app
networks:
- frontend
app:
build: ./app
depends_on:
- redis
- db
networks:
- frontend
- backend
redis:
image: redis:alpine
networks:
- backend
db:
image: postgres:13-alpine
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydb
networks:
- backend
networks:
frontend:
backend:
この例では、2つのカスタムネットワークfrontend
およびbackend
を作成しました。 web
およびapp
サービスはfrontend
ネットワークに接続され、 app
、redis
、およびdbサービスはbackendネットワークに接続されています。この構成により、アプリケーションのフロントエンドとバックエンドコンポーネントが分離されます。
ボリュームの構成
Docker Composeを使用すると、名前付きボリュームを作成してデータを永続化し、サービス間で共有することができます。名前付きボリュームを作成するには、次の手順に従ってください。
volumes
セクションの下に、ボリュームの説明的な名前(例:db_data
、app_uploads
)を持つ新しいエントリを追加services
セクションで、名前付きボリュームをマウントする各サービスに対してvolumes
キーを使用します。形式は<source>:<target>
のソース(ボリューム名)とターゲット(コンテナ内のマウントポイント)を指定します。
以下は、名前付きボリュームを定義し、それをPostgreSQLサービスにマウントするComposeファイルの例です。
version: '3.9'
services:
web:
image: nginx:latest
ports:
- "80:80"
depends_on:
- app
app:
build: ./app
depends_on:
- redis
- db
redis:
image: redis:alpine
db:
image: postgres:13-alpine
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydb
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
この例では、db_data
という名前の名前付きボリュームを作成し、それをdb
サービスコンテナ内の/var/lib/postgresql/data
ディレクトリにマウントしました。この構成により、PostgreSQLデータがコンテナの再起動間でも永続化され、必要に応じて複数のサービス間で共有できるようになります。
Docker Composeを使用したアプリケーションのビルドと実行
Dockerイメージのビルド
ComposeファイルがカスタムDockerイメージのビルドを必要とするサービスを指定している場合、アプリケーションを起動する前にこれらのイメージをビルドする必要があります。Composeファイルで定義された必要なサービスに対応する全てのイメージをビルドするには、 docker-compose.yml
ファイルがある同じディレクトリで次のコマンドを実行します。
$ docker-compose build
このコマンドは、Composeファイルで定義されたサービスに応じて、必要な全てのイメージをビルドします。特定のサービスのみをビルドする場合は、 build
コマンドの後にサービス名を指定できます。
$ docker-compose build <service_name>
サービスとコンテナの起動
イメージがビルドされたら、Docker Composeを使用してアプリケーションを起動できます。サービスを起動し、それらに対応するコンテナを作成するには、次のコマンドを実行します。
$ docker-compose up
デフォルトでは、このコマンドは前面で実行され、全てのサービスのログがコンソールに表示されます。デタッチドモード(バックグラウンド)でサービスを実行するには、 -d
フラグを使用します。
$ docker-compose up -d
また、 --scale
フラグに続いてサービス名とレプリカ数を指定することで、各サービスの望ましいスケールを指定できます。
$ docker-compose up --scale <service_name>=<number_of_replicas>
コンテナの停止と削除
サービスを停止し、関連するコンテナを削除するには、次のコマンドを使用します。
$ docker-compose down
このコマンドは、実行中の全てのサービスを停止し、コンテナを削除し、Composeファイルで定義されたネットワークとボリュームも削除します。コンテナ、ネットワーク、およびボリュームを削除せずにサービスを停止する場合は、代わりにstop
コマンドを使用します。
$ docker-compose stop
サービスのスケーリング
アプリケーションが水平スケーリングを必要とする場合、Docker Composeを使用すると、各サービスのレプリカ数を簡単に調整できます。特定のサービスをスケールするには、 scale
コマンドを使用して、サービス名に続いて望むレプリカ数を指定します。
$ docker-compose up -d --scale <service_name>=<number_of_replicas>
サービスのスケーリングには、アプリケーションの性質に応じて、負荷分散やデータ分割などの追加の構成が必要な場合があることに注意してください。