オーバレイ・ネットワークの使用

overlay ネットワーク・ドライバは複数の Docker デーモンのホスト間に分散ネットワークを作成します。このネットワークは、ホスト固有のネットワーク上に(オーバレイ:覆い被さるように)位置します。そして、暗号化が有効であれば、オーバレイ・ネットワーク上に接続したコンテナ間(swarm サービスのコンテナも含みます)は安全に通信可能になります。正しいDocker デーモンのホストから、正しい送信先コンテナ間とにおいて、 Docker は透過的に各パケットをルーティングする処理を行います。

swarm の初期化するか、Docker ホストを既存の swarm へ追加すると、その Docker ホスト上に2つの新しいネットワークが作成されます。

  • ingress と呼ぶオーバレイ・ネットワークは、swarm サービスに関連する制御とデータ転送を扱います。swarm サービスを作成する時、ユーザ定義オーバレイ・ネットワークへ接続しなければ、サービスはデフォルトで ingress ネットワークに接続します。
  • docker_gwbridge と呼ぶブリッジ・ネットワークは、個々の Docker デーモンが swarm に参加する他のデーモンに接続します。

docker network create を使い、ユーザ定義 overlay ネットワークを作成できます。これはユーザ定義 bridge ネットワークを作成できるのと同じ方法です。サービスまたはコンテナは同時に1つまたは複数のネットワークに接続可能です。サービスまたはコンテナは、お互いに接続しているネットワークを横断してのみ通信できます。

swarm サービスとスタンドアロン・コンテナの両方がオーバレイ・ネットワークに接続可能ですが、デフォルトの挙動と設定に関することは異なります。そのため以降のトピックでは、オーバレイ・ネットワーク全体に適用されることと、swarm サービス・ネットワークに適用されること、スタンドアロン・コンテナによって使われるオーバレイ・ネットワークについてを分けて扱います。

オーバレイ・ネットワーク全体の操作

オーバレイ・ネットワークの作成

注釈

事前準備

  • Docker デーモンがオーバレイ・ネットワークを使うためのファイアウォール・ルール

    各 Docker ホストがオーバレイ・ネットワークに参加し、トラフィックをやりとりするには、以下ポートの公開が必要です。

    • クラスタ管理通信のため、TCP ポート 2377
    • ノード間での通信のため、TCP および UDP ポート 7946
    • オーバレイ・ネットワークのトラフィック用に UDP ポート 4789
  • オーバレイ・ネットワークを作成する前に、 docker swarm init を使い Docker デーモンを swarm manager として初期化するか、あるいは、 docker swarm join を使って既存の swarm に参加するかのいずれかが必要です。

swarm サービスが使うオーバレイ・ネットワークを作成するには、以下のようなコマンドを使います。

$ docker network create -d overlay my-overlay

swarm サービス または スタンドアロン・コンテナが、Docker デーモン上で実行中の他のスタンドアロン・コンテナと通信可能なオーバレイ・ネットワークを作成するには、 --attachable フラグを追加します。

$ docker network create -d overlay --attachable my-attachable-overlay

IP アドレス範囲、サブネット、ゲートウェイ、その他のオプションを指定可能です。詳細は docker network create --help をご覧ください。

オーバレイ・ネットワーク上でトラフィック暗号化

全ての swarm サービス管理トラフィックは、デフォルトで全て GCM の AES アルゴリズム で暗号化されています。swarm 内の manager ノードは、暗号化したゴシップ・データを用いて 12 時間ごとに鍵をローテート(更新)します。

アプリケーション・データも同様に暗号化するには、オーバレイ・ネットワークの作成時に --opt encrypted を追加します。これにより xvlan レベルにおける IPSEC 暗号化が有効化します。しかし、この暗号化により、無視できない性能上のペナルティを負います。そのため、このオプションをプロダクションで使う前にテストすべきです。

オーバレイ暗号化を有効化する場合、 Docker は IPSEC トンネルを全てのノード間に作成します。そして、ここを通し、タスクはオーバレイネットワークにアタッチするサービスとしてスケジュールされます。このトンネルも GCM の AES アルゴリズムを使い、manager ノードは 12 時間ごとに鍵を自動的にローテートします。

