はじめに
この入門ガイドでは、Docker と Docker Compose のインストール手順、および Compose を使用してアプリケーションを定義、デプロイ、管理する方法を説明します。Docker Compose の主要な機能と設定オプション、ならびに Compose アプリケーションのスケーリングとロードバランシングのためのベストプラクティスについても学習します。
この入門ガイドでは、Docker と Docker Compose のインストール手順、および Compose を使用してアプリケーションを定義、デプロイ、管理する方法を説明します。Docker Compose の主要な機能と設定オプション、ならびに Compose アプリケーションのスケーリングとロードバランシングのためのベストプラクティスについても学習します。
Docker Compose は、複数のコンテナからなる Docker アプリケーションを定義および実行するためのツールです。宣言的な方法でアプリケーションのサービス、ネットワーク、ボリュームを定義することで、複数の Docker コンテナの管理とオーケストレーションを簡素化します。
Docker Compose を使用すると、以下のことができます。
Web サーバー、データベース、メッセージキューなど、アプリケーションを構成するさまざまなサービスを、単一の YAML ファイルで定義できます。このファイル(「Compose ファイル」と呼ばれる)は、使用する Docker イメージ、公開するネットワーク ポート、マウントする環境変数やボリュームなど、各サービスの設定を記述します。
Docker Compose は、アプリケーション全体のライフサイクルを起動、停止、管理するためのコマンドを提供します。docker-compose up を使用して Compose ファイルで定義されたすべてのサービスを作成および起動し、docker-compose down を使用して停止および削除できます。
Docker Compose は、アプリケーションの開発およびテストフェーズで特に役立ちます。必要なすべてのサービスを備えた完全な開発環境を簡単に立ち上げることができ、一貫性があり再現性のある方法でアプリケーションをテストしやすくなります。
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 Compose を使用する前に、システムに Docker と Docker Compose をインストールする必要があります。このセクションでは、Ubuntu 22.04 システムへのインストール手順を案内します。
sudo apt-get update
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
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
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo docker run hello-world
Docker Compose は、Ubuntu 22.04 で Docker Engine のインストールの一部としてインストールされます。ただし、特定のバージョンの 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
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
これで Docker と Docker Compose がインストールされたので、Docker Compose を使用してマルチコンテナアプリケーションの定義とデプロイを開始できます。
Docker Compose アプリケーションの中心は、YAML 形式で記述される Compose ファイルです。このファイルでは、アプリケーションを構成するさまざまなサービスとその設定を定義します。
Compose ファイル内の各サービスは、web、db、または 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 つのサービスがあります。
web:最新の Nginx Web サーバーを実行し、ホストのポート 80 をコンテナのポート 80 にマッピングし、ホストの ./app ディレクトリをコンテナの /usr/share/nginx/html ディレクトリにマウントします。
db:MySQL 5.7 データベースを実行し、MYSQL_ROOT_PASSWORD 環境変数を設定し、名前付きボリューム db-data をマウントしてデータベースデータを保存します。
redis:最新の Redis インメモリ データストアを実行し、ホストのポート 6379 をコンテナのポート 6379 にマッピングします。
サービスを定義する他に、Compose ファイルでは、サービスで使用できる共有ボリュームとネットワークを定義することもできます。
上記の例では、MySQL データベースデータを保存するための名前付きボリューム db-data を定義しました。このボリュームは複数のサービス間で共有でき、コンテナが停止または再作成されてもデータが永続的に保存されます。
また、サービス間の接続性を制御するために、カスタムネットワークを定義することもできます。これは、特定のサービスを分離したり、より複雑なネットワークトポロジーを作成したりする場合に便利です。
Compose ファイルを使用することで、アプリケーションのさまざまなコンポーネントを簡単に定義および管理でき、マルチコンテナ Docker アプリケーションのデプロイ、スケーリング、保守を容易にします。
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 ファイル構造とコマンドは強力ですが、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 アプリケーションを構築できます。
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 つのインスタンスを作成し、着信リクエストをそれらにわたってロードバランシングします。
アプリケーションの高可用性を確保するために、再起動ポリシーなど、追加のロードバランシングオプションも設定できます。
Docker Compose のスケーリングとロードバランシング機能を活用することで、トラフィック増加やリソース需要に対応できる、高スケーラブルで堅牢なアプリケーションを構築できます。
Docker Compose を使用する場合、他の技術と同様に問題や課題が発生する可能性があります。このセクションでは、Compose ベースのアプリケーションを効果的に管理するための一般的なトラブルシューティング手順とベストプラクティスについて説明します。
ログの確認: Compose アプリケーションで問題が発生した場合、最初のステップは docker-compose logs コマンドを使用してログを確認することです。これにより、サービスに関するエラーや問題を特定できます。
コンテナの検査: docker-compose ps コマンドを使用して、実行中のコンテナとそのステータスを一覧表示できます。これにより、期待どおりに動作していないコンテナを特定できます。
サービスのデバッグ: 特定のサービスが期待どおりに動作していない場合、docker-compose exec コマンドを使用してコンテナにアクセスし、問題をデバッグできます。たとえば、docker-compose exec web bash は web サービスコンテナ内のシェルを提供します。
設定の検証: サービス定義、ネットワーク設定、ボリューム設定が正しいことを確認するために、Compose ファイルを二重に確認します。docker-compose config コマンドを使用して、Compose ファイルの構文と構造を検証できます。
環境変数の使用: データベースの認証情報や API キーなどの設定値を環境変数に格納します。これにより、機密情報の管理が容易になり、アプリケーションをさまざまな環境に適応させることができます。
懸念事項の分離: アプリケーションをより小さく、より管理しやすいサービスに分割することを検討します。これにより、アプリケーションの個々のコンポーネントをスケーリング、保守、テストしやすくなります。
ヘルスチェックの実装: コンテナが正常に機能していることを確認するために、サービスのヘルスチェックを設定します。これにより、Compose はアプリケーションの健康状態を監視し、異常なコンテナを再起動するなどの適切なアクションを実行できます。
Compose ファイルのバージョン管理: Git などのバージョン管理システムに Compose ファイルを保存します。これにより、変更を追跡し、チームメンバーと協力し、さまざまな環境で一貫したデプロイを確保できます。
ネットワークの適切な活用: カスタムネットワークを活用して、サービス間の接続を分離および制御します。これにより、アプリケーションのセキュリティとパフォーマンスが向上します。
LabEx の活用: Docker Compose のエクスペリエンスを強化するための追加機能とツールを提供する強力なプラットフォームである LabEx を使用することを検討します。LabEx は、Compose ベースのアプリケーションのデプロイ、監視、管理を効率化できます。
これらのトラブルシューティング手順とベストプラクティスに従うことで、Docker Compose アプリケーションを効果的に管理および保守し、さまざまな環境でスムーズかつ確実に実行できます。
このチュートリアルを終了すると、アプリケーションのデプロイと管理を効率化するための Docker Compose のインストールと使用方法に関する確かな理解が得られます。サービスを定義し、Compose アプリケーションをデプロイおよび管理し、発生する可能性のある問題をトラブルシューティングできるようになります。Docker に初めて触れる方や、Compose のスキルを向上させたい方にとって、このガイドは、Docker Compose を始めるために必要な知識とツールを提供します。