1. 概要

ご存知のように、 Docker Compose は、複数のコンテナーを一度に定義および管理するためのツールです。 デフォルトでは、Docker Composeは定義されたコンテナー専用のネットワークをセットアップし、コンテナー間の通信を可能にします。 その結果、1つのコマンドを使用して、特定の構成ファイルでサービスを作成および実行できます。

このチュートリアルでは、コンテナ間のネットワークをカスタマイズできる2つのYAMLプロパティ( exposeports)を紹介します。 それらを詳細に説明し、基本的な使用例を示し、それらの主な違いを強調します。

2. exposeセクション

まず、exposeの構成を見てみましょう。 このプロパティは、DockerComposeがコンテナから公開するポートを定義します。

これらのポートは、同じネットワークに接続されている他のサービスからアクセスできますが、ホストマシンでは公開されません。

services セクションでその番号を指定することにより、ポートを公開できます。

services:
  myapp1:
    ...
    expose:
      - "3000"
      - "8000"
  myapp2:
    ...
    expose:
      - "5000"

ご覧のとおり、サービスごとに複数の値を指定できます。 myapp1コンテナのポート30008000と、myapp2のポート5000を公開しました。 ]容器。 これで、同じネットワーク内の他のコンテナのこれらのポートでサービスにアクセスできるようになりました。

公開されているポートを確認してみましょう。

> docker ps
CONTAINER ID   IMAGE    COMMAND     CREATED     STATUS      PORTS               NAMES
8673c14f18d1   ...      ...         ...         ...         3000/tcp, 8000/tcp  bael_myapp1
bc044e180131   ...      ...         ...         ...         5000/tcp            bael_myapp2

docker ps コマンドの出力では、PORTS列で公開されたポートを見つけることができます。

最後に、コンテナ間の通信を確認しましょう。

> docker exec -it bc044e180131 /bin/bash

bash-5.1$ nc -vz myapp1 3000
myapp1 (172.18.0.1:3000) open
bash-5.1$ nc -vz myapp1 8000
myapp1 (172.18.0.1:8000) open

myapp2CLIに接続しました。 netcat コマンドを使用して、myapp1から公開された両方のポートに到達可能であることを確認しました。

3. ポートセクション

次に、ポートセクションを確認しましょう。 前と同じように、このプロパティはコンテナから公開するポートを定義します。 ただし、 expose 構成とは異なり、これらのポートは内部でアクセス可能であり、ホストマシンで公開されます。

以前と同じように、専用セクションで各サービスのポートを定義できますが、構成はより複雑になる可能性があります。 まず、構成を定義するために2つの構文(短い構文と長い構文)から選択する必要があります。

3.1. 短い構文

短いものを分析することから始めましょう。短い構文は、ホストIPアドレス、ホストポート、およびコンテナポートを設定するためのコロンで区切られた文字列です

[HOST:]CONTAINER[/PROTOCOL]

ここで、HOST は、ホストポート番号またはIPアドレスを前に付けることができるポート番号の範囲です。 IPアドレスを指定しない場合、DockerComposeはポートをすべてのネットワークインターフェイスにバインドします。

C ONTAINER は、コンテナポート番号またはポート番号の範囲を定義します。

PROTOCOL は、コンテナポートを指定されたプロトコルに制限するか、空の場合はTCPに設定します。 CONTAINERパーツのみが必須です。

構文がわかったので、DockerComposeファイルでポートを定義しましょう。

services:
  myapp1:
    ...
    ports:
    - "3000"                             # container port (3000), assigned to random host port
    - "3001-3005"                        # container port range (3001-3005), assigned to random host ports
    - "8000:8000"                        # container port (8000), assigned to given host port (8000)
    - "9090-9091:8080-8081"              # container port range (8080-8081), assigned to given host port range (9090-9091)
    - "127.0.0.1:8002:8002"              # container port (8002), assigned to given host port (8002) and bind to 127.0.0.1
    - "6060:6060/udp"                    # container port (6060) restricted to UDP protocol, assigned to given host (6060)

上に示したように、短い構文のさまざまなバリエーションを使用して、複数のコンテナポートを一度に公開し、より正確に構成することもできます。 Docker Composeは、指定されたすべてのコンテナポートを公開し、ローカルマシンから内部および外部に到達できるようにします。

前と同じように、 dockerpsコマンドで公開されたポートを確認しましょう。

> docker ps -a
CONTAINER ID   ... PORTS                                                                        NAMES
e8c65b9eec91   ... 0.0.0.0:51060->3000/tcp, 0.0.0.0:51063->3001/tcp, 0.0.0.0:51064->3002/tcp,   bael_myapp1
                   0.0.0.0:51065->3003/tcp, 0.0.0.0:51061->3004/tcp, 0.0.0.0:51062->3005/tcp, 
                   0.0.0.0:8000->8000/tcp, 0.0.0.0:9090->8080/tcp, 0.0.0.0:9091->8081/tcp
                   127.0.0.1:8002->8002/tcp, 0.0.0.0:6060->6060/udp

ここでも、 PORTS 列で、公開されているすべてのポートを見つけることができます。 矢印の左側の値は、外部でコンテナに到達できるホストアドレスを示しています。

3.2. 長い構文

長い構文を使用して、同じ方法でポートを構成できます。 ただし、コロンで区切られた文字列を使用する代わりに、各プロパティを個別に定義します

services: 
  myapp1:
  ...
  ports:
  # - "127.0.0.1:6060:6060/udp"
  - target: 6060
    host_ip: 127.0.0.1
    published: 6060
    protocol: udp
    mode: host

ここで、 target は必須であり、公開されるコンテナポート(またはポートの範囲)を指定します。これは、短い構文のCONTAINERと同等です。

host_ippublishedは、短いものの HOST の一部であり、ホストのIPアドレスとポートを定義できます。

プロトコルは、短い構文の PROTOCOL と同じで、コンテナポートを指定されたプロトコル(または空の場合は TCP )に制限します。

mode は、ポート公開ルールを指定する2つの値を持つ列挙型です。 ポートをローカルに公開するには、host値を使用する必要があります。 2番目の値– ingress –は、より複雑なコンテナー環境用に予約されており、ポートの負荷が分散されることを意味します。

結論として、短い構文文字列は、長い構造で簡単に表すことができます。 ただし、 mode プロパティがないため、すべての長い構文構成が短い構文構成に移動されるとは限りません。

4. 結論

この記事では、DockerComposeのネットワーク構成の一部について説明しました。 exposeセクションとportsセクションを使用して、ポート構成を分析および比較しました。

exportセクションでは、コンテナからの特定のポートを同じネットワーク上の他のサービスにのみ公開できます。 これは、コンテナポートを指定するだけで実行できます。

portsセクションは、containersから指定されたポートも公開します。 以前のとは異なり、 ポートは、同じネットワーク上の他のサービスだけでなく、ホストに対しても開かれています。 構成はもう少し複雑で、公開ポート、ローカルバインディングアドレス、および制限付きプロトコルを構成できます。 好みに応じて、2つの異なる構文から選択できます。