Docker Swarm ディスカバリ

Docker Swarm は複数のディスカバリ・バックエンドに対応しています。Docker Swarm はホステット・ディスカバリ・サービス(hosted discovery service)が利用可能です。このサービスは クラスタ上の IP アドレスの一覧を保持します。このページでは利用可能な様々なホステット・ディスカバリを紹介します。

分散キーバリュー・ストアの利用

Swarm でノードをディスカバリ(発見)するのに推奨される方法は、Docker による libkv プロジェクトの利用です。libkv プロジェクトとは既存の分散キーバリュー・ストア上の抽象化レイヤです。この原稿を書いている時点で、プロジェクトがサポートしているのは次の通りです。

  • Consul 0.5.1 以上
  • Etcd 2.0 以上
  • ZooKeeper 3.4.5 以上

libkv についてやサポートしているバックエンドに対する技術的な詳細は、 libkv プロジェクト をご覧ください。

ホステット・ディスカバリ・キーストアを使用

  1. 各ノードで Swarm エージェントを起動します。

ノード の IP アドレスは Swarm マネージャがアクセス可能であれば十分であり、パブリックな IP アドレスを持つ必要はありません。大きなクラスタになれば、Swarm に対するノードの参加が、ディスカバリ時に過負荷となる可能性があります。例えば、沢山のノードをスクリプトで登録する場合や、ネットワーク障害から復旧する時です。この影響によりディスカバリが失敗するかもしれません。そのような場合は、 --delay オプションで遅延上限を指定できます。そうすると、Swarm への登録がランダムに遅延して行われますが、指定した時間を上回ることはありません。

Etcd:

swarm join --advertise=<node_ip:2375> etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix>

Consul:

swarm join --advertise=<node_ip:2375> consul://<consul_addr>/<optional path prefix>

ZooKeeper:

swarm join --advertise=<node_ip:2375> zk://<zookeeper_addr1>,<zookeeper_addr2>/<optional path prefix>
  1. Swarm マネージャをサーバもしくはノート PC 上で起動します。

Etcd:

swarm manage -H tcp://<swarm_ip:swarm_port> etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix>

Consul:

swarm manage -H tcp://<swarm_ip:swarm_port> consul://<consul_addr>/<optional path prefix>

ZooKeeper:

swarm manage -H tcp://<swarm_ip:swarm_port> zk://<zookeeper_addr1>,<zookeeper_addr2>/<optional path prefix>
  1. 通常の Docker コマンドを実行します。
docker -H tcp://<swarm_ip:swarm_port> info
docker -H tcp://<swarm_ip:swarm_port> run ...
docker -H tcp://<swarm_ip:swarm_port> ps
docker -H tcp://<swarm_ip:swarm_port> logs ...
...
  1. クラスタ上のノード一覧を表示します。

Etcd:

swarm list etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix>
<node_ip:2375>

Consul:

swarm list consul://<consul_addr>/<optional path prefix>
<node_ip:2375>

ZooKeeper:

swarm list zk://<zookeeper_addr1>,<zookeeper_addr2>/<optional path prefix>
<node_ip:2375>

分散キーバリュー・ディスカバリに TLS を使う

分散キーバリュー・ストアと安全に通信できるようにするため、TLS を利用できます。ストアへ安全に接続するには、Swarm クラスタにノードが join (参加)する時に使う証明書を生成しなくてはいけません。証明書に対応しているのは Consul と Etcd のみです。以下は Consul を使う例です。

swarm join \
    --advertise=<node_ip:2375> \
    --discovery-opt kv.cacertfile=/path/to/mycacert.pem \
    --discovery-opt kv.certfile=/path/to/mycert.pem \
    --discovery-opt kv.keyfile=/path/to/mykey.pem \
    consul://<consul_addr>/<optional path prefix>

これは Swarm の managelist コマンドを使う場合も同様です。

静的なファイルまたはノード・リスト

ディスカバリ・バックエンドとして静的なファイルもしくはノードのリストを使えます。このファイルは Swarm マネージャがアクセス可能なホスト上に置く必要があります。あるいは、Swarm 起動時にオプションでノードのリストを指定することもできます。

