Docker Compose シート - よく使うコマンドと例

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

目次

次のような Docker Compose チートシート は、注釈付きの例を含むことで、Compose ファイルとコマンドを迅速に習得するのに役立ちます。

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

前提条件

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

docker-compose schema

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: マルチコンテナアプリにおける各コンテナです。上記の例では、webdb の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ファイルを活用することで、サービス、ネットワーク、およびボリュームを定義し、カスタマイズできます。このファイルは、アプリケーションのすべての設定とオーケストレーションニーズを一元管理します。

  • Servicesservices キーの下で定義されます。
  • 各サービスはコンテナの設定を表し、以下を設定できます:
    • 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サービスはfrontendbackendネットワークの両方のユーザーにアクセスできるようになり、dbbackend内でのみアクセス可能になります。

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

  • 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ファイルとオーバーライドファイルを使用できます。これにより、モジュール化された、環境固有の、スケーラブルな設定が可能になります。その仕組みは以下の通りです:

  1. ベースとオーバーライドファイルの構造
  • ベースファイルを作成する (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)

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

  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サービスとして実行 を参照してください。Podman Quadletとの比較については、LinuxサービスにおけるPodman QuadletとDocker Composeの比較 を参照してください。

関連リンク

購読する

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