Docker Compose クイックリファレンス - 例付きでよく使うコマンド

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

目次

以下は、Docker Composeに関するヒントと例を含む、日本語に翻訳されたHugoページのコンテンツです。


Docker Compose チートシート
注釈付きの例を用いて、Composeファイルとコマンドを素早くマスターするのに役立ちます。

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: マルチコンテナアプリの各コンテナ。上記の例では、webdbの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サービスはfrontendbackendネットワークの両方にアクセスできますが、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ファイルとオーバーライドファイルを使用できます。これにより、モジュール化された、環境固有の、拡張可能な構成が可能になります。以下にその方法を示します。

  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.override.ymlが存在する場合、docker compose upを実行すると自動的にdocker-compose.ymlと併せて読み込まれます。
  • 手動でファイルを指定: -fフラグを使用して、マージするファイルと順序を制御できます:
    docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
    
    • このコマンドはデフォルトのオーバーライドを無視し、本番用の設定を使用します。
  1. 実用的な整理戦略
  • 環境の分離: 1つのオーバーライドファイルごとに環境を分離: 開発、テスト、本番など。
  • マイクロサービスとチーム: 異なるサービスやチームごとに構成を分割し、必要に応じて組み合わせます。
  • 機能トグル: 一時的なニーズ(例: compose.debug.ymlで追加のロギング)に応じて、追加のファイルでオプションのサービスや設定を導入または削除できます。
  1. 利点
  • 明確性: 個々のファイルが小さく、焦点を当てています。
  • 拡張性: 新しいサービス、環境、設定を簡単に追加できます。
  • 保守性: 特定のデプロイに必要なセクションのみを変更または確認できます。
  1. 例: 環境の切り替え

開発環境:

docker compose -f docker-compose.yml -f docker-compose.dev.yml up

本番環境:

docker compose -f docker开头

各環境は必要な構成のみを受け取り、共通構成はベースファイルにあります。

複数のファイルを使用して複雑なCompose構成を整理し、オーバーライド/マージシステムを活用することで、大規模なマルチサービスDockerアプリケーションのモジュール性、環境固有のカスタマイズ、およびスケーラビリティが確保されます。

有用なリンク