静的なファイルあるいは nodes オプションは IP アドレスの範囲指定をサポートしています。特定のパターンで範囲を指定するには、例えば 10.0.0.[10:200] を指定したら、 10.0.0.10 から 10.0.0.200 までのノードを探そうとします。以下は file(ファイル) ディスカバリ手法を使う例です。

$ echo "10.0.0.[11:100]:2375"   >> /tmp/my_cluster
$ echo "10.0.1.[15:20]:2375"    >> /tmp/my_cluster
$ echo "192.168.1.2:[2:20]375"  >> /tmp/my_cluster

あるいはノードの直接指定でディスカバリするには、次のように実行します。

swarm manage -H <swarm_ip:swarm_port> "nodes://10.0.0.[10:200]:2375,10.0.1.[2:250]:2375"

ファイルを作成する場合

  1. ファイルを編集し、各行にノードの情報を追加します。
echo <node_ip1:2375> >> /opt/my_cluster
echo <node_ip2:2375> >> /opt/my_cluster
echo <node_ip3:2375> >> /opt/my_cluster

この例では /opt/my_cluster というファイルを作成しています。任意のファイル名を指定できます。

  1. Swarm マネージャを何らかのマシン上で実行します。
swarm manage -H tcp://<swarm_ip:swarm_port> file:///tmp/my_cluster
  1. 通常の Docker コマンドを使います。
docker -H tcp://<swarm_ip:swarm_port> info
docker -H tcp://<swarm_ip:swarm_port> run ...
docker -H tcp://<swarm_ip:swarm_port> ps
docker -H tcp://<swarm_ip:swarm_port> logs ...
...
  1. クラスタ上のノード一覧を表示します。

    $ swarm list file:///tmp/my_cluster <node_ip1:2375> <node_ip2:2375> <node_ip3:2375>

ノード・リストを指定する場合

  1. マシンもしくはノート PC 上でマネージャを起動します。
swarm manage -H <swarm_ip:swarm_port> nodes://<node_ip1:2375>,<node_ip2:2375>

あるいは

swarm manage -H <swarm_ip:swarm_port> <node_ip1:2375>,<node_ip2:2375>
  1. 通常の Docker コマンドを実行します。
docker -H <swarm_ip:swarm_port> info
docker -H <swarm_ip:swarm_port> run ...
docker -H <swarm_ip:swarm_port> ps
docker -H <swarm_ip:swarm_port> logs ...
  1. クラスタ上のノード一覧を表示します。
$ swarm list file:///tmp/my_cluster
<node_ip1:2375>
<node_ip2:2375>
<node_ip3:2375>

警告

Docker Hub ホステット・ディスカバリ・サービスはプロダクションでの利用が 推奨されていません 。これはテストや開発環境での利用を想定しています。プロダクション環境においては、ディスカバリ・バックエンドの項目をご覧ください。

Docker Hub のホステッド・ディスカバリ

この例は Docker Hub のホステッド・ディスカバリ・サービスを使います。Docker Hub のホステッド・ディスカバリ・サービスを使うには、インターネットに接続している必要があります。次のようにして Swarm クラスタを作成します。

  1. まずクラスタを作成します。
# クラスタを作成
$ swarm create
6856663cdefdec325839a4b7e1de38e8 # <- これが各自の <クラスタID> です
  1. 各ノードを作成し、クラスタに追加します。

各ノードで Swarm エージェントを起動します。Swarm Manager がアクセス可能であれば、<node_ip> はパブリックである必要はありません(例:192.168.0.x)。

$ swarm join --advertise=<node_ip:2375> token://<cluster_id>
  1. Swarm マネージャを起動します。

これはあらゆるマシン上だけでなく、自分のノート PC 上でも実行できます。

$ swarm manage -H tcp://<swarm_ip:swarm_port> token://<cluster_id>
  1. 通常の Docker コマンドでクラスタと通信します。
docker -H tcp://<swarm_ip:swarm_port> info
docker -H tcp://<swarm_ip:swarm_port> run ...
docker -H tcp://<swarm_ip:swarm_port> ps
docker -H tcp://<swarm_ip:swarm_port> logs ...
...
  1. クラスタのノード情報一覧を表示します。
swarm list token://<cluster_id>
<node_ip:2375>

新しいディスカバリ・バックエンドに貢献

あなたも Swarm 向けに新しいディスカバリ・バックエンドに貢献できます。どのようにするかは、 Docker Swarm リポジトリにある discovery README をお読みください。