Docker Swarm 集群模式实操
在正式进入 Kubernetes 之前希望能对早先的 Docker Swarm 有所了解,虽然它目前基本上没什么用处。Swarm 提供的是 Docker 宿主机的集群,集群中至少有一个 Manager(或多个), 再加上 0 或多个 Worker。它的大意是有个 Docker 服务(容器)通过 Manager 告诉用所管理的 Swarm 集群来执行,它就会在该集群中找到相应的宿主机来执行。Manager 和 Workder 都可用来运行 Docker 容器,但只有 Manager 才能执行部分管理命令。
下面两张图很好的体现了我们平时在一个宿主机上和 Swarm 集群宿主机上运行 Docker 容器的区别
所用的 Vagrantfile 是
vagrant up, vagrant ssh 进入机器后,sudo su - 切换到 root 用户,用 snap install docker 或 apt install docker.io 安装 docker 都行,然后就可用 docker swarm 命令了。
这时可使用
完后在 manager 机器上再用
在 worker 上看到的
有别于我们通常用
类似于
我们注意到前面指定了
没问题,Docker Swarm 的集群就相当于我们跑到每个独立结节上按需运行
再查看一下服务节点分配的列表
其中有两个节点运行了两个服务。不妨往小里试一番
再看服务列表
在每一次用
到这时候我们真切的体验到了 Swarm 集群一些好处,但实际应用场景好像不是这么一回事。实践中节点都是动态增减的,除非首先启动一个 manager 节点,其后新启的节点自动加为 worker, 节点消亡后自动退出 Swarm 集群。
下面是 Swarm 集群中服务的管理
更新时为了尽量不中断服务,Swarm 会进行逐个服务停止,更新,再启动。
worker 离开 Swarm 集群
离开后用
注意 worker 离开后,在 Swarm 集群中运行的服务仍然会依赖
删不掉就加上
最后 manager 节点的退出相当于 Swarm 集群的消失
Swarm 集群最络也被删除了。
这差不多是 Docker Swarm 的基本的内容了,如果 Swarm 集群创建有问题,请留意以下两个端口号没被防火墙挡住
接下来就会移步到 Docker compose, 甚至 compose 可以部署到 Swarm 集群中,终极目标还是会去了解 Kubernetes。 永久链接 https://yanbin.blog/docker-swarm-cluster-in-action/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
下面两张图很好的体现了我们平时在一个宿主机上和 Swarm 集群宿主机上运行 Docker 容器的区别
所有容器自己扛 | => |
容器大家一起扛 |
Docker 在 1.12 之后自带了 Swarm 模式。本文实质上对 使用Docker Swarm模式搭建Swarm集群 的一次实际操作与体验。只是自己方便使用了三个 Vagrant 虚拟机进行实践,其中一个 Swarm Manager 节点,两个 worker 节点
- ubuntu-master: 172.28.128.6
- ubuntu-worker1: 172.28.128.7
- ubuntu-worker2: 172.28.128.7
所用的 Vagrantfile 是
1Vagrant.configure("2") do |config|
2 config.vm.box = "ubuntu/disco64"
3 config.vm.hostname = "ubuntu-master" #相应的 worker 为 ubuntu-worker1 和 ubuntu-worker2
4 config.vm.network "private_network", type: "dhcp"
5endvagrant up, vagrant ssh 进入机器后,sudo su - 切换到 root 用户,用 snap install docker 或 apt install docker.io 安装 docker 都行,然后就可用 docker swarm 命令了。
创建 Swarm 集群
一个 Swarm 集群中至少要有一个 Manager 节点创建 Manager 节点
在 ubuntu-master 机器上执行1>root@ubuntu-master:~# docker swarm init --advertise-addr 172.28.128.6
2Swarm initialized: current node (sjfg7nljuyt54yapffvosrzmh) is now a manager.
3
4To add a worker to this swarm, run the following command:
5
6 docker swarm join --token SWMTKN-1-3wnd3z2xp49j6vyf6nt8kiuz38bjgjbbs90kz8x48z6dhyr7rc-c2cwfzg2jzhi3qz12wicn89a0 172.28.128.6:2377
7
8To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.--addvertise-addr 表示 worker 节点与 manager 的联系地址与端口,所以 master 的 2377 端口要打开。上面同时显示了在 worker 中如何加入到 Swarm 集群中的命令,在 master 上用以下两命令可随时查看加入 worker 或新 manager 的完整命令1root@ubuntu-master: ~# docker swarm join-token worker
2......
3root@ubuntu-master: ~# docker swarm join-token manager
4....这时可使用
docker info 和 docker node ls 查看 Swarm 集群的信息 1root@ubuntu-master:~# docker info
2......
3Swarm: active
4 NodeID: sjfg7nljuyt54yapffvosrzmh
5 Is Manager: true
6 ClusterID: r2cr7km655esw58olbc6gyncn
7 Managers: 1
8 Nodes: 1
9 Default Address Pool: 10.0.0.0/8
10 SubnetSize: 24
11 Orchestration:
12 Task History Retention Limit: 5
13......
14
15root@ubuntu-master:~# docker node ls
16ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
17sjfg7nljuyt54yapffvosrzmh * ubuntu-master Ready Active Leader 18.09.9加入 Worker 节点到 Swarm 集群
在 ubuntu-worker1 和 ubuntu-worker2 两个节点上执行相同的命令1root@ubuntu-worker1:~# docker swarm join --token SWMTKN-1-3wnd3z2xp49j6vyf6nt8kiuz38bjgjbbs90kz8x48z6dhyr7rc-c2cwfzg2jzhi3qz12wicn89a0 172.28.128.6:2377
2This node joined a swarm as a worker.完后在 manager 机器上再用
docker info 和 docker node ls 查看下 1root@ubuntu-master:~# docker info
2......
3Swarm: active
4 NodeID: sjfg7nljuyt54yapffvosrzmh
5 Is Manager: true
6 ClusterID: r2cr7km655esw58olbc6gyncn
7 Managers: 1
8 Nodes: 3
9 Default Address Pool: 10.0.0.0/8
10 SubnetSize: 24
11 Orchestration:
12 Task History Retention Limit: 5
13......
14root@ubuntu-master:~# docker node ls
15ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
16sjfg7nljuyt54yapffvosrzmh * ubuntu-master Ready Active Leader 18.09.9
17q82ndq11h1mie6lwmog5pfymu ubuntu-worker1 Ready Active 18.09.7
18xuzc43qrrdirkmabivdzg8ruc ubuntu-worker2 Ready Active 18.09.9在 worker 上看到的
docker info 信息略有不同,且 docker node 命令是不能在 worker 上执行的。在 Swarm 集群中部署服务
现在我们有了一个由一个 manager 和两个 worker 组成的 Swarm 集群了,可以开始在这个集群中运行我们的 docker 容器(服务) 了。有别于我们通常用
docker run 的方式在当前机器为宿主机上运行容器,在 Swarm 集群中部署服务要在 manager 节点上用 docker service 命令。1root@ubuntu-master:~# docker service create --replicas 2 --name helloworld alpine ping docker.com
215aptyokhcp42qa47rfmhgx82
3overall progress: 2 out of 2 tasks
41/2: running [==================================================>]
52/2: running [==================================================>]
6verify: Service converged--replicas指定启动服务由几个实例组成--name与 docker run 时的 --name 一样,指定服务名alpine为 docker 镜像名称ping docker.com服务执行的命令,由于 Linux 下的 ping 命令是不会停的,因此后面可以观察运行状态
查看 Swarm 中服务信息
docker service ls 查看服务列表1root@ubuntu-master:~# docker service ls
2ID NAME MODE REPLICAS IMAGE PORTS
315aptyokhcp4 helloworld replicated 2/2 alpine:latestdocker service inspect 查看服务信息,与 docker inspect 查看容器信息类似 1root@ubuntu-master:~# docker service inspect --pretty helloworld
2
3ID: 15aptyokhcp42qa47rfmhgx82
4Name: helloworld
5Service Mode: Replicated
6 Replicas: 2
7Placement:
8UpdateConfig:
9 Parallelism: 1
10......
11ContainerSpec:
12 Image: alpine:latest@sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d
13 Args: ping docker.com
14 Init: false类似于
docker ps 的 docker service ps <SERVICE-ID> 命令可查询哪个(些) 节点正在运行该服务1root@ubuntu-master:~# docker service ps 15
2ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
3ay8qybtmtpqo helloworld.1 alpine:latest ubuntu-worker1 Running Running 6 minutes ago
4ou1gltvexpkc helloworld.2 alpine:latest ubuntu-master Running Running 6 minutes ago我们注意到前面指定了
--replicas=2 运行的两份服务分别在 ubuntu-worker1 和 ubuntu-master 两个节点上。所以我们可以跑到所有节点上用 docker ps 验证一下1root@ubuntu-master:~# docker ps
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
316eb4dbfc88b alpine:latest "ping docker.com" 7 minutes ago Up 7 minutes helloworld.2.ou1gltvexpkcbna6rttbjbosl1root@ubuntu-worker1:~# docker ps
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
35b4367423853 alpine:latest "ping docker.com" 7 minutes ago Up 7 minutes helloworld.1.ay8qybtmtpqotpokauyde7ob01root@ubuntu-worker2:~# docker ps
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES没问题,Docker Swarm 的集群就相当于我们跑到每个独立结节上按需运行
docker run --name helloworld.x alpine ping docker.com 的效果。在 Swarm 集群中服务的动态伸缩
有集群的好处就是我们可以在群集中对服务进行动态伸缩,规模超过集群节点数也不是问题,无外乎在一个节点上会运行多个服务。1root@ubuntu-master:~# docker service scale helloworld=5
2helloworld scaled to 5
3overall progress: 5 out of 5 tasks
41/5: running [==================================================>]
52/5: running [==================================================>]
63/5: running [==================================================>]
74/5: running [==================================================>]
85/5: running [==================================================>]
9verify: Service convergedhelloworld=5 相当于创建服务时指定的 --replicas=5 一样再查看一下服务节点分配的列表
1root@ubuntu-master:~# docker service ps helloworld
2ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
3ay8qybtmtpqo helloworld.1 alpine:latest ubuntu-worker1 Running Running 14 minutes ago
4ou1gltvexpkc helloworld.2 alpine:latest ubuntu-master Running Running 14 minutes ago
58xhmp5ehboo6 helloworld.3 alpine:latest ubuntu-worker2 Running Running 47 seconds ago
6kagiwq7sh105 helloworld.4 alpine:latest ubuntu-worker2 Running Running 47 seconds ago
7ijmgo4udbe1d helloworld.5 alpine:latest ubuntu-worker1 Running Running 47 seconds ago其中有两个节点运行了两个服务。不妨往小里试一番
1root@ubuntu-master:~# docker service scale helloworld=1
2helloworld scaled to 1
3overall progress: 1 out of 1 tasks
41/1: running [==================================================>]
5verify: Service converged再看服务列表
1root@ubuntu-master:~# docker service ps helloworld
2ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
3ay8qybtmtpqo helloworld.1 alpine:latest ubuntu-worker1 Running Running 17 minutes ago在每一次用
docker service scale helloworld=<NUM> 之后可以到具体节点上去用 docker ps 查看当前节点所运行的容器来验证。到这时候我们真切的体验到了 Swarm 集群一些好处,但实际应用场景好像不是这么一回事。实践中节点都是动态增减的,除非首先启动一个 manager 节点,其后新启的节点自动加为 worker, 节点消亡后自动退出 Swarm 集群。
下面是 Swarm 集群中服务的管理
删除 Swarm 集群中的服务
用docker service rmi helloworld 命令删除服务。更新 Swarm 集群中的服务
比如要更新服务中的镜像版本,基本命令是docker service update --image alpine:3.10 helloworld, 以下是完整演示把镜像从 alpine:latest 更新到 alpine:3.10 1root@ubuntu-master:~# docker service create --replicas 3 --name helloworld alpine ping docker.com
2pz8ifs41o90fren4hc6dgc1gz
3overall progress: 3 out of 3 tasks
41/3: running [==================================================>]
52/3: running [==================================================>]
63/3: running [==================================================>]
7verify: Service converged
8root@ubuntu-master:~# docker service ps helloworld
9ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
10qhmkkife291l helloworld.1 alpine:latest ubuntu-worker1 Running Running about a minute ago
11ia6bpvky5fdd helloworld.2 alpine:latest ubuntu-worker2 Running Running about a minute ago
12i6ux7j6jpwqi helloworld.3 alpine:latest ubuntu-master Running Running about a minute ago
13root@ubuntu-master:~# docker service update --image alpine:3.10 helloworld
14helloworld
15overall progress: 3 out of 3 tasks //这里可以看到怎么动态的更新过程
161/3: running [==================================================>]
172/3: running [==================================================>]
183/3: running [==================================================>]
19verify: Service converged
20root@ubuntu-master:~# docker service ps helloworld //显示了由 latest 更新到了 3.10
21ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
22lgqlxpkdjyl8 helloworld.1 alpine:3.10 ubuntu-worker1 Running Running 14 seconds ago
23qhmkkife291l \_ helloworld.1 alpine:latest ubuntu-worker1 Shutdown Shutdown 15 seconds ago
245qj7hf6dm75x helloworld.2 alpine:3.10 ubuntu-worker2 Running Running 26 seconds ago
25ia6bpvky5fdd \_ helloworld.2 alpine:latest ubuntu-worker2 Shutdown Shutdown 27 seconds ago
26p1aibrthhs4k helloworld.3 alpine:3.10 ubuntu-master Running Running 38 seconds ago
27i6ux7j6jpwqi \_ helloworld.3 alpine:latest ubuntu-master Shutdown Shutdown 39 seconds ago更新时为了尽量不中断服务,Swarm 会进行逐个服务停止,更新,再启动。
Swarm 中节点的离线与上线
对运行服务中的 Swarm 集群,我们可以让某个点节离线,那么其上的服务就会转移到另一个可用的节点上。离线的节点可以重新上线,但先前上面的服务不会重新转移过来,只要在进行服务伸缩或创建新服务时才会分配到新上线的节点上。看下面的一个完整演示 1root@ubuntu-master:~# docker service create --replicas 3 --name helloworld alpine ping docker.com
2zn19c80zdpehq40dwz25lgton
3overall progress: 3 out of 3 tasks
41/3: running [==================================================>]
52/3: running [==================================================>]
63/3: running [==================================================>]
7verify: Service converged
8root@ubuntu-master:~# docker service ps helloworld //每个节点上都运行一个容器
9ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
10r36yh4yfyrjj helloworld.1 alpine:latest ubuntu-worker1 Running Running 13 seconds ago
112fyzydfs2n8w helloworld.2 alpine:latest ubuntu-worker2 Running Running 13 seconds ago
12smqv1mfh1lba helloworld.3 alpine:latest ubuntu-master Running Running 13 seconds ago
13root@ubuntu-master:~# docker node update --availability drain ubuntu-worker1
14ubuntu-worker1
15root@ubuntu-master:~# docker service ps helloworld // ubuntu-worker1 离线后,其上的任务转移到了 ubuntu-master 节点上
16ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
175z10pj4z9ldq helloworld.1 alpine:latest ubuntu-master Running Running 1 second ago
18r36yh4yfyrjj \_ helloworld.1 alpine:latest ubuntu-worker1 Shutdown Shutdown 2 seconds ago
192fyzydfs2n8w helloworld.2 alpine:latest ubuntu-worker2 Running Running 50 seconds ago
20smqv1mfh1lba helloworld.3 alpine:latest ubuntu-master Running Running 50 seconds ago
21root@ubuntu-master:~# docker node update --availability active ubuntu-worker1
22ubuntu-worker1
23root@ubuntu-master:~# docker service ps helloworld // ubuntu-worker1 重新上线后,任务分配情况保持不变
24ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
255z10pj4z9ldq helloworld.1 alpine:latest ubuntu-master Running Running 56 seconds ago
26r36yh4yfyrjj \_ helloworld.1 alpine:latest ubuntu-worker1 Shutdown Shutdown 56 seconds ago
272fyzydfs2n8w helloworld.2 alpine:latest ubuntu-worker2 Running Running about a minute ago
28smqv1mfh1lba helloworld.3 alpine:latest ubuntu-master Running Running about a minute ago管理 Swarm 集群
最后是几个管理 Swarm 集群的命令worker 离开 Swarm 集群
1root@ubuntu-worker1:~# docker swarm leave
2Node left the swarm.离开后用
docker node ls 看到的节点状态是 down1root@ubuntu-master:~# docker node ls
2ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
3sjfg7nljuyt54yapffvosrzmh * ubuntu-master Ready Active Leader 18.09.9
4q82ndq11h1mie6lwmog5pfymu ubuntu-worker1 Down Active 18.09.7
5xuzc43qrrdirkmabivdzg8ruc ubuntu-worker2 Down Active 18.09.9注意 worker 离开后,在 Swarm 集群中运行的服务仍然会依赖
--replicas=<NUM> 进行重新分配。如果所有 worker 都删除后,服务全都会部署到 Manager 节点上。如果需要从 docker node ls 中删除节点,需要用1root@ubuntu-master:~# docker node rm ubuntu-worker1
2ubuntu-worker1
3root@ubuntu-master:~# docker node rm --force ubuntu-worker2
4ubuntu-worker2删不掉就加上
--force 参数最后 manager 节点的退出相当于 Swarm 集群的消失
1root@ubuntu-master:~# docker swarm leave --force
2Node left the swarm.
3oot@ubuntu-master:~# docker node ls
4Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.Swarm 集群最络也被删除了。
这差不多是 Docker Swarm 的基本的内容了,如果 Swarm 集群创建有问题,请留意以下两个端口号没被防火墙挡住
- 7946 端口,用于集群节点之间的通信
- 4789 端口,用于 overlay 网络流量
接下来就会移步到 Docker compose, 甚至 compose 可以部署到 Swarm 集群中,终极目标还是会去了解 Kubernetes。 永久链接 https://yanbin.blog/docker-swarm-cluster-in-action/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
所有容器自己扛
容器大家一起扛