3.1 ファイル compose.yaml
ファイル compose.yaml
(または以下の別名のいずれか: docker-compose.yaml
, docker-compose.yml
, compose.yml
)は、Docker Composeがマルチコンテナアプリケーションを定義・管理するために使用する主要な構成ファイルです。それは、どのコンテナ(サービス)が起動されるべきか、互いにどうやって連携するのか、そしてどのリソースが必要なのかを記述します。
この講義では、一貫性を持たせるために、compose.yaml
を使用します。これは、最新バージョンのDocker Composeで推奨されている形式です。
compose.yaml
ファイルの構造
compose.yaml
ファイルは複数のセクションで構成され、それぞれがアプリケーションの構成の異なる側面を記述しています。主なセクションには次のものが含まれます:
- version: Composeファイルのバージョンを指定(例:
'3.9'
)。 - services: コンテナ(サービス)、その設定および依存関係を記述。
- volumes: コンテナとホスト間でデータを保存するためのボリュームを定義。
- networks: サービス間の通信を可能にするネットワークを設定。
3.2 主要なディレクティブ
1. version
versionディレクティブは、compose.yaml
ファイルで使用されるDocker Composeの構文バージョンを指定します。この記事執筆時点で一番新しいのはバージョン3で、特にその更新版である3.8や3.9です。
version: '3.9'
2. services
servicesセクションは、Composeが作成して起動するべきコンテナを定義します。各サービスは、特定の構成を持つ個別のコンテナを表します。
例:
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
この例では、web
とdb
の2つのサービスが定義されています。web
サービスはnginx:latest
イメージを使用し、ポート80を開きます。db
サービスはmongo:latest
イメージを使用し、データ保存用のボリュームをマウントしています。
3. volumes
volumesセクションは、データ保存のためにコンテナにマウントできるボリュームを定義します。これは、コンテナを再起動してもデータを保持するために便利です。
例:
volumes:
mongo-data:
4. networks
networksセクションは、コンテナが動作するカスタムネットワークを定義するために使用されます。これにより、分離とネットワーク接続の設定が可能になります。ネットワークが指定されていない場合、Docker Composeはデフォルトネットワークを作成し、すべてのサービスがそのネットワークに接続されます。
例:
networks:
front-end:
back-end:
3.3 サービス設定用ディレクティブ
サービス設定の主なディレクティブ:
1. image
imageディレクティブは、コンテナ作成に使用されるイメージを指定します。
例:
services:
web:
image: nginx:latest
2. build
buildディレクティブは、イメージのビルドに使用するDockerfileのパスを指定します。
例:
services:
app:
build: ./app
3. ports
portsディレクティブは、ホストマシンからコンテナへ転送される開放ポートを指定します。
例:
services:
web:
image: nginx:latest
ports:
- "80:80"
4. volumes
volumesディレクティブは、データをコンテナ間で保存するためのボリュームをマウントします。
例:
services:
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
5. environment
environmentディレクティブは、コンテナ用の環境変数を設定します。
例:
services:
app:
image: myapp:latest
environment:
- NODE_ENV=production
- API_KEY=1234567890
6. depends_on
depends_onディレクティブは、このサービスが他のサービスに依存しており、それらの後に起動する必要があることを示します。
重要!
サービスを起動する際、その動作に必要な全てのサービスが完全に準備されている保証はありません。それらは起動されますが、完全な動作保証はありません。この問題はhealth-checkで解決されますが、これは後ほど説明します。
例:
services:
web:
image: nginx:latest
depends_on:
- db
db:
image: mongo:latest
7. command
commandディレクティブは、コンテナ起動時に実行されるコマンドを上書きします。
例:
services:
app:
image: myapp:latest
command: python app.py
8. networks
networksディレクティブは、サービスを1つまたは複数のネットワークに接続します。
例:
services:
web:
image: nginx:latest
networks:
- front-end
db:
image: mongo:latest
networks:
- back-end
3.4 完全な例
完全なcompose.yaml
ファイルの例
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
networks:
- front-end
app:
build: ./app
volumes:
- ./app:/usr/src/app
environment:
- NODE_ENV=production
networks:
- front-end
- back-end
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
networks:
- back-end
volumes:
mongo-data:
networks:
front-end:
back-end:
この例では:
- 3つのサービスが定義されています:
web
,app
,db
. -
web
はNginxイメージを使い、設定ファイルをマウントし、サービスapp
に依存しています。 -
app
はローカルのDockerfileからビルドされ、アプリケーションのソースコードをマウントし、環境変数を使用しています。 -
db
はMongoDBイメージを使用し、データを保存するためのボリュームをマウントします。 - 2つのボリュームと2つのネットワークが、サービスの分離と相互作用の管理のために作成されています。
注: 1つのボリュームはmongo-data
で、もう1つはホストマシンからマウントされたディレクトリ(例えば./app
)です。
GO TO FULL VERSION