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 プロジェクト をご覧ください。
ホステット・ディスカバリ・キーストアを使用¶
- 各ノードで 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>
- 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>
- 通常の 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 ...
...
- クラスタ上のノード一覧を表示します。
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 の manage
と list
コマンドを使う場合も同様です。
静的なファイルまたはノード・リスト¶
ディスカバリ・バックエンドとして静的なファイルもしくはノードのリストを使えます。このファイルは 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"
ファイルを作成する場合¶
- ファイルを編集し、各行にノードの情報を追加します。
echo <node_ip1:2375> >> /opt/my_cluster
echo <node_ip2:2375> >> /opt/my_cluster
echo <node_ip3:2375> >> /opt/my_cluster
この例では /opt/my_cluster
というファイルを作成しています。任意のファイル名を指定できます。
- Swarm マネージャを何らかのマシン上で実行します。
swarm manage -H tcp://<swarm_ip:swarm_port> file:///tmp/my_cluster
- 通常の 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 ...
...
クラスタ上のノード一覧を表示します。
$ swarm list file:///tmp/my_cluster <node_ip1:2375> <node_ip2:2375> <node_ip3:2375>
ノード・リストを指定する場合¶
- マシンもしくはノート 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>
- 通常の 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 ...
- クラスタ上のノード一覧を表示します。
$ swarm list file:///tmp/my_cluster
<node_ip1:2375>
<node_ip2:2375>
<node_ip3:2375>
警告
Docker Hub ホステット・ディスカバリ・サービスはプロダクションでの利用が 推奨されていません 。これはテストや開発環境での利用を想定しています。プロダクション環境においては、ディスカバリ・バックエンドの項目をご覧ください。
Docker Hub のホステッド・ディスカバリ¶
この例は Docker Hub のホステッド・ディスカバリ・サービスを使います。Docker Hub のホステッド・ディスカバリ・サービスを使うには、インターネットに接続している必要があります。次のようにして Swarm クラスタを作成します。
- まずクラスタを作成します。
# クラスタを作成
$ swarm create
6856663cdefdec325839a4b7e1de38e8 # <- これが各自の <クラスタID> です
- 各ノードを作成し、クラスタに追加します。
各ノードで Swarm エージェントを起動します。Swarm Manager がアクセス可能であれば、<node_ip> はパブリックである必要はありません(例:192.168.0.x)。
$ swarm join --advertise=<node_ip:2375> token://<cluster_id>
- Swarm マネージャを起動します。
これはあらゆるマシン上だけでなく、自分のノート PC 上でも実行できます。
$ swarm manage -H tcp://<swarm_ip:swarm_port> token://<cluster_id>
- 通常の 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 ...
...
- クラスタのノード情報一覧を表示します。
swarm list token://<cluster_id>
<node_ip:2375>
新しいディスカバリ・バックエンドに貢献¶
あなたも Swarm 向けに新しいディスカバリ・バックエンドに貢献できます。どのようにするかは、 Docker Swarm リポジトリにある discovery README をお読みください。
Docker Swarm ドキュメント目次¶
参考
- Docker Swarm Discovery
- https://docs.docker.com/swarm/discovery/