Docker Compose チートシート - 最も実用的なコマンドと使用例

ちなみに、docker-composeとdocker composeは異なります。

目次

これは、Compose ファイルとコマンドを迅速に習得するための注釈付き例を備えた Docker Compose チートシート です。

このガイドは、開発ツール:モダンな開発ワークフローの完全ガイドの一部です。

前提条件

Composeを使用する前に、Docker Engineがインストールされている必要があります。Ubuntuでは、UbuntuにDockerをインストールを参照して、適切なインストール方法を選択し、docker compose プラグインを設定してください。

docker-compose schema

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: マルチコンテナアプリケーション内の各コンテナ。上記の例では、webdb の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 サービスは frontendbackend の両方のネットワーク上のユーザーにアクセスできますが、dbbackend 内からのみアクセス可能です。

ボリュームのカスタマイズ

  • 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ファイルとオーバーライドファイルを使用し、モジュール化された、環境固有の、スケーラブルな構成を有効にできます。以下はその動作方法です:

  1. ベースファイルとオーバーライドファイルの構造
  • ベースファイルcompose.yaml または docker-compose.yml)を作成し、すべての共通のデフォルトサービス定義を含めます。
  • 環境固有のオーバーライドファイルを追加します(例:docker-compose.override.ymldocker-compose.dev.ymldocker-compose.prod.yml)。

例のファイル構造:

/project-directory
|-- docker-compose.yml           # ベース設定
|-- docker-compose.override.yml  # ローカル/開発用オーバーライド(自動的に適用)
|-- docker-compose.prod.yml      # 本番用オーバーライド
|-- docker-compose.test.yml      # テスト用オーバーライド(必要に応じて)

ベース設定はコアサービスを定義し、各オーバーライドは特定の環境またはケースの設定をカスタマイズします。

  1. ファイルオーバーライドの動作
  • マージ: 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 環境変数を使用します。
  1. 複数ファイルのコマンド使用法
  • デフォルトの動作: 存在する場合、Docker Composeはコマンドを実行する際に docker-compose.yml と一緒に docker-compose.override.yml を自動的に読み込みます。
  • ファイルを手動で指定: -f フラグを使用して、どのファイルをマージし、その順序を制御します:
    docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
    
    • これにより、デフォルトのオーバーライドを無視し、本番環境固有の設定を使用します。
  1. 実用的な組織戦略
  • 環境の分離: 環境ごとに1つのオーバーライドを使用します:dev、test、prodなど。
  • マイクロサービスとチーム: 異なるサービスやチーム用に設定を個別のファイルに分割し、必要に応じて結合します。
  • 機能トグル: 追加のファイルは、一時的なニーズ(例:追加のログ記録用の compose.debug.yml)のためにオプションのサービスまたは構成を導入または削除できます。
  1. 利点
  • 明確さ: 個々のファイルを小さく、焦点を絞ったままに保ちます。
  • スケーラビリティ: 新しいサービス、環境、または設定を簡単に追加できます。
  • 保守性: 特定のデプロイメントに関連するセクションのみを変更またはレビューできます。
  1. 例:環境の切り替え

開発:

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サービスとして実行を参照してください。

有用なリンク

購読する

システム、インフラ、AIエンジニアリングの新記事をお届けします。