Docker の swarm mode を設定した覚書 (CentOS 7)

swarm mode を使うと、複数のノード (ホスト) 間で Docker コンテナをまとめて起動/停止したり、それらのノード間のコンテナでネットワークを連携させたりする ((ingress) routing mesh などという) ことができる。

swarm mode を使うには、swarm mode で扱いたいノード全ての Docker をあらかじめ swarm mode 用に設定しておく必要がある。
やり方は基本的に Create a swarm に書いてある通り。

なお swarm mode になっていても、通常の swarm でない Docker を実行することも変わらず可能である。

manager 側と worker 側それぞれの設定

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

万が一 docker swarm join 〜 が以下のようなエラーになる場合

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 をやめる場合

一度 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.

以上


index