警告

Windows ノードを暗号化オーバレイ・ネットワークに接続しないでください

Windows 上ではオーバレイ・ネットワークの暗号化をサポーしていません。もしも Windows ノードが暗号化オーバレイ・ネットワークに接続を試みると、エラーが出ませんが、ノードは通信できなくなります。

swarm モードオーバレイ・ネットワークとスタンドアロン・コンテナ

オーバレイ・ネットワーク機能では --opt encrypted --attachable の両方を使うと、そのネットワークに管理外のコンテナが接続可能二なります。

$ docker network create --opt encrypted --driver overlay --attachable my-attachable-multi-host-network

デフォルト ingress ネットワークのカスタマイズ

ほとんどのユーザは ingress ネットワークの設定変更が不要ですが、 Docker 17.05 以上では変更が可能です。そのため、自動的に選ばれるサブネットが既存のネットワークと衝突する場合や、MTA のような低水準のカスタマイズが必要な場合に役立ちます。

ingress ネットワークのカスタマイズに伴い、このネットワークの削除と再作成を行います。swarm 内にサービスを作成していなければ、通常はそのまま完了します。もしもポートを公開しているサービスが存在している場合は、 ingress ネットワークを削除する前に、それらサービスの削除が必要です。

ingress ネットワークが一切存在しなくなれば、既存のサービスがポートを公開していなければ機能し続けますが、負荷分散されません。ポート 80 を公開する WordPress のように、ポートを公開するサービスであれば影響を受けます。

  1. docker network inspect ingress を使って ingress ネットワークを調査し、そこに接続しているコンテナのサービスを削除します。ポート 80 を公開している WordPress サービスのように、ポートを公開しているサービスがあります。それら全てのサービスを停止しなければ、次のステップは失敗します。
  1. 既存の ingress ネットワークを削除します。

    $ docker network rm ingress
    
    WARNING! Before removing the routing-mesh network, make sure all the nodes
    in your swarm run the same docker engine version. Otherwise, removal may not
    be effective and functionality of newly created ingress networks will be
    impaired.
    Are you sure you want to continue? [y/N]
    
  1. --ingress フラグと設定の必要があればカスタム・オプションを付けて、新しいオーバレイ・ネットワークを作成します。以下の例は MTG を 1200 に設定し、サブネットを 10.11.0.0/16 に設定し、ゲートウェイを 10.11.0.2 に設定します。

    $ docker network create \
      --driver overlay \
      --ingress \
      --subnet=10.11.0.0/16 \
      --gateway=10.11.0.2 \
      --opt com.docker.network.driver.mtu=1200 \
      my-ingress
    

    注釈

    ingress ネットワークに対しては ingress 以外の名前を付けられますが、作成できる ingress ネットワークは1つだけです。2つめのネットワークの作成を試みても失敗します。

  1. サービスを再起動し、停止した段階のステップに戻ります。

docker_gwbridge インタフェースのカスタマイズ

docker_gwbridge は仮想ブリッジであり、

  1. Docker を停止します。
  1. 既存の docker_gwbridge インターフェースを削除します。

    $ sudo ip link set docker_gwbridge down
    
    $ sudo ip link del dev docker_gwbridge
    
  1. Docker を起動します。swarm への参加や初期化は行わないでください。
  1. docker network create コマンドを使って、 docker_gwbridge ブリッジにカスタム設定を加えて再作成します。

    $ docker network create \
    --subnet 10.11.0.0/16 \
    --opt com.docker.network.bridge.name=docker_gwbridge \
    --opt com.docker.network.bridge.enable_icc=false \
    --opt com.docker.network.bridge.enable_ip_masquerade=true \
    docker_gwbridge
    
  1. swarm へ参加するか初期化します。ブリッジは既に存在していますので、Docker は自動設定に基づく作成を行いません。

swarm サービスに対する操作

オーバレイ・ネットワーク上にポート公開

