swarm mode を使うと、複数のノード (ホスト) 間で Docker コンテナをまとめて起動/停止したり、それらのノード間のコンテナでネットワークを連携させたりする ((ingress) routing mesh などという) ことができる。
swarm mode を使うには、swarm mode で扱いたいノード全ての Docker をあらかじめ
swarm mode 用に設定しておく必要がある。
やり方は基本的に
Create a swarm
に書いてある通り。
なお swarm mode になっていても、通常の swarm でない Docker を実行することも変わらず可能である。
swarm mode を構成するノードには、manager と worker という種類がある。
ここでは、とりあえず hoge サーバーを manager にし、foo サーバーを worker にする。
まず manager (hoge) で以下を実行する。
docker swarm init --advertise-addr managerのIPアドレス
[nsmrtks@hoge ~]$ docker swarm init --advertise-addr 192.168.8.185
Swarm initialized: current node (e2ze700hwtd3yxvtqi1krrfzv) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5tshpdj6hnmjunvhayvg3h6rz9jmboqwosis86257c7r9uw81h-2wh0holzoc658odsgvxqqqgs7 192.168.8.185:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
上の実行結果を見ると、次に worker で何を実行したらいいか示されている。
その通りに worker (foo) で実行する。
[nsmrtks@foo ~]$ docker swarm join --token SWMTKN-1-5tshpdj6hnmjunvhayvg3h6rz9jmboqwosis86257c7r9uw81h-2wh0holzoc658odsgvxqqqgs7 192.168.8.185:2377
This node joined a swarm as a worker.
これで、hoge が manager として、foo が worker として設定された。
その後 worker のノードを増やしたくなった場合は、 それらのノードで foo と同じようにコマンド (docker swarm join 〜) を実行すればよい。
worker のノードを増やす docker swarm join 〜 コマンドが分からなくなった場合、docker swarm join-token worker で表示させることができる。
[nsmrtks@hoge ~]$ docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5tshpdj6hnmjunvhayvg3h6rz9jmboqwosis86257c7r9uw81h-2wh0holzoc658odsgvxqqqgs7 192.168.8.185:2377
Error response from daemon: rpc error: code = Unavailable desc = grpc: the connection is unavailable
master 側のファイアウォールのせいである場合がある。
CentOS 7 の場合、とりあえず master 側で
sudo systemctl stop firewalld して直った場合はそれが原因。
(プロキシとの説もあったがそっちは関係ないようだった)
ラベルを利用して、docker-compose.yaml (docker-compose.yml) から、タスクを実行するノードを constraints: によって指定できたりする。
以下では、hoge (hoge.novalocal) に application というラベルを値「1」に、foo (foo.novalocal) に storage というラベルを値「1」に、設定している。
[nsmrtks@hoge ~]$ docker node update --label-add application=1 hoge.novalocal
hoge.novalocal
[nsmrtks@hoge ~]$ docker node update --label-add storage=1 foo.novalocal
foo.novalocal
付けたラベルが何か後から調べるには、manager から「docker node inspect ホスト名」で出来るようだ。
[nsmrtks@hoge ~]$ docker node inspect hoge.novalocal
[
{
〜
"Spec": {
"Labels": {
"application": "1",
"loadbalance": "1"
},
〜
[nsmrtks@hoge ~]$ docker node inspect foo.novalocal
[
{
〜
"Spec": {
"Labels": {
"application": "1",
"storage": "1"
},
〜
一度 swarm mode にした Docker ノードを、 swarm mode を使わないよう元に戻すこともできる。
以下は、 いったん foo を manager に、 hoge を worker にしていたものを、 swarm mode をやめたときの実行結果。
worker 側 (hoge)
[nsmrtks@hoge ~]$ docker swarm leave
Node left the swarm.
manager 側 (foo)
[nsmrtks@foo ~]$ docker swarm leave
Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Removing the last manager erases al
l current state of the swarm. Use `--force` to ignore this message.
[nsmrtks@foo ~]$ docker swarm leave --force
Node left the swarm.