Docker Composeの概要

1. 概要

Dockerを広範囲に使用すると、いくつかの異なるコンテナの管理がすぐに面倒になります。
Docker Composeは、この問題を克服し、*一度に複数のコンテナーを簡単に処理できる*ツールです。
このチュートリアルでは、主な機能と強力なメカニズムについて説明します。

2. YAML設定の説明

つまり、Docker Composeは、*単一の_docker-compose.yml_構成ファイル*内で宣言された多くのルールを適用することで機能します。
これらのhttps://en.wikipedia.org/wiki/YAML[YAML]ルールは、人間が読める形式とマシンに最適化された形式の両方で、数行でプロジェクト全体を1万フィートからスナップショットする効果的な方法を提供します。
ほとんどすべてのルールが特定のDockerコマンドを置き換えるため、最終的に実行する必要があるのは次のとおりです。
docker-compose up
Composeによって内部で適用される多数の構成を取得できます。 これにより、Bashまたは他のスクリプトを使用してスクリプトを作成する手間が省けます。
このファイルでは、Composeファイル形式の_version_、少なくとも1つの_service_、およびオプションで_volumes_および_networks_を指定する必要があります。
version: "3.7"
services:
  ...
volumes:
  ...
networks:
  ...
これらの要素が実際に何であるかを見てみましょう。

* 2.1。 サービス*

まず、* _ services_はコンテナの構成を参照します*。
たとえば、フロントエンド、バックエンド、およびデータベースで構成されるドッキングされたWebアプリケーションを考えてみましょう。これらのコンポーネントを3つのイメージに分割し、構成内の3つの異なるサービスとして定義します。
services:
  frontend:
    image: my-vue-app
    ...
  backend:
    image: my-springboot-app
    ...
  db:
    image: postgres
    ...
サービスに適用できる設定は複数あり、それらについては後で詳しく説明します。

* 2.2。 ボリュームとネットワーク*

一方、_ボリューム_は、ホストとコンテナ間、またはコンテナ間でも共有されるディスク領域の物理領域です。 つまり、*ボリュームはホスト内の共有ディレクトリ*であり、一部またはすべてのコンテナから表示できます。
同様に、* _ networks_は、コンテナ間、およびコンテナとホスト間の通信ルールを定義します*。 共通のネットワークゾーンはコンテナのサービスを相互に検出可能にし、プライベートゾーンはそれらを仮想サンドボックスに分離します。
繰り返しますが、それらについては次のセクションで詳しく説明します。

3. サービスの分析

それでは、サービスの主な設定を調べてみましょう。

* 3.1。 画像のプル*

サービスに必要な画像がhttps://hub.docker.com/[Docker Hub]または別のDocker Registryに既に公開されている場合があります。
その場合は、イメージ名とタグを指定して、_image_属性でそれを参照します。
services:
  my-service:
    image: ubuntu:latest
    ...

* 3.2。 イメージの構築*

代わりに、https://docs.docker.com/compose/compose-file/#build [build]ソースコードから_Dockerfile_を読み取ってイメージを作成する必要があります。
今回は、_build_キーワードを使用して、Dockerfileへのパスを値として渡します。
services:
  my-custom-app:
    build: /path/to/dockerfile/
    ...
パスではなくhttps://gist.github.com/derianpt/420617ffa5d2409f9d2a4a1a60cfa9ae#file-build-contexts-yml[use a URL]を使用することもできます。
services:
  my-custom-app:
    build: https://github.com/my-company/my-project.git
    ...
さらに、_build_属性と一緒に_image_名を指定できます。これにより、作成されたイメージにhttps://stackoverflow.com/a/35662191/1654265 [他のサービスで使用できるようになります]という名前が付けられます。
services:
  my-custom-app:
    build: https://github.com/my-company/my-project.git
    image: my-project-image
    ...

* 3.3。 ネットワークの構成*

  • Dockerコンテナは、Docker Composeによって暗黙的または構成を介して作成されたネットワーク内で相互に通信します*。 expose_キーワードを使用してポートにアクセスできるようにした場合、サービスはコンテナー名とポート(たとえば、_network-example-service:80)で参照するだけで、同じネットワーク上の別のサービスと通信できます。

services:
  network-example-service:
    image: karthequian/helloworld:latest
    expose:
      - "80"
