
アプリケーションの開発と展開の世界は、近年のコンテナの登場により、真の革命を遂げました。この進歩により、あらゆる規模のチームが従来の「環境問題」を忘れ、俊敏性、拡張性、インフラストラクチャの制御性を向上させることができます。この文脈では、特に2つのツールが際立っています。Dockerと、複数のコンテナを協調管理するためのツールです。 ドッカーの作成。今日はコンテナ管理について詳しく見ていきます。 このツール基礎だけでなく、このテクノロジーを完全に習得するための詳細なヒント、実際のケース、ベスト プラクティスも取り上げます。
ローカルの開発環境と本番環境の間でソフトウェア ツールのバージョンを揃えようとしてイライラしたことがある場合、または依存関係のインストールと非互換性のトラブルシューティングに何時間も費やしたことがある場合、次の内容は非常に興味深いものとなるでしょう。 Dockerコンポーズ 複雑なサービスの展開方法を完全に変えましたを使用すると、単一のコマンドでアーキテクチャ全体 (Web、API、データベース、キャッシュなど) を設定し、どこでも同じように動作することを保証できます。その潜在能力を最大限に活用する方法を一緒に詳しく見ていきましょう。
Docker Compose とは何ですか? また、それがなぜ重要なのですか?
コマンドと構成の詳細に入る前に、Docker Compose がコンテナ エコシステムで果たす役割を明確にしておくことが重要です。 Docker Composeは コンテナのセットを定義、構成、オーケストレーションできるツール シンプルなYAMLファイル(通常は docker-compose.yml)。その存在理由は、複数のサービス(たとえば、Web サイト、データベース、キャッシュ システムなど)で構成されるアプリケーションを管理する必要があることにあります。これらのサービスはそれぞれ別のコンテナー内にありますが、連携して動作します。
Composeを使用すると、 1 つのコマンドでアプリケーションのすべてのサービスを開始できます。、それらの関係、環境変数、永続ボリューム、共有ネットワークなどを定義します。さらに、これは開発環境(複製可能な環境を迅速に作成するため)と継続的インテグレーションおよびデプロイメント(CI/CD)パイプラインの両方で、また小規模および中規模プロジェクトのプレプロダクションおよびプロダクションでもかけがえのないものです。
Docker Compose のコンテナ管理における主なメリット
以下にその一部を列挙します 主な利点 Docker Compose がコンテナ管理にもたらすもの:
- 簡素化された設計と展開: インフラストラクチャをコードとして定義し、レプリケーションとデプロイメントを自動化し、再現可能にすることができます。
- サービス間の調整: 依存関係、内部ネットワーク、コンテナの起動順序を管理し、サービスが最初から正しく対話することを保証します。
- 隔離された一貫性のある環境: チームメンバー全員が、さらにはマシンや環境が異なっていても、同じ技術的条件下で作業するため、「私にとってはうまくいく」という幻想は最小限に抑えられます。
- 簡単な拡張性: 1 つの命令で任意のサービスのレプリカの数を増減できるため、負荷テストやより堅牢な展開が容易になります。
- CI/CDへの簡単な統合: 環境の構築、テスト、自動展開のための継続的インテグレーション パイプラインに完全に適合します。
- ライフサイクル全体を管理: スタック内のすべてのコンテナの起動、シャットダウン、再起動、ログ記録、更新、削除を制御するのは、Compose コマンドを実行するのと同じくらい簡単です。
Docker Compose を使用する際の制限と課題
他のテクノロジーと同様に、Docker Compose にもいくつかの課題と考慮事項があります。
- 初期学習曲線: YAML 構文、Compose 固有のコマンド、ネットワーク、ボリューム、依存関係の概念を理解している必要があります。
- 単純なプロジェクトに不要な複雑さが加わる単一サービスまたは非常に単純なアプリケーションの場合、Docker Compose は過剰になる可能性があります。
- 高度な設定が必要です: カスタム ネットワーク、サービスの健全性、または再起動戦略を定義するには、メンテナンスをシンプルに保つためにある程度の専門知識が必要になる場合があります。
- 大規模インフラにおける規模の制限: 非常に大規模なデプロイメントの場合、Kubernetes などのオーケストレーターを使用することをお勧めしますが、多くの状況では Compose が最適です。
環境の準備: DockerとDocker Composeのインストール
サービスの定義を始める前に、 Docker と Docker Compose がインストールされていることが必須です。 あなたのマシン上で。現在のシステムでは、Windows および Mac 用の Docker Desktop にはすでに Compose が標準で含まれています。 Linux 環境では、パッケージ マネージャーを使用して簡単にインストールできます (次の例は、Debian/Ubuntu ベースのシステムの場合です)。
- Dockerの場合:
sudo apt install docker-ce(Ubuntu/Debian) またはsudo dnf install docker-ce(Fedora/CentOS) - Docker Compose の場合:
sudo apt install docker-compose
多くの場合、ユーザーをdockerグループに追加するだけで十分です。 sudo usermod -aG docker $(whoami) 'sudo' なしでコマンドを実行できるようにします。変更を有効にするには、必ずセッションを再起動してください。
docker-compose.yml ファイル: 構造と主キー
Docker Composeの核となるのはファイルである docker-compose.yml。基本的な構造は非常に直感的ですが、非常に柔軟性に優れています。
- バージョン: Compose 構文のバージョンを示します。通常は最初の要素として配置されます。
- サービス: アプリケーションを構成するすべてのサービス (コンテナー) が、それぞれ固有の構成 (イメージ、ビルド、ポート、ボリューム、環境変数、コマンド、依存関係など) とともに一覧表示されます。
- ボリューム: 特定のサービスと共有または関連付けることができる永続ボリュームを定義し、コンテナの再起動や削除後もデータが保持されることを保証します。
- ネットワーク: カスタム ネットワークを定義して、サービスを分離および接続できます。
構造の最小限の例:
バージョン: "3.8" サービス: web: イメージ: nginx:latest ポート: - "8080:80" db: イメージ: postgres:13 環境: - POSTGRES_PASSWORD=example ボリューム: - pgdata:/var/lib/postgresql/data ボリューム: pgdata:
実践チュートリアル: マルチコンテナアプリケーションのデプロイ
Docker Compose の使用方法を説明するために、ここで説明した例に基づいてデプロイメントのケース スタディを確認してみましょう。
例1: PythonのWeb + Redisでカウントする
Redis をメモリ内ストレージとして使用して、訪問カウンターを表示するシンプルな Python Flask Web サイトを起動するとします。 Python または Redis をローカルにインストールする必要はありません。Compose を使用してそれらを統合する方法を定義するだけです。サービス用のカスタムイメージを作成する方法については、以下をご覧ください。 カスタムDockerfileイメージを作成する.
- app.py: Flask ウェブコード。
- Requirements.txt: 依存関係のリスト (例: flask および redis-py)。
- ドッカーファイル: Web サービスのカスタム イメージを構築する方法を示します。
- docker-compose.yml: Web サービスと Redis、それぞれのポート、ボリューム、変数を定義します。
これはファイルのサンプルです docker-compose.yml この場合:
バージョン: '3.8' サービス: web: ビルド: .ポート: - "8000:5000" ボリューム: - .:/code 環境: - FLASK_DEBUG=1 依存先: - redis redis: イメージ: redis:alpine
このアプローチの利点は何ですか?マウントされたボリュームのおかげで、マシン上のコードを変更し、その変更がサーバーに自動的に反映されるのを確認できます。そのたびにイメージを再構築する必要はありません (迅速な開発に最適です)。
例2: LAMP環境 (Apache、PHP、MySQL)
PHP や MySQL などの従来のテクノロジーを使用して開発する場合、Compose も重要です。一般的な構成ファイルは次のようになります。
バージョン: "3.8" サービス: mysql: イメージ: mysql:5.7 環境: - MYSQL_DATABASE=midb - MYSQL_ROOT_PASSWORD=secret - MYSQL_USER=user - MYSQL_PASSWORD=key ボリューム: - ./data/mysql:/var/lib/mysql ポート: - "3306:3306" php: イメージ: php:7-apache ボリューム: - ./html:/var/www/html ポート: - "80:80" 依存: - mysql
これにより、数秒で Web サイト全体を稼働させ、PHP ファイルを変更し、すべてが本番環境とまったく同じように動作することを確認できます。
例3: PostgreSQLを使用したNode.jsアプリケーション
最新の開発で広く使用されているスタックは、Node.js サービスと PostgreSQL データベースを組み合わせたものです。 Compose では、データの永続性と必要な環境変数を定義することもできます。
バージョン: '3.8' サービス: アプリ: イメージ: node:14-alpine コマンド: sh -c "npm install && npm run dev" ボリューム: - .:/app ポート: - 3000:3000 環境: - NODE_ENV=development 依存先: - db db: イメージ: postgres:13 環境: - POSTGRES_USER=user - POSTGRES_PASSWORD=key - POSTGRES_DB=app ポート: - 5432:5432
設定が完了したら、 ドッカー - 構成 API とデータベースの両方が対話する準備が整います。
必須の Docker Compose コマンド
マルチコンテナ アプリケーションの日常的な管理のために、Docker Compose は非常に明確で強力なコマンド セットを提供します。
- ドッカー - 構成: YAML で定義されたすべてのサービスをビルドして起動します。パラメータ -d バックグラウンドで起動します。
- docker-compose ダウン: 定義されている場合は永続データを尊重しながら、スタックに関連付けられているすべてのコンテナ、ネットワーク、ボリュームを停止して削除します。
- docker-compose ビルド: ファイルに指定されたカスタム イメージを構築します。
- ドッカー - compose ps: スタックのコンテナの現在の状態を表示します。
- docker-compose ログ: すべてのサービスまたは特定のサービスのログを表示できます。
- docker-compose の停止/開始/再起動: コンテナのライフサイクルを詳細に管理します。
- docker-compose 実行: すでに開始されているコンテナ内でコマンドを実行します (たとえば、bash を開いたり、データベースの移行を実行したりします)。
高度な側面: ネットワーク、ボリューム、変数、サービスの健全性
プロジェクトの拡大に合わせて、Compose で設定を微調整できます。
カスタムネットワーク
異なるネットワークを定義し、機密性の高いサービス (データベースなど) を分離してセキュリティを強化できます。ネットワークは次のように定義されます。
ネットワーク: フロントエンド: バックエンド:
各サービスは、1 つ以上のネットワークに明示的に関連付けることができます。さらに、高度な管理では、内部ネットワークの制御が重要になる場合があります。
永続ボリューム
コンテナを停止または削除した場合でも、重要なデータ (データベースや構成など) が失われないことが保証されます。これらはグローバルに定義することも、サービスごとに定義することもできます。
環境変数と.envファイル
柔軟性と移植性を高めるために、変数はYAML自体またはファイルで宣言できます。 .env 同じディレクトリにあります。これにより、Compose ファイルに触れることなく重要な設定 (資格情報など) を変更できます。
ヘルスチェックと依存関係の制御
複数のサービスを調整する際の重要な問題は、基盤となるサービス (データベースなど) の準備が整う前に、依存するサービス (アプリケーションなど) が起動しないようにすることです。 Composeにはオプションがあります 依存する また、最近のバージョンでは、健康状態を設定できます。
サービス: web:depends_on:db:条件:service_healthy db:image:postgres:13 healthcheck:test:間隔:10秒 タイムアウト:5秒 再試行:5
この方法では、データベースが起動して実行中であることを確認するまで、バックエンドは起動しません。これは、初期接続エラーを回避するための自動化されたパイプラインとデプロイメントの基本的な機能です。
継続的インテグレーションとデプロイメント (CI/CD) における Docker Compose
Compose は、最新のワークフローの一部として最適です。コード形式のおかげで、次のことが可能になります。
- 各プルリクエストで完全なアプリケーションをテストする 環境を手動で構成する必要はありません。
- 一時的な環境を展開する テストやデモンストレーションに使用でき、使用後は簡単に廃棄できます。
- 生産の自動化 Kubernetes をセットアップすることが現実的ではない中小規模のプロジェクトの場合。
その他の統合可能な代替ツール: Podman、Visual Studio、Azure など
Docker Compose に加えて、コンテナ環境ではその他の関連ユーティリティと統合も提供されます。
- Podmanとpodman-dockerSLE Micro などのシステムや、よりセキュリティ重視のディストリビューションでは、Podman は Docker に代わるデーモンレスの代替手段を提供します。ツール podman-docker Docker スクリプトを変更せずに実行し、自動的に置き換えることができます。
- Visual Studio と .NET: .NET 開発者は、Visual Studio 内から Redis などのキャッシュとともに Web サービスと API をオーケストレーションし、Compose ファイルを自動的に生成して、サービスのデバッグと順次開始を容易に行うことができます。
- Azure AI サービスとクラウド多くのクラウド プラットフォームでは、Compose を使用して複雑なスタックを簡単にデプロイできるため、複数の AI サービス、データベース、監視システム (Prometheus や Grafana など) を共同で管理できます。
Docker Compose を最大限に活用するためのベストプラクティスとヒント
- 分割統治: サービスを適切に分離し、必要なものだけを定義して、隠れた依存関係を回避し、さまざまなスタックの構成を容易にします。
- 可能な限り公式画像を使用する: 問題を軽減し、サポートを保証し、更新を容易にします。
- docker-compose.yml のバージョン管理: 変更の追跡可能性を確保するために、プロジェクトの残りの部分とともにバージョン管理システム (Git など) に追加します。
- 重要なデータをコンテナ内にのみ保存しない: サービスを削除または更新する必要がある場合は、データの損失を避けるために、常に外部ボリュームまたはデータベースを使用してください。
- Dockerfilesを最適化するカスタム イメージを構築する場合は、ビルド時間とエラーを削減するために、軽量で、ドキュメントが適切に作成されていることを確認してください。でカスタムイメージを作成する方法も学習できます。
- 港に注意してください: 公開するポートがマシン上で占有されていないことを確認し、公開時のセキュリティを確認してください。
- 変数と秘密をリポジトリから除外する: 機密データには .env ファイルまたはシークレット マネージャーを使用します。
マルチコンテナアプリケーションの診断と日常管理
Compose を使用すると、アプリケーションの健全性の監視と診断が非常に簡単になります。毎日の投与に関する推奨事項:
- ログを確認する とともに docker-compose ログ -f 各サービスの動作をリアルタイムで監視します。
- 特定のサービスを停止して再起動する テストを実行したり、一時的にリソースを解放したりする必要がある場合。
- フルスタックを一時停止して再開する メンテナンスタスクを実行する必要がある場合。
複雑なアプリケーションの導入:実例と推奨事項
実際のアプリケーションの多くは、Compose を高度に活用して複数のサービスを調整しています。一般的なケースは次のとおりです:
- 最新のウェブスタックたとえば、フロントエンドの React アプリケーション、Node/Express の API、MongoDB データベースなどです。
- マイクロサービス: 異なる専門サービスが内部ネットワークを介して相互に通信し、別々のデータベースに永続化されます。
- ビジネスアプリケーション: RabbitMQ (メッセージング)、Redis (キャッシュ)、Elasticsearch (検索エンジン) などのサービスをすべて同じ Compose ファイルで接続します。
サービス間の分離、データの永続性、環境の複製可能性を考慮しながら、Compose をプロジェクトの特定のニーズに適応させることが重要です。
実稼働環境に関する追加の推奨事項
Compose は開発やプリプロダクションには最適ですが、本番環境で使用する場合は微妙な違いがあります。
- 特定の環境変数を使用する 開発と本番の構成を分離します。
- セキュリティチェック コンテナとネットワーク: 必要なポートのみを公開し、最適化されたイメージを使用し、ソフトウェアを最新の状態に保ちます。
- 音量には注意してください: 運用時には、外部の永続ストレージを使用し、重要なデータを定期的にバックアップすることを検討してください。
- ステータスとパフォーマンスを監視する Prometheus や Grafana などのツールを使用したサービス。
大規模なプロジェクトや、高可用性とスケーラビリティが求められるプロジェクトでは、Kubernetes などのオーケストレーターにアップグレードすることが不可欠になる場合がありますが、Docker Compose は依然としてスタートアップ、MVP、小規模チーム、迅速なテストに最適です。
Docker Compose を使用すると、マルチコンテナ アプリケーションの管理がこれまで以上に簡単かつ強力になります。単一の構成ファイルでインフラストラクチャ全体を定義および制御できるため、アプリケーションがどの環境でも同じようにデプロイ、拡張、および実行されることが保証されます。重要なのは、その柔軟性を活用し、適切な実践を維持し、そして何よりも、それが提供する可能性と限界を十分に理解することです。 Compose を習得すれば、最新のソフトウェア開発と管理に不可欠なツールを手に入れることができます。
