1. 概要docker-compose プロジェクトは、docker の公式オープン ソース プロジェクトであり、docker コンテナ クラスターの迅速なオーケストレーションを実現して、コンテナを簡単かつ効率的に管理し、複数のコンテナを定義および実行することを担当しています。
公式ドキュメント: https://docs.docker.com/compose/ GitHub: https://github.com/docker/compose/releases/ 以前、Docker Compose の基礎について記事を書きました。興味があれば、ぜひチェックしてみてください: Docker の三銃士の作品 2. ComposeとDockerの互換性Compose ファイル形式には、1、2、2.x、3.x という複数のバージョンがあります。次の表は、Compose ファイルでサポートされている特定の Docker ディストリビューションを示しています。 3. Dockerをインストールする# yum - config - manager設定ツールをインストールします 4. docker-composeをインストールする公式インストールチュートリアル: https://docs.docker.com/compose/install/other/ curl - SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64-o/usr/local/bin/docker-compose 5. 環境変数Docker Compose を使用すると、さまざまな方法でサービスの環境変数を設定できます。これらの環境変数は、アプリケーションを構成したり、機密情報をコンテナーに渡したりするために使用できます。 Docker Compose 環境変数を設定する方法はいくつかあります。 1) docker-compose.ymlファイルで環境変数を設定するdocker-compose.yml ファイルでサービスごとに環境変数を設定できます。サービス構成では、environment キーワードを使用して、設定する必要がある環境変数とその値をリストします。 サービス: 2) .envファイルから環境変数を読み取る環境変数を .env ファイルに保存し、Docker Compose に読み取らせることができます。 docker-compose.yml ファイルで、env_file キーワードを使用して、.env ファイルへのパスを指定します。 サービス: 3) シェル環境変数の使用docker-compose コマンドを起動するときに、シェル環境変数を使用して環境変数値を渡すこともできます。例えば: $ エクスポート MY_VAR = my_value シェル環境変数を参照するには、docker-compose.yml ファイルで ${MY_VAR} 構文を使用します。 サービス: 環境変数を使用すると、アプリケーションの柔軟性が向上し、機密情報の管理が容易になります。 6. 配置のフィールドの詳細な説明Docker Compose オーケストレーション ファイルには、理解しておくべき重要なフィールドがいくつかあります。 1) バージョンversion フィールドは、Docker Compose オーケストレーション ファイルのバージョンを指定します。現在の最新バージョンは3です。 バージョン: '3' 2) サービスservices フィールドは、Docker Compose オーケストレーションで実行するサービスを指定します。各サービスには名前があり、使用するイメージとコンテナの構成オプションを指定します。以下は単純なサービス構成の例です。 サービス: 3) ビルドとイメージ1. 構築するビルド フィールドを使用すると、Docker Compose オーケストレーション内の Dockerfile の場所を指定して、Docker Compose を使用してイメージをビルドできます。たとえば、ローカル Dockerfile を使用する例を次に示します。 サービス: Dockerfile を含むディレクトリを指定することもできます。 サービス: 2. 画像イメージ フィールドは、使用する Docker イメージを指定します。例えば: サービス:
バージョン: '3.8' 上記の構成では、サービス名を web、Dockerfile パスを ./web、イメージ名を myapp/web、タグを latest に指定しています。 docker-compose build コマンドを実行すると、myapp/web:latest という名前のイメージが自動的にビルドされます。 4) ネットワークネットワーク フィールドは、使用するネットワークを指定します。デフォルトでは、Docker Compose は default というネットワークを作成します。以下はカスタム ネットワークを使用した例です。 ネットワーク: 5) ボリュームボリューム フィールドは、使用するデータ ボリュームを指定します。以下はデータ ボリュームの使用例です (詳細は後述)。 巻数: 6) 環境と環境ファイル1. 環境環境フィールドは、設定する環境変数を指定します。環境変数を使用する例を次に示します。 環境: 2. 環境ファイルenvironment_file: ファイルから環境変数を読み取ることを指定します。 環境ファイル: .env 7) ポートと公開1. ポートports フィールドは、コンテナーにマップするホスト上のポートを指定します (ホスト ポート:コンテナー ポート)。以下はポート マッピングを使用する例です。 ポート: 2. 公開するexpose フィールドは、Docker コンテナ内のポートを公開するためのオプションであり、他のコンテナがそれらのポートに接続できるようにしますが、それらを Docker ホストにマッピングすることはありません。 docker-compose.yml ファイルの expose オプションを使用して、コンテナ内で公開する必要があるポートを指定します。たとえば、次の例では、ポート 8000 と 8080 を公開する Web サービスを定義します。 バージョン: '3' 公開オプションを使用すると、他のコンテナは Docker の内部ネットワークを使用して接続できます。たとえば、Web サービスのポート 8000 に接続する必要がある別のサービス ワーカーがある場合は、ワーカー サービスの docker-compose.yml ファイルで links オプションを使用できます。 バージョン: '3' 8) 依存するdepends_on フィールドは、サービス間の依存関係を指定します。たとえば、Web サービスが db サービスに依存している場合は、次の例を使用できます。 依存: 9) 再起動Docker Compose は、コンテナが失敗した場合に自動的に再起動するためのいくつかの再起動戦略を提供します。次の再起動戦略が利用可能です。
これらの戦略は、docker-compose.yml ファイルで restart キーを使用して指定できます。次に例を示します。 バージョン: '3' この例では always ポリシーを使用します。つまり、Web コンテナーが停止すると、Compose によって自動的に再起動されます。 10) コマンドコマンド フィールドは、ニーズや好みに応じて、コンテナーの起動時に実行されるコマンドを指定するためにさまざまな方法で記述できます。一般的な例をいくつか挙げます。 1. 文字列形式バージョン: '3' この例では、コマンド フィールドの値は、実行されるコマンドとそのパラメータを表す文字列です。 2. リスト形式バージョン: '3' この例では、コマンド フィールドの値はリストであり、各要素は実行されるコマンドまたはパラメーターを表します。 3. シェルコマンド形式バージョン: '3' 4. 環境変数を使用するバージョン: '3' この例では、コマンド フィールドの ${PORT} は、Web サービスの環境変数 PORT の値に置き換えられます。 11) 健康チェックhealthcheck: コンテナのヘルスチェック構成を指定します。 ヘルスチェック: 上記の例では、コンテナのヘルスチェック コマンドは「curl -f http://localhost/health」として構成されており、30 秒ごとにチェックされ、タイムアウトは 10 秒、再試行は最大 3 回です。 12) 設定と秘密1. 構成configs: コンテナで使用される構成ファイルを指定します。 設定: 上記の例では、my-config という名前の設定ファイルがコンテナの /etc/nginx/conf.d/default.conf ディレクトリにコピーされます。 2. 秘密secrets: コンテナで使用される秘密データを指定します。 秘密: 13) ホスト名とコンテナ名hostname と container_name はどちらも Docker コンテナを定義するために使用される識別子ですが、意味が異なります。 1. ホスト名hostname は、コンテナ内で使用できる名前であるコンテナのホスト名を設定するために使用されます。たとえば、コンテナ内で ping hostname コマンドを使用すると、コンテナの IP アドレスが解決されます。ホスト名は次の形式で設定できます。 バージョン: '3' この例では、Web サービスのコンテナ ホスト名は myapp-container に設定されています。 2. コンテナ名container_name はコンテナに名前を付けるために使用され、これは Docker ホストで使用される名前です。コンテナ名は次の形式で設定できます。 バージョン: '3' この例では、Web サービスのコンテナー名は myapp に設定されています。
14) ユーザーDocker Compose では、ユーザー フィールドを使用して、コンテナー内で実行されているプロセスのユーザーとグループを指定できます。その構文は docker run コマンドの --user オプションに似ており、次の 3 つの形式があります。 1. ユーザー:グループ (推奨)コンテナ内のプロセスを、ユーザー user およびグループ user group として実行します。例: バージョン: "3" 2. uid:gidコンテナ内のプロセスを uid ユーザー ID および gid グループ ID として実行します。例: バージョン: "3" 3. ユーザーコンテナ内のプロセスをユーザー user として実行します。例: バージョン: "3" Docker Compose でユーザー フィールドが使用されている場合、コンテナー内のすべてのプロセスはデフォルトのルート ユーザーではなく、指定されたユーザーとして実行されることに注意することが重要です。これにより、コンテナのセキュリティが向上し、コンテナ内でルート ユーザーを使用することによって発生する潜在的なセキュリティ リスクを回避できます。 15) 展開するdeploy: サービスのデプロイメント構成を指定します。 展開する: 上記の例では、構成サービスのレプリカの数は 3 で、各レプリカが使用する CPU およびメモリ リソースは制限されており、一部のリソースは他のサービス用に予約されています。 7. ポートとエクスポーズの違いports と expose は、コンテナー内のポートを公開するために使用される 2 つの異なる Docker Compose フィールドです。
バージョン: "3" この例では、コンテナ内で実行されている nginx プロセスはコンテナ内のポート 80 をリッスンし、ports フィールドはホスト上のポート 8080 をコンテナ内のポート 80 にマッピングします。このようにして、外部ネットワークはホストのポート 8080 にアクセスすることで、コンテナ内で実行されている nginx アプリケーションにアクセスできるようになります。
バージョン: "3" この例では、db コンテナーと web コンテナーはそれぞれ内部ポート 3306 と 80 を公開しており、他のコンテナーはこれらのポートを使用してそれらのコンテナーと通信できます。ただし、これらのポートはホスト マシンにマップされていないため、外部ネットワークから直接アクセスすることはできません。外部ネットワークからこれらのコンテナにアクセスする場合は、ポート フィールドを使用して、それらをホスト マシン上のポートにマップする必要があります。 8. 設定とシークレットの違いConfigs と Secrets は、コンテナ構成と機密データを管理するための Docker Compose と Docker Swarm の 2 つの異なる機能です。それらの違いは次のとおりです。
以下は、configs と secrets を使用する Docker Compose ファイルの例です。 バージョン: '3.7' 上記の例では、nginx:latest イメージを使用し、コンテナ内のポート 80 を Docker ホストのポート 80 にマッピングする Web サービスを定義しました。さらに、configs と secrets という 2 つの構成も定義しました。
上記の例では、ファイルマウントを使用して構成とシークレットにアクセスしました。これは最も一般的なアクセス方法ですが、唯一の方法ではありません。シークレットには、Docker CLI の docker secret コマンド経由で、またはコンテナのファイルシステム内からアクセスすることもできます。 9. マウントDocker Compose では、ホスト ディレクトリまたはファイルをマウントすることでコンテナー内のファイルまたはディレクトリにアクセスできるため、コンテナーの内外でデータまたは構成ファイルを共有できます。 Docker Compose は 2 つのマウント方法をサポートしています。 1) 名前付きボリュームのマウント名前付きボリュームは、Docker によって作成および管理されるボリュームです。永続的なデータを保存するために使用でき、複数のコンテナ間で共有できます。 Docker Compose では、ボリューム フィールドを使用して、名前付きボリュームのマウント パスとホスト ディレクトリ間のマッピングを定義できます。 Docker ボリューム管理の詳細については、私の記事「Docker データ ボリューム - ボリューム」を参照してください。例: バージョン: "3.7" 上記の例では、myapp:latest イメージを使用し、名前付きボリューム myapp_data をコンテナー内の /app/data ディレクトリにマウントする myapp サービスを定義します。 2) ホストディレクトリのマウントホスト ディレクトリ マウントを使用すると、Docker ホスト上のディレクトリまたはフォルダーをコンテナーにマウントして、コンテナー間でデータを共有できるようになります。 Docker Compose では、ボリューム フィールドを使用して、ホスト ディレクトリのマウント パスとホスト ディレクトリ間のマッピングを定義できます。例えば: バージョン: "3.7" 上記の例では、myapp:latest イメージを使用し、ホスト上の /host/data ディレクトリをコンテナ内の /app/data ディレクトリにマウントする myapp サービスを定義します。
10. ネットワークDocker Compose のネットワークを使用して、複数のコンテナ間の通信を確立できます。ネットワークを定義することで、コンテナはホスト ネットワークから分離しながら相互に通信できるようになり、コンテナ アプリケーションのセキュリティが向上します。実際、私の以前の記事も参照してください: 4 つの Docker ネットワーク モード (ブリッジ、ホスト、コンテナー、なし) Docker Compose には、ブリッジ、ホスト、なしの 3 つのネットワーク タイプが用意されており、それぞれ異なるシナリオに適しています。 1) ブリッジネットワークタイプブリッジ ネットワーク タイプはデフォルトのネットワーク タイプであり、ブリッジ ネットワークを作成してコンテナーが相互に通信できるようにします。各コンテナには独自の IP アドレスがあり、コンテナ名で相互にアクセスできます。ネットワーク タイプが指定されていない場合、Docker Compose はブリッジ ネットワーク タイプを使用します。 ブリッジ ネットワーク タイプでは、Docker Compose は各サービスに対してコンテナーを作成し、各コンテナーに IP アドレスを割り当てます。同じネットワーク内のコンテナは相互にアクセスできます。
[例] web と db という 2 つのサービスがあるとします。デフォルトでは、Docker Compose はブリッジ ネットワーク タイプを使用するため、特定のネットワーク タイプを指定する必要はありません。以下は docker-compose.yml ファイルのサンプルです。 バージョン: '3' 上記の例では、Web サービスはローカル Dockerfile を使用して構築され、コンテナ ポート 80 がホスト ポート 80 にマップされます。db サービスは MySQL 5.7 イメージを使用し、MySQL ルート ユーザー パスワードを example に設定します。 この例は、docker-compose up コマンドで開始します。 Docker Compose は各サービスにコンテナを作成し、サービスが相互に通信できるようにデフォルトのブリッジ ネットワークを自動的に作成します。 2) ホストネットワークタイプホスト ネットワーク タイプでは、コンテナーがホストのネットワーク スタックを共有できるため、コンテナーの IP アドレスとネットワーク インターフェイスはホストと同じになります。これにより、コンテナのネットワーク パフォーマンスとアクセシビリティが向上しますが、コンテナは同じネットワーク スタックを共有するため、相互にアクセスすることはできません。 ホスト ネットワーク タイプでは、Docker Compose は各サービスをホスト ネットワークに直接配置します。コンテナは IP アドレスとネットワーク インターフェイスをホストと共有するため、コンテナ内で実行されているサービスにはホスト IP アドレスを介してアクセスできます。 [例] ホスト ネットワーク インターフェイスを使用する必要があるサービスがあるとします。以下は docker-compose.yml ファイルのサンプルです。 バージョン: '3' 上記の例では、build キーワードを使用してビルド コンテキストを指定し、network_mode キーワードを使用してサービス web のネットワーク モードをホストに設定しています。このようにして、Web サービスは IP アドレスとネットワーク インターフェイスをホストと共有し、ホスト IP アドレスを通じてサービスにアクセスできるようになります。 3) ネットワークタイプなしnone ネットワーク タイプは、コンテナーにネットワーク リソースが割り当てられておらず、コンテナーにネットワーク インターフェイスがないことを意味します。これは通常、ホストと対話するだけでネットワーク接続を必要としないコンテナなど、特別なコンテナ シナリオで使用されます。 none ネットワーク タイプでは、Docker Compose は各サービスを個別のネットワーク名前空間に配置し、コンテナーにはネットワーク リソースがないため、ネットワーク経由で通信することはできません。 [例] ネットワーク接続を必要としないサービスがあるとします。以下は docker-compose.yml ファイルのサンプルです。 バージョン: '3' 上記の例では、build キーワードを使用してビルド コンテキストを指定し、network_mode キーワードを使用してサービス ワーカーのネットワーク モードを none に設定しています。この方法では、ワーカー サービスにはネットワーク リソースがなくなり、ネットワーク経由で通信できなくなります。 4) カスタムネットワークデフォルトでは、Docker Compose は Compose プロジェクトごとに 1 つのネットワークを作成します。このネットワークの名前の先頭には、Compose プロジェクト ディレクトリの名前が付けられます。たとえば、Compose プロジェクト ディレクトリの名前が myproject の場合、デフォルトで作成されるネットワークの名前は myproject_default になります。
バージョン: '3' この例では、Web サービスは、作成されたデフォルトのネットワークではなく、my_network ネットワークに接続されます。このネットワークのネットワーク ドライバーは bridge です。これは、Docker Compose で使用されるデフォルトのネットワーク ドライバーです。
たとえば、myapp というアプリケーションを開発していて、Docker Compose を使用してそのコンテナー化されたデプロイメントを管理する場合、Docker Compose ファイルを次のディレクトリ構造に保存します。 マイアプリ/ この例では、myapp は Compose プロジェクト ディレクトリの名前であり、docker-compose.yml は Compose ファイルの名前であり、myapp ディレクトリのルートに保存されます。 myapp ディレクトリには、アプリケーションのコード ディレクトリとデータ ディレクトリも含まれています。 11. ドメイン名解決 DNSDocker Compose 内のコンテナは、IP アドレスの代わりにコンテナ名またはサービス名を使用して相互にアクセスできます。これは、Docker Compose が各サービスの DNS レコードを作成し、それがデフォルトの DNS リゾルバーによって処理されるためです。 デフォルトでは、Docker Compose は「projectname_default」というネットワークを作成し、すべてのサービスをこのネットワークに接続します。このネットワークは、Docker の組み込み DNS リゾルバを使用して、各サービスとコンテナに DNS 名を割り当てます。たとえば、Compose プロジェクトの名前が「myproject」の場合、次のコマンドですべてのサービスの DNS 名を表示できます。 docker - compose run <サービス> nslookup <サービス> たとえば、サービス名が「web」の場合、次のコマンドを使用して Web サービスの DNS 名を表示できます。 docker - compose 実行 web nslookup web これにより、IP アドレスと DNS 名を含む Web サービスの DNS レコードが出力されます。例えば: サーバー: 127.0.0.11 この例では、Web サービスの DNS 名は「web」、IP アドレスは 172.18.0.2 です。 IP アドレスを使用する代わりに、この名前 (「web」) を使用してサービスにアクセスできます。 12. 健康チェックDocker Compose は、サービスが正常に実行されているかどうかを確認するためのサービスのヘルス チェックの定義をサポートしています。ヘルス チェックは、コマンド、HTTP リクエスト、または TCP ポートになります。ヘルスチェックが失敗した場合、Docker Compose は再試行の最大回数に達するか、サービスが正常に実行されるまで、サービスの再起動を試みます。 1) ヘルスチェック構文Docker Compose では、healthcheck キーワードを使用してヘルスチェックを定義できます。具体的な構文は次のとおりです。 ヘルスチェック: パラメータの説明:
2) 健康診断書の書き方書き方はいくつかあります: 1. 文字列形式のコマンド ヘルスチェック: 上記の例では、healthcheck フィールドの test 属性は、実行されるヘルス チェック コマンドを表す文字列です。この例では、curl コマンドを使用して、localhost:80 にアクセスできるかどうかをテストします。ヘルス チェック コマンドがステータス コード 0 を返す場合、サービスは正常であることを意味し、それ以外の場合はサービスが異常であることを意味します。この例では、ヘルス チェックが失敗した場合、Docker Compose は 30 秒ごとにヘルス チェックの再実行を試行し、最大 5 回まで再試行します。 2. 配列形式のコマンド ヘルスチェック: 3. カスタムコマンド ヘルスチェック: 上記の例では、healthcheck フィールドの test 属性は配列であり、最初の要素は CMD-SHELL であり、コマンドがシェルを使用して実行されることを示しています。 2 番目の要素は、前の例と同じカスタム コマンドです。 3) CMD-SHELLとCMDCMD-SHELL と CMD はどちらも、Dockerfile の RUN 命令と Docker Compose の healthcheck 命令でよく使用されるコマンド形式です。両者の違いは次のとおりです。
これら 2 つは使用方法が異なりますが、どちらもコマンドまたはコマンド パラメータを実行するために使用できます。 Dockerfile では、CMD-SHELL は有効な命令ではありません。 Docker Compose では、CMD を使用してサービスの起動コマンドを定義し、healthcheck の test 属性では CMD-SHELL を使用してカスタム シェル コマンドを実行できます。実際、CMD は docker compose healthcheck でも使用できます。 CMD-SHELL を使用することをお勧めします。 4) 例の説明以下はヘルスチェックを定義するシンプルな Docker Compose ファイルです。 バージョン: "3" この例では、Web サービスは nginx イメージを使用し、ポート 80 をホストのポート 80 にマッピングします。さらに、定期的に curl コマンドを実行して、サービスが HTTP リクエストに応答するかどうかをテストするヘルス チェックを定義します。具体的には、チェックは 1 分ごとに実行され、タイムアウトは 10 秒で、3 回再試行されます。 次のコマンドでサービスを開始できます。 # -fで docker - compose ファイルも指定します サービスが開始されると、Compose は定期的にヘルスチェックを実行し、チェック結果に基づいてサービスを再起動します。次のコマンドを使用して、サービスのヘルス ステータスを表示できます。 docker - ps を作成する このコマンドは、サービスのヘルス ステータスを表示します。例: 名前 コマンド 状態 ポート この例では、サービスのヘルス ステータスは「Up (healthy)」です。これは、サービスが実行中で、ヘルス チェックに合格していることを意味します。 13. 一般的なコマンド以下は、Docker Compose でよく使用されるコマンドです。
これらは、Docker Composeで一般的に使用されるコマンドであり、必要に応じてComposeプロジェクトを管理および操作できるようになります。 |
<<: [クラウドネイティブ] Prometheus カスタムアラートルール
>>: エッジコンピューティングは長い間私たちの身近に存在してきました
2003年に、impactvps(バックエンドドメイン名はsubnetlabs.com)を当サイトの...
2018年のダブルイレブン期間中、locvpsはすべてのVPS(香港CN2、韓国CN2、米国CN2、...
ウェブマスターの友人は Discuz をよくご存知だと思います。私たちが訪問するフォーラムのほとんど...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています導入:これ...
2017年ハルビンで高等教育情報化発展セミナー開催【中国ハルビン、2017年11月24日】11月、「...
みなさんこんにちは。私の名前はLiang Lei、オンライン名はStoneです。初心者にとって、SE...
digitalvirt cmin2 vps はどうですか? digitalvirtは、米国ロサンゼル...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますスタートア...
メッセージングシステムメッセージング システムは、データ プロデューサーの分離や未処理メッセージのキ...
以前、A5 では SEO に関する知識を皆さんとたくさん共有しました。今日、SEO Qibing は...
8月10日、EMUI分散キーテクノロジー機能のオープン性とツールチェーンサブフォーラムが、約2,00...
[[440556]]エッジ コンピューティングは、クラウドベースのネットワークの制限を打ち破ろうとし...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています過去2年間...
ウェブマスターは基本的に毎日外部リンクを処理する必要があります。どのような外部リンクを作るか、どのよ...
Docker をサポートし、安定性と信頼性に優れた KVM VPS をお探しの場合は、SSDNODE...