ちなみに、この場合、_expose_ディレクティブは既にhttps://github.com/karthequian/docker-helloworld/blob/master/Dockerfile#L45[the image Dockerfile]にあるため、公開することなく動作します。
*ホストからコンテナにアクセスするには、*ポートを_ports_キーワードで宣言的に公開する必要があります*。これにより、ホストでポートを異なる方法で公開するかどうかを選択できます。
services:
  network-example-service:
    image: karthequian/helloworld:latest
    ports:
      - "80:80"
    ...
  my-custom-app:
    image: myapp:latest
    ports:
      - "8080:3000"
    ...
  my-custom-app-replica:
    image: myapp:latest
    ports:
      - "8081:3000"
    ...
これで、ポート80がホストから見えるようになりますが、他の2つのコンテナのポート3000は、ホストのポート8080および8081で使用できます。 *この強力なメカニズムにより、衝突することなく同じポートを公開するさまざまなコンテナを実行できます*。
最後に、コンテナを分離するために追加の仮想ネットワークを定義できます。
services:
  network-example-service:
    image: karthequian/helloworld:latest
    networks:
      - my-shared-network
    ...
  another-service-in-the-same-network:
    image: alpine:latest
    networks:
      - my-shared-network
    ...
  another-service-in-its-own-network:
    image: alpine:latest
    networks:
      - my-private-network
    ...
networks:
  my-shared-network: {}
  my-private-network: {}
この最後の例では、_another-service-in-the-the-network_がpingを実行して_network-example-service_のポート80に到達し、_another-service-in-the-own-network_が勝ったことがわかります。 't。

* 3.4。 ボリュームのセットアップ*

ボリュームには、https://success.docker.com/article/different-types-of-volumes [_anonymous _、_ named_、および_host_]の3つのタイプがあります。
  • Dockerは、匿名ボリュームと名前付きボリュームの両方を管理し、ホストの自己生成ディレクトリに自動的にマウントします。 匿名ボリュームはDockerの古いバージョン(1.9より前)では便利でしたが、最近では名前付きボリュームが推奨される方法です。 ホストボリュームを使用すると、ホスト内の既存のフォルダーを指定することもできます。

    サービスレベルでホストボリュームを構成し、構成の外部レベルで名前付きボリュームを構成して、後者を所属するコンテナーだけでなく他のコンテナーからも見えるようにすることができます。
services:
  volumes-example-service:
    image: alpine:latest
    volumes:
      - my-named-global-volume:/my-volumes/named-global-volume
      - /tmp:/my-volumes/host-volume
      - /home:/my-volumes/readonly-host-volume:ro
    ...
  another-volumes-example-service:
    image: alpine:latest
    volumes:
      - my-named-global-volume:/another-path/the-same-named-global-volume
    ...
volumes:
  my-named-global-volume:
ここで、両方のコンテナは、マッピングしたパスが異なっていても、_my-named-global-volume_共有フォルダへの読み取り/書き込みアクセス権を持ちます。 代わりに、2つのホストボリュームは_volumes-example-service_でのみ使用できます。
ホストのファイルシステムの_ / tmp_フォルダーは、コンテナーの_ / my-volumes / host-volume_フォルダーにマップされます。 ファイルシステムのこの部分は書き込み可能です。つまり、コンテナはホストマシンでファイルの読み取りだけでなく書き込み(および削除)もできます。
  • _ / home_フォルダーのように、ルールに_:ro_ *を追加することで、読み取り専用モードでボリュームをマウントできます(Dockerコンテナーがユーザーを誤って消去することは望ましくありません)。

* 3.5。 依存関係の宣言*

多くの場合、一部のサービスが他のサービスの前にロードされる(およびアンロードされる)ように、サービス間に依存関係チェーンを作成する必要があります。 _depends_on_キーワードを使用してこの結果を達成できます。
services:
  kafka:
    image: wurstmeister/kafka:2.11-0.11.0.3
    depends_on:
      - zookeeper
    ...
  zookeeper:
    image: wurstmeister/zookeeper
    ...
ただし、Composeは_kafka_サービスを開始する前に_zookeeper_サービスの読み込みが完了するのを待たず、単に開始するのを待つことに注意してください。 別のサービスを開始する前にサービスを完全にロードする必要がある場合は、https://docs.docker.com/compose/startup-order/ [Composeでの起動およびシャットダウン順序の詳細な制御]を取得する必要があります。

4. 環境変数の管理

Composeでは、環境変数の操作は簡単です。 静的環境変数を定義でき、_ $ \ {} _表記で動的変数も定義できます。
services:
  database:
    image: "postgres:${POSTGRES_VERSION}"
    environment:
      DB: mydb
      USER: "${USER}"
