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

Docker Swarm は Docker のネットワーク機能と完全な互換性があります。互換性の中には複数のホストに対するマルチホスト・ネットワーク機能も含まれます。これは複数の Docker ホストを横断するカスタム・コンテナ・ネットワークを作成する機能です。

Swarm をカスタム・ネットワークで使う前に、Docker コンテナ・ネットワーク の概念に関する情報をお読みください。また、 マルチホスト・ネットワーク機能を始める のサンプルも試すべきでしょう。

Swarm クラスタにカスタム・ネットワークを作成

マルチホスト・ネットワーク機能を使うにはキーバリュー・ストアが必要です。キーバリュー・ストアはネットワークの情報を保持する場所です。ここにはディスカバリ情報、ネットワーク、エンドポイント、 IP アドレス等が含まれます。Docker の libkv プロジェクトの成果により、Docker は Consul 、Etcd 、ZooKeeper の各キーバリュー・ストア・バックエンドをサポートします。詳細は libkv プロジェクト をご覧ください。

カスタム・ネットワークを作成するには、キーバリュー・ストア・バックエンドを選択し、自分のネットワーク上に実装する必要があります。それから、Docker Engine デーモンの設定を変更し、キーバリュー・ストアにデータを保管できるようにします。キーバリュー・ストア用のサーバを参照するには --cluster-store--cluster-advertise という2つのパラメータが必要です。

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

ここで表示されているように、2つのノード上に node-0/swarm_networknode-1/swarm_network という同じ ID を持つネットワークがあります。これはクラスタに作成したネットワークであり、全てのノード上でアクセス可能なものです。

ローカルな範囲でネットワークを作成したい場合は(例えば、ブリッジ・ドライバを使いたい時)、 <ノード名>/<名前> の形式でなければ、ランダムに選んだノード上でネットワークを作成します。

$ 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

ネットワークの削除

ネットワークの削除は、ネットワーク ID か ネットワーク名を使えます。異なる2つのネットワークが同じ名前の場合は、 <ノード名>/<名前> を使えます。

$ 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 からのみ削除されました。