Docker Compose チートシート - 最も実用的なコマンドと使用例
ちなみに、docker-composeとdocker composeは異なります。
これは、Compose ファイルとコマンドを迅速に習得するための注釈付き例を備えた Docker Compose チートシート です。
このガイドは、開発ツール:モダンな開発ワークフローの完全ガイドの一部です。
前提条件
Composeを使用する前に、Docker Engineがインストールされている必要があります。Ubuntuでは、UbuntuにDockerをインストールを参照して、適切なインストール方法を選択し、docker 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つのサービスがあります。個々のコンテナ操作については、Docker チートシートを参照してください。 - 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:DBデータはコンテナの再起動後も
mysql_dataボリュームに永続化されます。 -
開発用コードのバインドマウント
services: app: build: . volumes: - .:/appホストでコードをライブ編集し、コンテナ内に自動的に反映されます。
有用なフラグ
-d: デタッチモード(バックグラウンドで実行)。--build: 起動前にイメージの再ビルドを強制します。--force-recreate: 変更がなくてもコンテナを再作成します。--remove-orphans: Composeファイルで定義されていないコンテナを削除します。
サービスの定義とカスタマイズ
docker-compose.yml ファイルを活用することで、Docker Composeでサービス、ネットワーク、ボリュームを定義およびカスタマイズできます。これにより、アプリケーションのすべての設定とオーケストレーションのニーズを一元化できます。
- サービスは
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イメージを使用し、環境変数を設定し、ボリュームを接続し、ホストのポート80を8080として開放し、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キーを使用してコンテナにマウントします。 - ボリュームは名前を付け、カスタムドライバを使用し、データ永続化と共有のために複数のサービス間で共有できます。
例:
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で定義し、バージョン管理と簡単なデプロイメントスクリプトを有効にします。
- コンテナ管理とビジュアライゼーションについては、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 # ベース設定
|-- 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はコマンドを実行する際に
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サービスとして実行を参照してください。