これらの値をComposeに提供するさまざまな方法があります。
たとえば、同じディレクトリ内の_.env_ファイルに、_。properties_ファイル、_key = value_のような構造に設定します。
POSTGRES_VERSION=alpine
USER=foo
それ以外の場合は、コマンドを呼び出す前にOSで設定できます。
export POSTGRES_VERSION=alpine
export USER=foo
docker-compose up
最後に、シェルで単純なワンライナーを使用すると便利です。
POSTGRES_VERSION=alpine USER=foo docker-compose up
アプローチを混在させることもできますが、Composeは次の優先順位を使用し、重要度の低いものを高いもので上書きすることに注意してください。
  1. ファイルを作成

  2. シェル環境変数

  3. 環境ファイル

  4. Dockerfile

  5. 定義されていない変数

5. スケーリングとレプリカ

古いComposeバージョンでは、コンテナのインスタンスをhttps://docs.docker.com/compose/reference/scale/[_docker-compose scale_]コマンドでスケーリングできました。 新しいバージョンでは廃止され、_–– scale_オプションに置き換えられました。
一方、https://docs.docker.com/engine/swarm/ [Docker Swarm](Docker Engineのクラスター)を活用し、_deploy_セクションの_replicas_属性を使用して宣言的にコンテナーを自動スケーリングできます。
services:
  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 6
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      ...
_deploy、_では、リソースのしきい値など、他の多くのオプションも指定できます。 ただし、Swarmにデプロイする場合にのみ_deploy_セクション全体を考慮して作成し、そうでない場合は無視します。

*6. 実世界の例:Spring Cloud Data Flow *

小さな実験は単一のギアを理解するのに役立ちますが、実際のコードが実際に動作しているのを見ると、全体像が明らかになります。
Spring Cloud Data Flowは複雑なプロジェクトですが、理解できるほど簡単です。 https://dataflow.spring.io/docs/installation/local/docker/ [そのYAMLファイルをダウンロード]を実行してみましょう:
DATAFLOW_VERSION=2.1.0.RELEASE SKIPPER_VERSION=2.0.2.RELEASE docker-compose up
Composeは、すべてのコンポーネントをダウンロード、構成、および起動し、*コンテナのログを現在のターミナルの単一のフローに*交差させます。
また、それぞれにユニークな色を適用して、優れたユーザーエクスペリエンスを実現します。
link:/uploads/Screenshot-from-2019-05-22-01-37-52-1024x576.png []
新しいDocker Composeインストールを実行すると、次のエラーが表示される場合があります。
lookup registry-1.docker.io: no such host
この一般的な落とし穴に対するhttps://stackoverflow.com/questions/46036152/lookup-registry-1-docker-io-no-such-host [異なるソリューションがあります]が、DNSとして_8.8.8.8_を使用すると、最も単純な。

7. ライフサイクル管理

最後に、Docker Composeの構文を詳しく見てみましょう。
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
https://docs.docker.com/compose/reference/overview/ [利用可能な多くのオプションとコマンド]がありますが、少なくともシステム全体を正しくアクティブ化および非アクティブ化するためにそれらを知る必要があります。

* 7.1。 起動*

_up_を使用して構成で定義されたコンテナー、ネットワーク、およびボリュームを作成および開始できることがわかりました。
docker-compose up
ただし、初回以降は、単に_start_を使用してサービスを開始できます。
docker-compose start
ファイルの名前がデフォルトの名前(_docker-compose.yml_)と異なる場合は、_- f_および_–– file_フラグを使用して代替ファイル名を指定できます。
docker-compose -f custom-compose-file.yml start
Composeは、_- d_オプションを指定して起動すると、デーモンとしてバックグラウンドで実行することもできます。
docker-compose up -d

* 7.2。 シャットダウン*

アクティブなサービスを安全に停止するには、_stop_を使用します。これにより、コンテナ、ボリューム、およびネットワークに加えられたすべての変更が保持されます。
docker-compose stop
代わりに、プロジェクトのステータスをリセットするには、単に_down_を実行します。これにより、*外部ボリュームのみを除いてすべてが破壊されます*:
docker-compose down

8. 結論

このチュートリアルでは、Docker Composeとその仕組みについて学習しました。
いつものように、ソース_docker-compose.yml_ファイルhttps://github.com/eugenp/tutorials/tree/master/docker[on GitHub]と、次の画像ですぐに利用できる有用な一連のテストを見つけることができます。
link:/uploads/Tests-1024x796.png []