docker swarm mode を試してみる

docker engine 1.12から標準で搭載されたswarm modeを試してみる。
swarm(群れ)という意味で、クラスタリング構成機構のこと。
swarm modeはdocker engine v1.12.0-rc1で統合された機能である。

swarm modeではクラスタをアプリケーション単位での管理し、
複数ホスト間で共有されるネットワークを持っているので、
外部のネットワークからのトラフィックをロード・バランシングできるという。

ということで、チュートリアルに沿って一通り眺める。

nodeの作成

node role
manager master
worker1 worker
worker2 worker

各ホストでdocker engine(dockerデーモン)を起動させる。

1
2
3
4
5
6
7
8
9
10
docker-machine create -d virtualbox manager
docker-machine create -d virtualbox worker1
docker-machine create -d virtualbox worker2

NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
manager * virtualbox Running tcp://192.168.99.100:2376 v1.12.0
worker1 - virtualbox Running tcp://192.168.99.101:2376 v1.12.0
worker2 - virtualbox Running tcp://192.168.99.102:2376 v1.12.0
docker-machine ip manager
192.168.99.100

クラスタを初期化

swarm initで、クラスタを初期化すると、tokenが発行される。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# docker@manager

docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (5golpgkwh376tmddgzqcqzjpl) is now a manager.

To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-0vbcihcfezog02z78j4cpmbptt5d917mcm71w0dbbxol0k8pgb-emc5tzyg4ri30i2uqrqlyi6yq \
192.168.99.100:2377

To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-0vbcihcfezog02z78j4cpmbptt5d917mcm71w0dbbxol0k8pgb-dm8ugwds89z972yhngfgmv74l \
192.168.99.100:2377

docker infoでswarmの現在の状況を確認してみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# docker@manager

docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 1.12.0
Storage Driver: aufs
Root Dir: /mnt/sda1/var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 0
Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: host bridge overlay null
Swarm: active
NodeID: 5golpgkwh376tmddgzqcqzjpl
Is Manager: true
ClusterID: 7lpo0u0u57yryce83q22ne3ot
Managers: 1
Nodes:
...
...

docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
5golpgkwh376tmddgzqcqzjpl * manager Ready Active Leader

クラスタに追加

workder1, worker2をswarmクラスタにworkerとして追加する。

1
2
3
4
# docker@worker1

docker swarm join --token SWMTKN-1-0vbcihcfezog02z78j4cpmbptt5d917mcm71w0dbbxol0k8pgb-emc5tzyg4ri30i2uqrqlyi6yq 192.168.99.100:2377
This node joined a swarm as a worker.
1
2
3
4
# docker@worker2

docker swarm join --token SWMTKN-1-0vbcihcfezog02z78j4cpmbptt5d917mcm71w0dbbxol0k8pgb-emc5tzyg4ri30i2uqrqlyi6yq 192.168.99.100:2377
This node joined a swarm as a worker.

追加したnodeがswarmクラスタに追加されいることを確認する。

1
2
3
4
5
6
7
# docker@manager

docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
0mfxd3hhndyd7i4uncbiprek4 worker2 Ready Active
5golpgkwh376tmddgzqcqzjpl * manager Ready Active Leader
cwdb1t7e3o9rstaiudaxswzu9 worker1 Ready Active

ingressネットワークの作成

ingressネットワーク(ingress)を作成し、ロードバランスする。
複数ホスト間のコンテナで外部からのリクエストをルーティングし、ロードバランシングできるようになる。

1
2
3
4
# docker@manager

docker network create -d overlay testnetwork
0s19bsmqf8wcblaur5ryb8biq
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# docker@manager

docker network ls
NETWORK ID NAME DRIVER SCOPE
a2fab6cccfde bridge bridge local
3b4e201a5b10 docker_gwbridge bridge local
cc20b3e97d14 host host local
6uoqnkw5ei76 ingress overlay swarm
83f4a43f1315 none null local
0s19bsmqf8wc testnetwork overlay swarm