フラグの値 説明
-p 8080:80 あるいは
-p published=8080,target=80
ルーティング・メッシュ上のポート 8080 に、サービス・ポート上の TCP 80 を割り当て
-p 8080:80/udp あるいは
-p published=8080,target=80,protocol=udp
ルーティング・メッシュ上のポート 8080 に、サービス・ポート上の UDP 80 を割り当て
-p 8080:80/tcp -p 8080:80/udp あるいは
-p published=8080,target=80,protocol=tcp
-p published=8080,target=80,protocol=udp
ルーティング・メッシュ上のポート 8080 に、サービス・ポート上の TCP 80 を割り当て、かつ、ルーティング・メッシュ上のポート 8080 に、サービス・ポート上の UDP 80 を割り当て

swarm サービス用のルーティング・メッシュを回避

デフォルトでは、 swarm サービスはルーティング・メッシュを使って、その上でポートを公開します。swarm ノード(そこで対象サービスが動いているかどうかに関係なく)のいずれかの公開ポートに接続すると、サービスが稼働している worker に対して透過的に転送されます。事実上、Docker は swarm サービスに対する負荷分散として振る舞います。ルーティング・メッシュを使うサービスは仮想 IP (VIP)モードとして動作します。たとえ、各サービス上でサービスが動いていたとしても(つまり --mode global フラグ)、ルーティング・メッシュを使います。ルーティング・メッシュの使用時、Docker ノードがクライアントからの要求を処理する保証はありません。

ルーティング・メッシュを回避するには、 --endpoint-modednsrr に指定子、DNS ラウンド・ロビン(DNSRR)モードを使ってサービスを起動します。サービスの手前に、自身でロードバランサを置く必要があります。Docker ホスト上のサービス名に対する DNS 問い合わせ(クエリ)が返すのは、サービスを実行しているノードの IP アドレスの一覧です。このリストを使って負荷分散し、ノードを全体にトラフィックを分散するように設定します。

制御とデータのトラフィックを分離

デフォルトでは、swarm 管理に関連する管理トラフィックと、実行しているアプリケーションからのトラフィックは、同じネットワーク上を通り、swarm はトラフィックの暗号化を制御します。Docker は、この2種類のトラフィクの扱うネットワーク・インターフェースを分けて使えます。swarm の初期化もしくは追加時に、 --advertise-addr--datapath-addr を別々に指定します。これは swarm のノードを参加する度に必須です。

オーバレイ・ネットワーク上でスタンドアロン・コンテナ用の操作

オーバレイ・ネットワークにスタンドアロン・コンテナを接続

--attachable フラグを付けずに作成する ingress ネットワークは、swarm サービスしか使えないことを意味し、スタンドアロン・コンテナは利用できません。スタンドアロン・コンテナをユーザ定義オーバレイ・ネットワークに接続するには、ネットワークの作成時に --attachable フラグを付けて利用可能になります。これにより、異なる Docker ホスト上で動作しているスタンドアロン・コンテナが、個々の Docker デーモン・ホスト上でのルーティング設定を行わずに通信が可能となります。

公開ポート

フラグの値 説明
-p 8080:80 オーバレイ・ネットワーク上のポート 8080 に、サービス・ポート上の TCP 80 を割り当て
-p 8080:80/udp オーバレイ・ネットワーク上のポート 8080 に、サービス・ポート上の UDP 80 を割り当て
-p 8080:80/sctp オーバレイ・ネットワーク上のポート 8080 に、サービス・ポート上の SCTP 80 を割り当て
-p 8080:80/tcp -p 8080:80/udp オーバレイ・ネットワーク上のポート 8080 に、サービス・ポート上の TCP 80 を割り当て、かつ、オーバレイ・ネットワーク上のポート 8080 に、サービス・ポート上の UDP 80 を割り当て

コンテナ・ディスカバリ

多くの状況において、サービス名を使って、負荷分散や全てのコンテナ(「tasks」)の背後にあるサービスを扱います。サービスの背後にある全てのタスク一覧を取得するには、 tasks.<サービス名> に対する DNS 問い合わせをします。

次のステップ

参考

Use overlay networks
https://docs.docker.com/network/overlay/