Docker Compose シート - よく使うコマンドと例
ちなみに、docker-composeはdocker composeとは異なります...
次のような Docker Compose チートシート は、注釈付きの例を含むことで、Compose ファイルとコマンドを迅速に習得するのに役立ちます。
このガイドは、開発ツール: 現代的な開発ワークフロー完全ガイド の一部です。
前提条件
Compose を使用するには、先に Docker Engine がインストールされている必要があります。Ubuntu での場合は、適切なインストール方法を選択し、docker compose プラグインを設定するために、Ubuntu に Docker をインストール を参照してください。

Compose ファイル参照: docker-compose.yml
基本構造:
version: '3' # Compose file format version
services:
web:
image: nginx:latest
ports:
- "8080:80" # Host port 8080:Container port 80
db:
image: postgres
environment: # Environment variables
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data
networks: # Custom network
appnet:
driver: bridge
volumes: # Named volume
db_data:
- services: マルチコンテナアプリにおける各コンテナです。上記の例では、
webとdbの2つのサービスがあります。個々のコンテナ操作については、Docker チートシート を参照してください。 - networks & volumes: 分離されたネットワークと永続化ストレージを定義します - ここでは
appnetネットワークとdb_dataボリュームを使用しています。
例
ポートマッピング付きの単一サービス
services:
app:
build: .
ports:
- "8000:80" # Host port 8000:Container port 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 imageをビルドできます。
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
Webインスタンスを3つ起動します。起動順序のみを制御し(リディネスは制御しません)。
必須の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:DBデータはコンテナの再起動後も
mysql_dataボリュームに永続化されます。 -
開発用にコードをバインドマウント
services: app: build: . volumes: - .:/appホスト上でコードをライブ編集し、コンテナに自動反映されます。
便利なフラグ
-d: ディタッチモード(バックグラウンドで実行)。--build: 開始前にイメージの再ビルドを強制。--force-recreate: 変更がなくてもコンテナを再生成。--remove-orphans: Composeファイルで定義されていないコンテナを削除。
サービスの定義とカスタマイズ
Docker Composeでは、docker-compose.ymlファイルを活用することで、サービス、ネットワーク、およびボリュームを定義し、カスタマイズできます。このファイルは、アプリケーションのすべての設定とオーケストレーションニーズを一元管理します。
- Services は
servicesキーの下で定義されます。 - 各サービスはコンテナの設定を表し、以下を設定できます:
- Image: Docker Hubや他のレジストリからイメージを選択。
- Ports: コンテナのポートをホストのポートにマップ。
- Environment variables: 設定値を渡し。
- Volumes: データを永続化するか、ホストまたは他のサービスとファイル/フォルダを共有。
- Networks: サービスがアクセスできるネットワークを制御。
例:
services:
web:
image: nginx:latest
ports:
- "8080:80" # Host port 8080:Container port 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イメージを使用し、環境変数を設定し、ボリュームを接続し、ポート80をホスト上で8080として公開し、frontendネットワークに接続します。dbサービスもPostgreSQLに対して同様のことをします。
ネットワークのカスタマイズ
- Networks は、どのサービス同士が通信できるかを制御します。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キーを使用してコンテナにマウントします。 - ボリュームは名前付きであることができ、カスタムドライバを使用し、複数の間で共有してデータの永続化と共有を行うことができます。
例:
volumes:
web_data: # Named volume for web content
db_data: # Named volume for database
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で定義することで、バージョン管理と容易なデプロイスクリプトを可能にします。
- コンテナの管理と可視化には、LinuxにPortainerをインストール を検討してください。
複数の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 # Base configuration
|-- docker-compose.override.yml # Local/dev overrides (applied automatically)
|-- docker-compose.prod.yml # Production overrides
|-- docker-compose.test.yml # Test overrides (if needed)
ベース設定はコアサービスを定義し、各オーバーライドは特定の環境やケースのために設定をカスタマイズします。
- ファイルオーバーライドの動作原理
- マージ:
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はコマンド実行時に、
docker-compose.ymlと一緒にdocker-compose.override.ymlを自動的に読み込みます。 - ファイルを手動で指定する:
-fフラグを使用して、どのファイルをどの順序でマージするかを制御します:docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d- これはデフォルトのオーバーライドを無視し、本番環境固有の設定を使用します。
- 実用的な整理戦略
- 環境の分離: 環境ごとに1つのオーバーライドを使用します:dev, test, prod など。
- マイクロサービスとチーム: 異なるサービスやチームのために設定を別々のファイルに分割し、必要に応じて組み合わせます。
- 機能トグル: 追加のファイルを使用して、一時的なニーズ(例: 追加のログ出力のための
compose.debug.yml)のために任意のサービスや設定を導入または削除できます。
- 利点
- 明確さ: 個々のファイルを小さく、フォーカスされた状態に保ちます。
- スケーラビリティ: 新しいサービス、環境、または設定を容易に追加できます。
- 保守性: 特定のデプロイに対して関連するセクションのみを変更またはレビューできます。
- 例: 環境の切り替え
開発:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
本番:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
各環境には、その環境に必要設定のみが与えられ、すべての共有設定はベースファイルにあります。
複数のファイルで複雑なComposeセットアップを整理し、オーバーライド/マージシステムを活用することで、大規模なマルチサービスDockerアプリケーションのモジュール性、環境固有のカスタマイズ、および容易なスケーラビリティが確保されます。
単一のLinuxホストでの本番デプロイ(起動時のブート、クリーンなシャットダウン、更新、ログローテーション)については、systemdでDocker ComposeをLinuxサービスとして実行 を参照してください。Podman Quadletとの比較については、LinuxサービスにおけるPodman QuadletとDocker Composeの比較 を参照してください。