docker network inspect testnetwork
[
{
"Name": "testnetwork",
"Id": "0s19bsmqf8wcblaur5ryb8biq",
"Scope": "swarm",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": []
},
"Internal": false,
"Containers": null,
"Options": {
"com.docker.network.driver.overlay.vxlanid_list": "257"
},
"Labels": null
}
]

もうちょっとingressネットワークを見てみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# docker@manager

docker network inspect 6uoqnkw5ei76
[
{
"Name": "ingress",
"Id": "6uoqnkw5ei76chns289v0oaei",
"Scope": "swarm",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "10.255.0.0/16",
"Gateway": "10.255.0.1"
}
]
},
"Internal": false,
"Containers": {
"745c0806c4f7082995dd1cb8d04dca6becc6dbe820aad717fcefb34811387d57": {
"Name": "nginx.1.5nhg56y2vohlevb6p4a1xuwjq",
"EndpointID": "f33f63c27b2d75fa7272e57fb193e291dab588a6f7fc51f0e508b7caf8bb36b2",
"MacAddress": "02:42:0a:ff:00:05",
"IPv4Address": "10.255.0.5/16",
"IPv6Address": ""
},
"8b4cd33138e9c9262b31a70ba0103535c6a3828b45f3dc6eb9a5ee5c07c07e29": {
"Name": "nginx.2.8uu9u366fqpda3vm69dzdfr1z",
"EndpointID": "e73c1b17fe8a5ee98081a33d70abada0852cadd553912504713795059080dd07",
"MacAddress": "02:42:0a:ff:00:06",
"IPv4Address": "10.255.0.6/16",
"IPv6Address": ""
},
"8b4cd33138e9c9262b31a70ba0103535c6a3828b45f3dc6eb9a5ee5c07c07e29": {
"Name": "nginx.2.41to6h36vp1i31qad79iiz2qf",
"EndpointID": "745c0806c4f75ee98081a33d70g930s0852cadd55391204713798b4cd33138e9",
"MacAddress": "02:42:0a:ff:00:06",
"IPv4Address": "10.255.0.7/16",
"IPv6Address": ""
},
"ingress-sbox": {
"Name": "ingress-endpoint",
"EndpointID": "7e9a378dcfeed25805bd7ea78e411df39b06aa9ad347bb6ff0b3fe86f09d44bb",
"MacAddress": "02:42:0a:ff:00:03",
"IPv4Address": "10.255.0.3/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.driver.overlay.vxlanid_list": "256"
},
"Labels": {}
}
]

ingress-sbox というコンテナがある。

workerのiptablesを確認

1
2
3
4
5
6
7
8
# docker@worker1

sudo iptables-save | grep INGRESS
:DOCKER-INGRESS - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER-INGRESS
-A OUTPUT -m addrtype --dst-type LOCAL -j DOCKER-INGRESS
-A DOCKER-INGRESS -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.18.0.2:80
-A DOCKER-INGRESS -j RETURN

DNATの設定がある。80ポートで受けたリクエストを 172.18.0.2:80 に転送している。
この172.18.0.2がingressネットワーク。しかし、172.18.0.2はdockerのコンテナとしてはリストアップされない。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# docker@worker1

ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether ca:f2:56:e6:fe:34 brd ff:ff:ff:ff:ff:ff
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:25:2e:6a brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe25:2e6a/64 scope link
valid_lft forever preferred_lft forever
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:87:c3:c8 brd ff:ff:ff:ff:ff:ff
inet 192.168.99.104/24 brd 192.168.99.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe87:c3c8/64 scope link
valid_lft forever preferred_lft forever
6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:00:44:03:63 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 scope global docker0
valid_lft forever preferred_lft forever
11: docker_gwbridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:60:28:a7:82 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 scope global docker_gwbridge
valid_lft forever preferred_lft forever
inet6 fe80::42:60ff:fe28:a782/64 scope link
valid_lft forever preferred_lft forever
13: vethff5efce@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP group default
link/ether 32:4b:45:f2:fa:8c brd ff:ff:ff:ff:ff:ff
inet6 fe80::304b:45ff:fef2:fa8c/64 scope link
valid_lft forever preferred_lft forever
18: vethabbd231@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP group default
link/ether f6:c9:ed:48:b7:29 brd ff:ff:ff:ff:ff:ff
inet6 fe80::f4c9:edff:fe48:b729/64 scope link
valid_lft forever preferred_lft forever

