Docker Composeの基本
Docker Composeとは
-
概要 : 複数のコンテナを定義し、まとめて管理・起動するためのツール
-
メリット : 一つの設定ファイルで全てのコンテナを設定・管理できるため、環境構築が容易になる
docker-compose.ymlファイルの構成
-
version : Composeファイルのバージョン指定
-
services : 起動するコンテナの定義
-
volumes : データ永続化のためのボリューム定義
-
networks : コンテナ間通信のためのネットワーク定義
サンプル docker-compose.ymlの解説
version: "3.9"
services:
db:
container_name: db
build:
context: .
dockerfile: containers/postgres/Dockerfile
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: pg_isready -U "${POSTGRES_USER:-postgres}" || exit 1
interval: 10s
timeout: 5s
retries: 5
env_file:
- .env
ports:
- "5432:5432"
networks:
- backend_app_db
app:
container_name: app
build:
context: .
dockerfile: containers/django/Dockerfile
command: sh -c "/usr/local/bin/entrypoint.sh"
env_file:
- .env
volumes:
- ./application:/code/
- ./static:/static
ports:
- "8000:8000"
- "8080:8080"
depends_on:
db:
condition: service_healthy
networks:
- backend_app_web
- backend_app_db
nginx:
container_name: web
build:
context: .
dockerfile: containers/nginx/repo/Dockerfile
volumes:
- ./static:/static
ports:
- 80:80
depends_on:
- app
networks:
- backend_app_web
localstack:
image: localstack/localstack
container_name: localstack
ports:
- "4566:4566"
env_file:
- .env
environment:
- SERVICES=sns
- DEBUG=1
- DATA_DIR=/tmp/localstack/data
networks:
- backend_app_web
volumes:
db_data:
static:
localstack_data:
localstack_bin:
networks:
backend_app_web:
backend_app_db:
version
version: "3.9"
- 意味 : Docker Composeファイルのバージョンを指定。最新の機能を使用可能にするために3.9を指定
services
- 各サービスの設定を行うセクション。ここでは
db,app,nginx,localstackの4つのサービスが定義されている
dbサービス
db:
container_name: db
build:
context: .
dockerfile: containers/postgres/Dockerfile
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: pg_isready -U "${POSTGRES_USER:-postgres}" || exit 1
interval: 10s
timeout: 5s
retries: 5
env_file:
- .env
ports:
- "5432:5432"
networks:
- backend_app_db
-
container_name : コンテナの名前を
dbに設定 -
build : コンテナのビルド設定。
contextでビルドコンテキストを指定し、dockerfileでDockerfileのパスを指定 -
volumes : ホストとコンテナ間のデータ永続化。
db_dataボリュームを/var/lib/postgresql/dataにマウント -
healthcheck : ヘルスチェックの設定。PostgreSQLの
pg_isreadyコマンドを使用 -
env_file : 環境変数ファイルを指定
-
ports : ホストとコンテナ間のポートフォワーディング。
5432:5432でPostgreSQLのデフォルトポートを指定 -
networks :
backend_app_dbネットワークに接続
appサービス
app:
container_name: app
build:
context: .
dockerfile: containers/django/Dockerfile
command: sh -c "/usr/local/bin/entrypoint.sh"
env_file:
- .env
volumes:
- ./application:/code/
- ./static:/static
ports:
- "8000:8000"
- "8080:8080"
depends_on:
db:
condition: service_healthy
networks:
- backend_app_web
- backend_app_db
-
container_name : コンテナの名前を
appに設定 -
build : コンテナのビルド設定。DjangoアプリケーションのDockerfileを指定
-
command : コンテナ起動時に実行するコマンドを指定
-
env_file : 環境変数ファイルを指定
-
volumes : ホストとコンテナ間のディレクトリ共有
-
./applicationディレクトリを/codeに、./staticディレクトリを/staticにマウント
-
-
ports : ホストとコンテナ間のポートフォワーディング。
8000:8000および8080:8080を指定 -
depends_on :
dbサービスがヘルシー状態であることを条件に依存関係を設定 -
networks :
backend_app_webおよびbackend_app_dbネットワークに接続
nginxサービス
nginx:
container_name: web
build:
context: .
dockerfile: containers/nginx/repo/Dockerfile
volumes:
- ./static:/static
ports:
- 80:80
depends_on:
- app
networks:
- backend_app_web
-
container_name : コンテナの名前を
webに設定 -
build : コンテナのビルド設定。NginxのDockerfileを指定
-
volumes : ホストとコンテナ間のディレクトリ共有。
./staticディレクトリを/staticにマウント -
ports : ホストとコンテナ間のポートフォワーディング。
80:80を指定 -
depends_on :
appサービスに依存 -
networks :
backend_app_webネットワークに接続
localstackサービス
localstack:
image: localstack/localstack
container_name: localstack
ports:
- "4566:4566"
env_file:
- .env
environment:
- SERVICES=sns
- DEBUG=1
- DATA_DIR=/tmp/localstack/data
networks:
- backend_app_web
-
image : Localstackの公式イメージを使用
-
container_name : コンテナの名前を
localstackに設定 -
ports : ホストとコンテナ間のポートフォワーディング。
4566:4566を指定 -
env_file : 環境変数ファイルを指定
-
environment : 環境変数を直接設定
-
SERVICESで使用するサービスを指定し、DEBUGモードを有効化、DATA_DIRを指定
-
-
networks :
backend_app_webネットワークに接続
volumes
volumes:
db_data:
static:
localstack_data:
localstack_bin:
-
db_data : PostgreSQLのデータ永続化用ボリューム
-
static : 静的ファイルの永続化用ボリューム
-
localstack_data : Localstackのデータ永続化用ボリューム
-
localstack_bin : Localstackのバイナリ永続化用ボリューム
ここで本題!networksセクションの概要
- Docker Composeでネットワークを定義することで、複数のサービス間で通信を確立し、分離された環境を作成できます
-
docker-compose.ymlファイルのnetworksセクションについて詳しく説明します -
networksセクションでは、Composeファイル内で使用するカスタムネットワークを定義します- サービス間の通信が可能となり、各サービスを適切に分離することができます
サンプルのnetworksセクション
networks:
backend_app_web:
backend_app_db:
この例では、backend_app_webとbackend_app_dbの2つのネットワークが定義されています。
各ネットワークの役割
backend_app_webネットワーク
このネットワークは、Web関連のサービス(app, nginx, localstack)を接続するために使用されます。これにより、これらのサービス間での通信が可能となります
backend_app_dbネットワーク
このネットワークは、データベース関連のサービス(db, app)を接続するために使用されます。これにより、データベースサービスとアプリケーションサービス間での通信が可能となります
各サービスにおけるネットワーク設定
各サービスでネットワークを設定することで、特定のネットワークに接続するように指定できます
dbサービスのネットワーク設定
db:
networks:
- backend_app_db
-
dbサービスはbackend_app_dbネットワークに接続します -
この設定により、
dbサービスは同じネットワークに接続されている他のサービス(この場合、appサービス)と通信することができます
appサービスのネットワーク設定
app:
networks:
- backend_app_web
- backend_app_db
-
appサービスはbackend_app_webとbackend_app_dbの2つのネットワークに接続します -
これにより、
appサービスはWeb関連のサービスとデータベース関連のサービスの両方と通信することができます
nginxサービスのネットワーク設定
nginx:
networks:
- backend_app_web
-
nginxサービスはbackend_app_webネットワークに接続します -
この設定により、
nginxサービスはWeb関連のサービス(この場合、appサービス)と通信することができます
localstackサービスのネットワーク設定
localstack:
networks:
- backend_app_web
-
localstackサービスはbackend_app_webネットワークに接続します -
この設定により、
localstackサービスはWeb関連のサービス(この場合、appサービス)と通信することができます
ネットワークの詳細設定
ネットワークの詳細設定を追加することも可能です。以下に、各オプションの例を示します
カスタムネットワークの定義例
networks:
backend_app_web:
driver: bridge
driver_opts:
com.docker.network.bridge.name: "backend_bridge"
ipam:
config:
- subnet: "172.20.0.0/16"
backend_app_db:
driver: bridge
driver_opts:
com.docker.network.bridge.name: "db_bridge"
ipam:
config:
- subnet: "172.21.0.0/16"
-
driver : ネットワークのドライバーを指定。デフォルトは
bridge -
driver_opts : ドライバーに対するオプションを設定。この例では、カスタムブリッジ名を指定
-
ipam : IPアドレス管理設定
- config : サブネットなどの設定を行う
ネットワークを使用することで、サービス間の通信を効率的に管理し、分離された環境を作成することができます。networksセクションを適切に設定することで、複雑なアプリケーションの構築・管理が容易になります
総論
-
Docker Composeを使うことで、複数のコンテナを簡単に管理・起動することができる
-
サンプルの
docker-compose.ymlでは、データベース、アプリケーション、Nginx、Localstackの4つのサービスが定義されている -
各サービスには、ビルド設定、環境変数、ボリューム、ポートフォワーディング、依存関係などの詳細な設定が含まれている