Swarm とコンテナのネットワーク

Docker Swarm は Docker のネットワーク機能と完全に互換性があります。 マルチホストによるネットワーク機能も含みます。 これは複数の Docker ホストにわたっての独自のコンテナ・ネットワークを生成できるものです。

独自のネットワークに対して Swarm を使うには、Docker コンテナのネットワーク についての概念を一通り読んでおいてください。 また マルチホストネットワークをはじめよう の例を試しておくことも必要でしょう。

Swarm クラスタにおける独自ネットワークの生成

マルチホストネットワークでは、キーバリューを保存するストア(store)が必要になります。 このキーバリューストアは、ネットワークの状態を表わす情報を保持するものであり、ネットワーク検出、ネットワーク自体の情報、エンドポイント、IP アドレスなどの情報があります。 Docker の libkv プロジェクトを通じて、Docker では Consul、Etcd、ZooKeeper といったキーバリューストアバックエンドがサポートされます。 サポートしているこのバックエンドの詳細は libkv プロジェクト を参照してください。

独自のネットワークを生成するには、キーバリューストアバックエンドを 1 つ選んで、ネットワーク上に実装する必要があります。 そして Docker Engine デーモンにおいて、このストアを利用する設定を行います。 設定の際には 2 つのパラメータ、--cluster-store, --cluster-advertise を使って、キーバリューストアの存在するサーバを指定します。

Swarm の各ノード上にてデーモンの設定と再起動を行えば、ネットワークを生成できるようになります。

ネットワークの一覧確認

以下の例では、クラスタ内に 2 つのノード node-0node-1 があるとします。 Swarm ノードからネットワーク一覧を確認します。

$ docker network ls
NETWORK ID          NAME                   DRIVER
3dd50db9706d        node-0/host            host
09138343e80e        node-0/bridge          bridge
8834dbd552e5        node-0/none            null
45782acfe427        node-1/host            host
8926accb25fd        node-1/bridge          bridge
6382abccd23d        node-1/none            null

上に示すように、各ネットワーク名の先頭にはノード名がつきます。

ネットワークの作成

デフォルトで Swarm は、グローバルなスコープを持つネットワークドライバ overlay を用います。 グローバルスコープのネットワークドライバは、Swarm クラスタ全体にわたるネットワークを生成します。 Swarm のもとで overlay ネットワークを生成する場合、-d オプションは省略できます。

$ docker network create swarm_network
42131321acab3233ba342443Ba4312
$ docker network ls
NETWORK ID          NAME                   DRIVER
3dd50db9706d        node-0/host            host
09138343e80e        node-0/bridge          bridge
8834dbd552e5        node-0/none            null
42131321acab        node-0/swarm_network   overlay
45782acfe427        node-1/host            host
8926accb25fd        node-1/bridge          bridge
6382abccd23d        node-1/none            null
42131321acab        node-1/swarm_network   overlay

上に示されるように node-0/swarm_networknode-1/swarm_network は同じ ID を持ちます。 クラスタ上にネットワークを生成すると、ノードすべてがアクセス可能になるわけです。

ローカルなスコープのネットワークを(たとえば bridge ネットワークドライバを利用して)生成する場合は、<node>/<name> という記述を行う必要があります。 こうしないと、ネットワークがランダムに選び出されたノード上に生成されてしまいます。

$ docker network create node-0/bridge2 -b bridge
921817fefea521673217123abab223
$ docker network create node-1/bridge2 -b bridge
5262bbfe5616fef6627771289aacc2
$ docker network ls
NETWORK ID          NAME                   DRIVER
3dd50db9706d        node-0/host            host
09138343e80e        node-0/bridge          bridge
8834dbd552e5        node-0/none            null
42131321acab        node-0/swarm_network   overlay
921817fefea5        node-0/bridge2         bridge
45782acfe427        node-1/host            host
8926accb25fd        node-1/bridge          bridge
6382abccd23d        node-1/none            null
42131321acab        node-1/swarm_network   overlay
5262bbfe5616        node-1/bridge2         bridge

--opt encrypted は Docker Swarm モードにおいてのみ利用可能な機能です。 これはスタンドアロンの Swarm ではサポートされていません。 ネットワークの暗号化には鍵の管理機能が必要で、これは Swarm の機能範囲には含まれません。

ネットワークの削除

ネットワークを削除するときは、ネットワーク ID かネットワーク名を用いた指定を行います。 2 つの異なるネットワークが同一名である場合は、<node> の記述を含めてください。

$ docker network rm swarm_network
42131321acab3233ba342443Ba4312
$ docker network rm node-0/bridge2
921817fefea521673217123abab223
$ docker network ls
NETWORK ID          NAME                   DRIVER
3dd50db9706d        node-0/host            host
09138343e80e        node-0/bridge          bridge
8834dbd552e5        node-0/none            null
45782acfe427        node-1/host            host
8926accb25fd        node-1/bridge          bridge
6382abccd23d        node-1/none            null
5262bbfe5616        node-1/bridge2         bridge

swarm_network が全ノードから削除されました。 また bridge2node-0 からのみ削除されました。

Docker Swarm ドキュメントの例

参考

Swarm and container networks

https://docs.docker.com/swarm/networking/