ルーティングもみてみる

1
2
3
4
5
6
7
8
9
# docker@worker1

ip route
default via 10.0.2.2 dev eth0 metric 1
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
127.0.0.1 dev lo scope link
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 dev docker_gwbridge proto kernel scope link src 172.18.0.1
192.168.99.0/24 dev eth1 proto kernel scope link src 192.168.99.104

どうやらdocker_gwbridgeのもののようだ。managerでも同様にdocker_gwbridgeなるものがあることから、
docker_gwbridgeは作成したネットワークに属するnodeすべてに共通で利用されている。
ということで、外部からのアクセスにはdocker_gwbridgeを使用している。

ということで、コンテナ間でも通信できるはず。

1
2
3
4
5
6
7
8
9
10
11
12
# docker@worker1

ping -c 4 192.168.99.100
PING 192.168.99.100 (192.168.99.100): 56 data bytes
64 bytes from 192.168.99.100: seq=0 ttl=64 time=0.459 ms
64 bytes from 192.168.99.100: seq=1 ttl=64 time=0.357 ms
64 bytes from 192.168.99.100: seq=2 ttl=64 time=0.439 ms
64 bytes from 192.168.99.100: seq=3 ttl=64 time=0.374 ms

--- 192.168.99.100 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.357/0.407/0.459 ms

サービス作成

swarm modeでコンテナを起動するためのserviceを作成する。作成されたnodeをタスクという。
–replicasフラグでtask数を指定して作成する。
今回はnginxのサービスを作成する。

nginx というサービスを作成し、testnetworkでswarmのポート80をコンテナのポート80に割り当て。

1
2
3
4
# docker@manager

docker service create --name nginx --replicas 3 --network testnetwork -p 80:80/tcp nginx
cz4kot5ft0hz8v9euubq75ja2

作成されたサービスの確認

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# docker@manager

docker service ls
ID NAME REPLICAS IMAGE COMMAND
cz4kot5ft0hz nginx 0/3 nginx

# --pretty で見やすく表示
docker service inspect --pretty nginx
ID: cz4kot5ft0hz8v9euubq75ja2
Name: nginx
Mode: Replicated
Replicas: 3
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
ContainerSpec:
Image: nginx
Resources:
Networks: 0s19bsmqf8wcblaur5ryb8biqPorts:
Protocol = tcp
TargetPort = 80
PublishedPort = 80

# nginxのイメージ取得中でpreparingになっている
docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
5nhg56y2vohlevb6p4a1xuwjq nginx.1 nginx worker2 Running Running 3 seconds ago
8uu9u366fqpda3vm69dzdfr1z nginx.2 nginx worker1 Running Preparing about a minute ago
41to6h36vp1i31qad79iiz2qf nginx.3 nginx manager Running Preparing about a minute ago

# 再度実行する
docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
5nhg56y2vohlevb6p4a1xuwjq nginx.1 nginx worker2 Running Running 2 minutes ago
8uu9u366fqpda3vm69dzdfr1z nginx.2 nginx worker1 Running Running 2 minutes ago
41to6h36vp1i31qad79iiz2qf nginx.3 nginx manager Running Running 2 minutes ago

curl を実行して起動していることを確認

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
curl http://192.168.99.100
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

サービスのスケールアップ・スケールダウン

スケールアップしてみる。

1
2
3
4
5
6
7
8
9
10
11
# docker@manager

docker service scale nginx=4
nginx scaled to 4

docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
5nhg56y2vohlevb6p4a1xuwjq nginx.1 nginx worker2 Running Running 6 minutes ago
8uu9u366fqpda3vm69dzdfr1z nginx.2 nginx worker1 Running Running 6 minutes ago
41to6h36vp1i31qad79iiz2qf nginx.3 nginx manager Running Running 6 minutes ago
bn0kohl7ecfcmwoeksy6cowdf nginx.4 nginx worker1 Running Running 4 seconds ago

