Docker Compose のインストールと使用方法入門

DockerBeginner
オンラインで実践に進む

はじめに

この入門ガイドでは、Docker と Docker Compose のインストール手順、および Compose を使用してアプリケーションを定義、デプロイ、管理する方法を説明します。Docker Compose の主要な機能と設定オプション、ならびに Compose アプリケーションのスケーリングとロードバランシングのためのベストプラクティスについても学習します。

Docker Compose とは何か

Docker Compose は、複数のコンテナからなる Docker アプリケーションを定義および実行するためのツールです。宣言的な方法でアプリケーションのサービス、ネットワーク、ボリュームを定義することで、複数の Docker コンテナの管理とオーケストレーションを簡素化します。

Docker Compose を使用すると、以下のことができます。

アプリケーションのサービスを定義する

Web サーバー、データベース、メッセージキューなど、アプリケーションを構成するさまざまなサービスを、単一の YAML ファイルで定義できます。このファイル(「Compose ファイル」と呼ばれる)は、使用する Docker イメージ、公開するネットワーク ポート、マウントする環境変数やボリュームなど、各サービスの設定を記述します。

アプリケーションのライフサイクルを管理する

Docker Compose は、アプリケーション全体のライフサイクルを起動、停止、管理するためのコマンドを提供します。docker-compose up を使用して Compose ファイルで定義されたすべてのサービスを作成および起動し、docker-compose down を使用して停止および削除できます。

開発とテストを簡素化する

Docker Compose は、アプリケーションの開発およびテストフェーズで特に役立ちます。必要なすべてのサービスを備えた完全な開発環境を簡単に立ち上げることができ、一貫性があり再現性のある方法でアプリケーションをテストしやすくなります。

graph TD A[開発者] --> B[Docker Compose] B --> C[Web サーバー] B --> D[データベース] B --> E[メッセージキュー]

Docker Compose を使用することで、開発環境から本番環境まで、アプリケーションが同じ方法で動作することを保証し、環境固有の問題のリスクを軽減できます。

サービス イメージ ポート 環境変数
Web サーバー nginx:latest 80:80 -
データベース mysql:5.7 3306:3306 MYSQL_ROOT_PASSWORD=password
メッセージキュー rabbitmq:3-management 5672:5672, 15672:15672 -

要約すると、Docker Compose は、マルチコンテナ Docker アプリケーションの管理とデプロイを簡素化する強力なツールであり、一貫性があり再現性のある方法で複雑なアプリケーションを開発、テスト、実行しやすくなります。

Docker と Docker Compose のインストール

Docker Compose を使用する前に、システムに Docker と Docker Compose をインストールする必要があります。このセクションでは、Ubuntu 22.04 システムへのインストール手順を案内します。

Docker のインストール

  1. パッケージインデックスを更新します。
sudo apt-get update
  1. APT が HTTPS 経由のリポジトリを使用できるように必要なパッケージをインストールします。
sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
  1. 公式 Docker GPG キーを追加します。
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  1. Docker リポジトリを設定します。
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. Docker Engine をインストールします。
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  1. 次のコマンドを実行してインストールを確認します。
sudo docker run hello-world

Docker Compose のインストール

Docker Compose は、Ubuntu 22.04 で Docker Engine のインストールの一部としてインストールされます。ただし、特定のバージョンの Docker Compose をインストールする必要がある場合は、以下の手順に従います。

  1. 最新バージョンの Docker Compose をダウンロードします。
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. Docker Compose バイナリに実行権限を適用します。
sudo chmod +x /usr/local/bin/docker-compose
  1. 次のコマンドを実行してインストールを確認します。
docker-compose --version

これで Docker と Docker Compose がインストールされたので、Docker Compose を使用してマルチコンテナアプリケーションの定義とデプロイを開始できます。

Compose ファイルでのサービス定義

Docker Compose アプリケーションの中心は、YAML 形式で記述される Compose ファイルです。このファイルでは、アプリケーションを構成するさまざまなサービスとその設定を定義します。

サービス定義

Compose ファイル内の各サービスは、webdb、または redis など、トップレベルのキーとして定義されます。各サービスの下で、使用する Docker イメージ、公開するネットワーク ポート、環境変数など、さまざまな設定オプションを指定できます。

以下は、3 つのサービスを持つシンプルな Compose ファイルの例です。

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - ./app:/usr/share/nginx/html

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - db-data:/var/lib/mysql

  redis:
    image: redis:latest
    ports:
      - 6379:6379

volumes:
  db-data:

この例では、3 つのサービスがあります。

  1. web:最新の Nginx Web サーバーを実行し、ホストのポート 80 をコンテナのポート 80 にマッピングし、ホストの ./app ディレクトリをコンテナの /usr/share/nginx/html ディレクトリにマウントします。

  2. db:MySQL 5.7 データベースを実行し、MYSQL_ROOT_PASSWORD 環境変数を設定し、名前付きボリューム db-data をマウントしてデータベースデータを保存します。

  3. redis:最新の Redis インメモリ データストアを実行し、ホストのポート 6379 をコンテナのポート 6379 にマッピングします。

