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

--optencrypted は 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/