タスクが4個あることがわかる。
続いてスケールダウンする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# docker@manager

docker service scale nginx=3
nginx scaled to 3

docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
5nhg56y2vohlevb6p4a1xuwjq nginx.1 nginx worker2 Running Running 7 minutes ago
8uu9u366fqpda3vm69dzdfr1z nginx.2 nginx worker1 Running Running 7 minutes ago
41to6h36vp1i31qad79iiz2qf nginx.3 nginx manager Running Running 7 minutes ago
bn0kohl7ecfcmwoeksy6cowdf nginx.4 nginx worker1 Shutdown Shutdown less than a second ago

docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
5nhg56y2vohlevb6p4a1xuwjq nginx.1 nginx worker2 Running Running 7 minutes ago
8uu9u366fqpda3vm69dzdfr1z nginx.2 nginx worker1 Running Running 7 minutes ago
41to6h36vp1i31qad79iiz2qf nginx.3 nginx manager Running Running 7 minutes ago
bn0kohl7ecfcmwoeksy6cowdf nginx.4 nginx worker1 Shutdown Shutdown 3 seconds ago

タスクが3つに戻った。

自動復旧

worker2のコンテナをstopして、タスクが自動で復旧することを確認する。

1
2
3
4
5
6
7
8
9
10
11
# docker@worker2

docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55ce84f00f26 nginx:latest "nginx -g 'daemon off" 49 seconds ago Up 48 seconds 80/tcp, 443/tcp nginx.1.160s9norhjlicvlvrpymar0yz

docker stop 55ce84f00f26
55ce84f00f26

docker ps
CONTAINER ID IMAGE

stopしたこと確認した。しばらくすると自動でコンテナが起動

1
2
3
4
5
# docker@worker2

docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c3d900cb9fe nginx:latest "nginx -g 'daemon off" 21 seconds ago Up 19 seconds 80/tcp, 443/tcp nginx.1.adgxpo8s9ki82sz3rel26g9cb

タスクは3つになっている。

1
2
3
4
5
6
7
8
# docker@manager

docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
adgxpo8s9ki82sz3rel26g9cb nginx.1 nginx worker2 Running Running 45 seconds ago
160s9norhjlicvlvrpymar0yz \_ nginx.1 nginx worker2 Shutdown Complete 51 seconds ago
ci5qqrgppuxvqub8bos8j3dhg nginx.2 nginx worker1 Running Running about a minute ago
bngsjgp2o4tdvczrc623wk7x2 nginx.3 nginx manager Running Running 19 seconds ago

ローリング・アップデート

実行中のイメージを差し替えたり、アップデートする際に使う。
起動中のコンテナの停止、イメージの取得し起動までを自動で行う。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# --update-delay イメージ更新までの遅延時間
# --update-parallelism 同時に更新するtaskの最大数
docker service update --update-delay 10s --update-parallelism 1 --image nginx:latest nginx
nginx

docker service ls
ID NAME REPLICAS IMAGE COMMAND
4cut0umrm3a3 nginx 2/3 nginx:latest

docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
dzyijvwet9pjz8ac9m65ye4id nginx.1 nginx:latest worker2 Running Running 28 seconds ago
adgxpo8s9ki82sz3rel26g9cb \_ nginx.1 nginx worker2 Shutdown Shutdown 31 seconds ago
160s9norhjlicvlvrpymar0yz \_ nginx.1 nginx worker2 Shutdown Complete 9 minutes ago
bgsr4e1yd8c0q9nyl0wylp3ky nginx.2 nginx:latest worker2 Running Preparing 2 seconds ago
ci5qqrgppuxvqub8bos8j3dhg \_ nginx.2 nginx worker1 Shutdown Shutdown 2 seconds ago
9tt8df7zjj65tgp9l6yx4engd nginx.3 nginx:latest manager Running Running 13 seconds ago
bngsjgp2o4tdvczrc623wk7x2 \_ nginx.3 nginx manager Shutdown Shutdown 16 seconds ago