ボリュームとネットワーク

サービスを定義する他に、Compose ファイルでは、サービスで使用できる共有ボリュームとネットワークを定義することもできます。

上記の例では、MySQL データベースデータを保存するための名前付きボリューム db-data を定義しました。このボリュームは複数のサービス間で共有でき、コンテナが停止または再作成されてもデータが永続的に保存されます。

また、サービス間の接続性を制御するために、カスタムネットワークを定義することもできます。これは、特定のサービスを分離したり、より複雑なネットワークトポロジーを作成したりする場合に便利です。

Compose ファイルを使用することで、アプリケーションのさまざまなコンポーネントを簡単に定義および管理でき、マルチコンテナ Docker アプリケーションのデプロイ、スケーリング、保守を容易にします。

Compose アプリケーションのデプロイと管理

Compose ファイルでサービスを定義したら、Docker Compose コマンドを使用してアプリケーションをデプロイおよび管理できます。

アプリケーションのデプロイ

アプリケーションをデプロイするには、Compose ファイルを含むディレクトリに移動し、次のコマンドを実行します。

docker-compose up -d

-d フラグは、コンテナをデタッチモードで実行することを意味し、バックグラウンドで実行されます。

Docker Compose は Compose ファイルを読み込み、必要な Docker ネットワークとボリュームを作成し、定義されたすべてのサービスを開始します。

アプリケーションライフサイクルの管理

アプリケーションをデプロイした後、次の Docker Compose コマンドを使用してライフサイクルを管理できます。

  • docker-compose stop:実行中のすべてのサービスを停止します。
  • docker-compose start:停止したサービスを開始します。
  • docker-compose restart:実行中のすべてのサービスを再起動します。
  • docker-compose down:すべてのサービス、ネットワーク、およびボリュームを停止して削除します。

たとえば、アプリケーションを停止するには、次を実行します。

docker-compose stop

再び開始するには、次を実行します。

docker-compose start

サービスのスケーリング

Docker Compose を使用すると、サービスを簡単にスケールアップまたはスケールダウンできます。特定のサービスをスケールするには、scale コマンドを使用します。

docker-compose scale web=3 db=2

これにより、web サービスを 3 つのインスタンスに、db サービスを 2 つのインスタンスにスケールします。

アプリケーションをデプロイするときに、up コマンドと --scale フラグを使用して、サービスをスケールすることもできます。

docker-compose up --scale web=3 --scale db=2 -d

ログの表示

アプリケーションのログを表示するには、logs コマンドを使用します。

docker-compose logs

これにより、すべてのサービスのログが表示されます。特定のサービスのログを表示するには、サービス名も指定できます。

docker-compose logs web

これらの Docker Compose コマンドを使用することで、マルチコンテナアプリケーションを簡単にデプロイ、管理、スケールできます。これにより、複雑なアプリケーションを一貫性と再現性を持って開発、テスト、実行しやすくなります。

高度な Compose 機能と設定

基本的な Compose ファイル構造とコマンドは強力ですが、Docker Compose は、より複雑で堅牢なアプリケーションを構築するための高度な機能と設定オプションも提供します。

環境変数とシークレット

環境変数を使用して、サービスに設定値を渡すことができます。Docker Compose は、サービスレベルまたはグローバルレベルで定義できるビルド時と実行時環境変数の両方をサポートします。

さらに、データベースパスワードや API キーなど、機密情報を安全に格納し、サービスで使用できるようにする Docker シークレットを使用できます。

version: "3"
services:
  web:
    image: myapp/web
    environment:
      - DATABASE_URL=mysql://root:${DB_PASSWORD}@db/myapp
    secrets:
      - db-password

secrets:
  db-password:
    file: ./db-password.txt

依存関係管理とヘルスチェック

Docker Compose は、サービスの依存関係を定義することで、サービスが正しい順序で開始され、依存関係のあるサービスが他のサービスを開始する前に正常であることを保証できます。

また、サービスのヘルスチェックを設定することで、Compose がコンテナの健康状態を監視し、異常なコンテナを再起動するなどの適切なアクションを実行できます。

version: "3"
services:
  web:
    image: myapp/web
    depends_on:
      db:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 5

  db:
    image: mysql:5.7
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 30s
      timeout: 10s
      retries: 5

ネットワークとサービスディスカバリ

Docker Compose は、アプリケーションのデフォルトネットワークを自動的に作成しますが、カスタムネットワークを定義し、サービスのネットワーク設定を制御することもできます。

さらに、Compose は組み込みのサービスディスカバリを提供し、サービスが Compose ファイルで定義されたサービス名を使用して、互いに見つけて通信できます。

version: "3"
services:
  web:
    image: myapp/web
    networks:
      - frontend
    environment:
      - DB_HOST=db

  db:
    image: mysql:5.7
    networks:
      - backend

networks:
  frontend:
  backend:

これらの高度な機能を活用することで、組織のニーズに対応する、より複雑で堅牢でスケーラブルな Docker Compose アプリケーションを構築できます。

