Docker Compose クイックリファレンス - 例付きでよく使うコマンド
ちなみに、docker-compose は docker compose とは異なります…
以下は、Docker Composeに関するヒントと例を含む、日本語に翻訳されたHugoページのコンテンツです。
Docker Compose チートシート
注釈付きの例を用いて、Composeファイルとコマンドを素早くマスターするのに役立ちます。
Composeファイルのリファレンス: docker-compose.yml
基本構造:
version: '3' # Composeファイルの形式バージョン
services:
web:
image: nginx:latest
ports:
- "8080:80" # ホストポート8080:コンテナポート80
db:
image: postgres
environment: # 環境変数
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data
networks: # カスタムネットワーク
appnet:
driver: bridge
volumes: # ネームドボリューム
db_data:
- services: マルチコンテナアプリの各コンテナ。上記の例では、
web
とdb
の2つのサービスがあります。 - networks & volumes: イソレーションされたネットワークと永続的なストレージを定義します。ここでは
appnet
ネットワークとdb_data
ボリュームがあります。
例
ポートマッピング付きの単一サービス
services:
app:
build: .
ports:
- "8000:80" # ホストポート8000:コンテナポート80
ホストポート8000でアプリを公開し、現在のディレクトリにあるDockerfileからビルドします。
共有ボリュームとカスタムネットワーク付きのマルチサービス
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- type: bind
source: ./app
target: /app
networks:
- mynet
db:
image: postgres
volumes:
- db_data:/var/lib/postgresql/data
networks:
- mynet
networks:
mynet:
volumes:
db_data:
同じネットワーク上のWebとDB; DBは永続的なネームドボリュームdb_data
を使用します。
ビルドコンテキストとDockerfileパスの使用
Docker Compose.ymlに指定されたDockerfileから、必要に応じてdockerイメージをビルドできます。
services:
app:
build:
context: .
dockerfile: docker/MyDockerfile
サービス間でのデータ共有
services:
web:
image: nginx
volumes:
- shared_data:/usr/share/nginx/html
worker:
image: myworker
volumes:
- shared_data:/usr/src/app/data
volumes:
shared_data:
両方のサービスが同じボリュームにアクセス(静的ファイルやデータ交換用) - shared_data
.
高度なComposeファイルオプション
- environment: コンテナのENV変数を設定。
- depends_on: サービスの起動順序を制御。
- deploy.replicas: Swarmモードでのサービススケーリング。
例:
services:
web:
image: nginx
deploy:
replicas: 3
depends_on:
- db
3つのWebインスタンスを起動; 起動順序のみを制御(準備状態は制御しない)。
必須のDocker Composeコマンド
コマンド | 説明 | 例の使用 |
---|---|---|
docker-compose up |
コンテナを作成して起動 | docker-compose up |
docker-compose up -d |
背景で実行 | docker-compose up -d |
docker-compose exec |
実行中のコンテナでコマンドを実行 | docker-compose exec web bash |
docker-compose build |
イメージをビルド/再ビルド | docker-compose build |
docker-compose down |
コンテナ、ネットワーク、ボリューム、イメージを停止して削除 | docker-compose down |
docker-compose logs -f |
ログを表示し、フォロー | docker-compose logs -f |
docker-compose ps |
実行中のコンテナを一覧表示 | docker-compose ps |
docker-compose run |
Composeファイルのコマンドをバイパスして一時的なコマンドを実行 | docker-compose run web python manage.py migrate |
docker-compose stop |
実行中のコンテナを停止(start で再起動可能) |
docker-compose stop |
docker-compose restart |
サービスを再起動 | docker-compose restart web |
docker-compose pull |
サービスイメージをプル | docker-compose pull |
docker-compose rm |
停止したサービスコンテナを削除 | docker-compose rm web |
docker-compose config |
Composeファイルを検証し、表示 | docker-compose config |
docker-compose up --scale web=3 |
サービスの複数インスタンスを起動 | docker-compose up --scale web=3 |
一般的なComposeパターン
-
永続データを持つデータベース
services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD: password volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:
コンテナの再起動後も
mysql_data
ボリュームにDBデータが保持されます。 -
開発用のコードバインドマウント
services: app: build: . volumes: - .:/app
ホストでコードをライブ編集し、コンテナに自動反映されます。
有用なフラグ
-d
: バックグラウンドモード(実行)。--build
: 起動前にイメージを強制再ビルド。--force-recreate
: 変更がない場合でもコンテナを再作成。--remove-orphans
: Composeファイルに定義されていないコンテナを削除。
サービスの定義とカスタマイズ
docker-compose.yml
ファイルを活用することで、サービス、ネットワーク、ボリュームを定義およびカスタマイズできます。これにより、アプリケーションの構成とオーケストレーションのニーズが一元管理されます。
- サービスは
services
キーの下で定義されます。 - 各サービスはコンテナ構成を表し、以下を設定できます:
- Image: Docker Hubまたは他のレジストリからイメージを選択。
- Ports: コンテナポートをホストポートにマッピング。
- Environment variables: 設定値を渡す。
- Volumes: データを永続化またはホストや他のサービスとファイル/フォルダを共有。
- Networks: サービスがアクセスできるネットワークを制御。
例:
services:
web:
image: nginx:latest
ports:
- "8080:80" # ホストポート8080:コンテナポート80
environment:
- NGINX_HOST=localhost
volumes:
- web_data:/usr/share/nginx/html
networks:
- frontend
db:
image: postgres:13
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret
volumes:
- db_data:/var/lib/postgresql/data
networks:
- backend
- ここでは、
web
サービスはnginxイメージを使用し、環境変数を設定し、ボリュームを接続し、ホストの8080ポートをコンテナの80ポートにマッピングし、frontend
ネットワークに接続しています。db
サービスはPostgreSQLに対して同様の処理を行います。
ネットワークのカスタマイズ
- ネットワークは、どのサービスが通信できるかを制御します。Composeはデフォルトネットワークを作成しますが、カスタムドライバを指定し、オプションを設定し、どのサービスがどのネットワークに接続するかを細かく制御できます。
- ネットワークは、
networks
の上位レベルで定義し、サービスレベルのnetworks
キーでどのネットワークに接続するかを指定します。
例:
networks:
frontend:
driver: bridge
backend:
driver: bridge
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
- サービスにネットワークを接続:
services:
app:
networks:
- frontend
- backend
db:
networks:
- backend
- この設定により、
app
サービスはfrontend
とbackend
ネットワークの両方にアクセスできますが、db
サービスはbackend
ネットワークのみにアクセス可能です。
ボリュームのカスタマイズ
- ボリュームは、上位レベルの
volumes
キーの下で定義されます。サービスのvolumes
キーを使用してコンテナにマウントします。 - ボリュームは名前をつけることができ、カスタムドライバを使用し、複数のサービス間でデータの永続性と共有が可能です。
例:
volumes:
web_data: # Webコンテンツ用のネームドボリューム
db_data: # データベース用のネームドボリューム
services:
web:
volumes:
- web_data:/usr/share/nginx/html
db:
volumes:
- db_data:/var/lib/postgresql/data
- この例では、
web_data
は永続化され、任意のコンテナがマウントできるようにします。db_data
はコンテナの再作成時にデータベースデータが失われることを防ぎます。 - 高度なケースでは、カスタムドライバオプションを使用してバインドマウントを定義できます:
volumes:
db_data:
driver: local
driver_opts:
type: none
device: /data/db_data
o: bind
- この設定では、ホストのパス
/data/db_data
をコンテナにバインドマウントします。
ベストプラクティスの要約:
- サービス間の通信にはサービス名をDNSホスト名として使用します。
- 必要に応じてサービスを複数のネットワークに接続してアクセスを制御します。
- 永続ストレージとデータ共有にはネームドボリュームを使用します。
- YAMLを使用してすべてを定義し、バージョン管理と簡単なデプロイスクリプトを可能にします。
複数のComposeファイル
Docker Composeで複雑なマルチサービス構成を整理するには、複数のComposeファイルとオーバーライドファイルを使用できます。これにより、モジュール化された、環境固有の、拡張可能な構成が可能になります。以下にその方法を示します。
- ベースとオーバーライドファイルの構造
- ベースファイル(
compose.yaml
またはdocker-compose.yml
)を作成し、すべての共通のデフォルトサービス定義を含めます。 - 環境固有のオーバーライドファイルを追加します(例:
docker-compose.override.yml
、docker-compose.dev.yml
、docker-compose.prod.yml
)。
例のファイル構造:
/project-directory
|-- docker-compose.yml # ベース構成
|-- docker-compose.override.yml # ローカル/開発用のオーバーライド(自動的に適用)
|-- docker-compose.prod.yml # 本番用のオーバーライド
|-- docker-compose.test.yml # テスト用のオーバーライド(必要に応じて)
ベース構成はコアサービスを定義し、各オーバーライドファイルは特定の環境やケースに応じた設定をカスタマイズします。
- ファイルオーバーライドの動作
- マージ:
docker compose up
を実行すると、Docker Composeはベースファイルとオーバーライドファイルを順序に従ってマージします。後続のファイルは前のファイルの設定を上書き、拡張、または追加します。 - フィールドのオーバーライド: 複数のファイルでサービスやフィールドが定義されている場合、最後に指定されたファイルの値が使用されます。新しいフィールドは追加されます。
例のマージ:
docker-compose.yml
:services: web: image: myapp ports: - "8000:80"
docker-compose.override.yml
:services: web: environment: - DEBUG=true
- 結果:
web
サービスはベースのイメージとポートに加えて、オーバーライドされたDEBUG
環境変数を使用します。
- 複数ファイルを使用するコマンド
- デフォルトの動作:
docker-compose.override.yml
が存在する場合、docker compose up
を実行すると自動的にdocker-compose.yml
と併せて読み込まれます。 - 手動でファイルを指定:
-f
フラグを使用して、マージするファイルと順序を制御できます:docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
- このコマンドはデフォルトのオーバーライドを無視し、本番用の設定を使用します。
- 実用的な整理戦略
- 環境の分離: 1つのオーバーライドファイルごとに環境を分離: 開発、テスト、本番など。
- マイクロサービスとチーム: 異なるサービスやチームごとに構成を分割し、必要に応じて組み合わせます。
- 機能トグル: 一時的なニーズ(例:
compose.debug.yml
で追加のロギング)に応じて、追加のファイルでオプションのサービスや設定を導入または削除できます。
- 利点
- 明確性: 個々のファイルが小さく、焦点を当てています。
- 拡張性: 新しいサービス、環境、設定を簡単に追加できます。
- 保守性: 特定のデプロイに必要なセクションのみを変更または確認できます。
- 例: 環境の切り替え
開発環境:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
本番環境:
docker compose -f docker开头
各環境は必要な構成のみを受け取り、共通構成はベースファイルにあります。
複数のファイルを使用して複雑なCompose構成を整理し、オーバーライド/マージシステムを活用することで、大規模なマルチサービスDockerアプリケーションのモジュール性、環境固有のカスタマイズ、およびスケーラビリティが確保されます。