drain(解放)

メンテナンスなどでnodeを個別に切り離す必要があるときなどに、一時的にクラスタから解放する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
docker node inspect --pretty worker1
ID: cwdb1t7e3o9rstaiudaxswzu9
Hostname: worker1
Status:
State: Ready
Availability: Active
Platform:
Operating System: linux
Architecture: x86_64
Resources:
CPUs: 1
Memory: 995.9 MiB
Plugins:
Network: bridge, host, null, overlay
Volume: local
Engine Version: 1.12.0
Engine Labels:
- provider = virtualbox%

docker node update --availability drain worker1
worker1

docker node inspect --pretty worker1
ID: cwdb1t7e3o9rstaiudaxswzu9
Hostname: worker1
Status:
State: Ready
Availability: Drain
Platform:
Operating System: linux
Architecture: x86_64
Resources:
CPUs: 1
Memory: 995.9 MiB
Plugins:
Network: bridge, host, null, overlay
Volume: local
Engine Version: 1.12.0
Engine Labels:
- provider = virtualbox%

docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
4h2qkchax4m34z1pxi61nlnnh nginx.1 nginx manager Running Running 6 minutes ago
dzyijvwet9pjz8ac9m65ye4id \_ nginx.1 nginx:latest worker2 Shutdown Shutdown 6 minutes ago
adgxpo8s9ki82sz3rel26g9cb \_ nginx.1 nginx worker2 Shutdown Shutdown 31 seconds ago
160s9norhjlicvlvrpymar0yz \_ nginx.1 nginx worker2 Shutdown Complete 9 minutes ago
bgsr4e1yd8c0q9nyl0wylp3ky nginx.2 nginx:latest worker2 Running Preparing 2 seconds ago
ci5qqrgppuxvqub8bos8j3dhg \_ nginx.2 nginx worker1 Shutdown Shutdown 2 seconds ago
9tt8df7zjj65tgp9l6yx4engd nginx.3 nginx:latest manager Running Running 13 seconds ago
bngsjgp2o4tdvczrc623wk7x2 \_ nginx.3 nginx manager Shutdown Shutdown 16 seconds ago

worker1がdrainされてmanagerがnginx.1タスクを作成している。
この状態でdrainしたnodeをアクティブに戻す。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
docker node update --availability active worker1
worker1

docker node inspect --pretty worker1
ID: cwdb1t7e3o9rstaiudaxswzu9
Hostname: worker1
Status:
State: Ready
Availability: Active
Platform:
Operating System: linux
Architecture: x86_64
Resources:
CPUs: 1
Memory: 995.9 MiB
Plugins:
Network: bridge, host, null, overlay
Volume: local
Engine Version: 1.12.0
Engine Labels:
- provider = virtualbox%

worker1が利用できる状態で待機している。
クラスタに追加されている。

サービスの削除とnodeの削除

サービスの削除。

1
2
3
4
5
6
7
8
9
docker service  ls
ID NAME REPLICAS IMAGE COMMAND
cz4kot5ft0hz nginx 3/3 nginx

docker service rm nginx
nginx

docker service ls
ID NAME REPLICAS IMAGE COMMAND

nodeをswarmから解放する。

1
2
3
4
# docker@worker1

docker swarm leave
Node left the swarm.
1
2
3
4
# docker@worker2

docker swarm leave
Node left the swarm.

各workerがswarmから解放された。

最後にmanagerをswarmから解放する。

1
2
3
4
# docker@manager

docker swarm leave --force
Node left the swarm.

まとめ

思った以上にクラスタを容易に作成できた。
swarm modeはマルチホストネットワーク機能(docker_gwbridge)をつかって、
アプリケーションを動かすということだと再確認できた。

参考にしたページ

https://pocketstudio.net/2016/06/23/docker-1-12-swarm-mode-and-ingress-load-balancing/
https://docs.docker.com/engine/userguide/networking/get-started-overlay/

Comments