Compose によるスケーリングとロードバランシング

Docker Compose を使用する主な利点の 1 つは、サービスを簡単にスケーリングし、ロードバランシングを実装できることです。このセクションでは、これらの機能を実現する方法を説明します。

サービスのスケーリング

前述のように、scale コマンドを使用してサービスをスケーリングアップまたはスケーリングダウンできます。これは、トラフィック増加やリソース需要に対応する必要がある場合に特に役立ちます。

たとえば、Compose ファイルで web サービスを定義している場合を考えます。

version: "3"
services:
  web:
    image: myapp/web
    ports:
      - 80:80

web サービスを 3 つのインスタンスにスケーリングするには、次のコマンドを実行します。

docker-compose scale web=3

これにより、web サービスの追加インスタンスが 2 つ作成され、複数のコンテナに負荷を分散できます。

ロードバランシング

Docker Compose は、組み込みのロードバランシング機能も提供します。サービスの複数のインスタンスを定義すると、Compose は自動的に、利用可能なコンテナにわたって着信リクエストをロードバランシングします。

version: "3"
services:
  web:
    image: myapp/web
    ports:
      - 80:80
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure

この例では、web サービスを 3 つのレプリカを持つように定義しました。docker-compose up を実行すると、Compose は web サービスの 3 つのインスタンスを作成し、着信リクエストをそれらにわたってロードバランシングします。

アプリケーションの高可用性を確保するために、再起動ポリシーなど、追加のロードバランシングオプションも設定できます。

graph TD A[クライアント] --> B[ロードバランサー] B --> C[Web サービス 1] B --> D[Web サービス 2] B --> E[Web サービス 3]

Docker Compose のスケーリングとロードバランシング機能を活用することで、トラフィック増加やリソース需要に対応できる、高スケーラブルで堅牢なアプリケーションを構築できます。

トラブルシューティングとベストプラクティス

Docker Compose を使用する場合、他の技術と同様に問題や課題が発生する可能性があります。このセクションでは、Compose ベースのアプリケーションを効果的に管理するための一般的なトラブルシューティング手順とベストプラクティスについて説明します。

トラブルシューティング

  1. ログの確認: Compose アプリケーションで問題が発生した場合、最初のステップは docker-compose logs コマンドを使用してログを確認することです。これにより、サービスに関するエラーや問題を特定できます。

  2. コンテナの検査: docker-compose ps コマンドを使用して、実行中のコンテナとそのステータスを一覧表示できます。これにより、期待どおりに動作していないコンテナを特定できます。

  3. サービスのデバッグ: 特定のサービスが期待どおりに動作していない場合、docker-compose exec コマンドを使用してコンテナにアクセスし、問題をデバッグできます。たとえば、docker-compose exec web bashweb サービスコンテナ内のシェルを提供します。

  4. 設定の検証: サービス定義、ネットワーク設定、ボリューム設定が正しいことを確認するために、Compose ファイルを二重に確認します。docker-compose config コマンドを使用して、Compose ファイルの構文と構造を検証できます。

ベストプラクティス

  1. 環境変数の使用: データベースの認証情報や API キーなどの設定値を環境変数に格納します。これにより、機密情報の管理が容易になり、アプリケーションをさまざまな環境に適応させることができます。

  2. 懸念事項の分離: アプリケーションをより小さく、より管理しやすいサービスに分割することを検討します。これにより、アプリケーションの個々のコンポーネントをスケーリング、保守、テストしやすくなります。

  3. ヘルスチェックの実装: コンテナが正常に機能していることを確認するために、サービスのヘルスチェックを設定します。これにより、Compose はアプリケーションの健康状態を監視し、異常なコンテナを再起動するなどの適切なアクションを実行できます。

  4. Compose ファイルのバージョン管理: Git などのバージョン管理システムに Compose ファイルを保存します。これにより、変更を追跡し、チームメンバーと協力し、さまざまな環境で一貫したデプロイを確保できます。

  5. ネットワークの適切な活用: カスタムネットワークを活用して、サービス間の接続を分離および制御します。これにより、アプリケーションのセキュリティとパフォーマンスが向上します。

  6. LabEx の活用: Docker Compose のエクスペリエンスを強化するための追加機能とツールを提供する強力なプラットフォームである LabEx を使用することを検討します。LabEx は、Compose ベースのアプリケーションのデプロイ、監視、管理を効率化できます。

これらのトラブルシューティング手順とベストプラクティスに従うことで、Docker Compose アプリケーションを効果的に管理および保守し、さまざまな環境でスムーズかつ確実に実行できます。

まとめ

このチュートリアルを終了すると、アプリケーションのデプロイと管理を効率化するための Docker Compose のインストールと使用方法に関する確かな理解が得られます。サービスを定義し、Compose アプリケーションをデプロイおよび管理し、発生する可能性のある問題をトラブルシューティングできるようになります。Docker に初めて触れる方や、Compose のスキルを向上させたい方にとって、このガイドは、Docker Compose を始めるために必要な知識とツールを提供します。