Docker Swarm 集群模式实操

在正式进入 Kubernetes 之前希望能对早先的 Docker Swarm 有所了解,虽然它目前基本上没什么用处。Swarm 提供的是 Docker 宿主机的集群,集群中至少有一个 Manager(或多个), 再加上 0 或多个 Worker。它的大意是有个 Docker 服务(容器)通过 Manager 告诉用所管理的 Swarm 集群来执行,它就会在该集群中找到相应的宿主机来执行。Manager 和 Workder 都可用来运行 Docker 容器,但只有 Manager 才能执行部分管理命令。

下面两张图很好的体现了我们平时在一个宿主机上和 Swarm 集群宿主机上运行 Docker 容器的区别

所有容器自己扛   => 容器大家一起扛

Docker 在 1.12 之后自带了 Swarm 模式。本文实质上对 使用Docker Swarm模式搭建Swarm集群 的一次实际操作与体验。只是自己方便使用了三个 Vagrant 虚拟机进行实践,其中一个 Swarm Manager 节点,两个 worker 节点

  1. ubuntu-master: 172.28.128.6
  2. ubuntu-worker1: 172.28.128.7
  3. ubuntu-worker2: 172.28.128.7

所用的 Vagrantfile 是

vagrant up, vagrant ssh 进入机器后,sudo su - 切换到 root 用户,用 snap install docker 或 apt install docker.io 安装  docker 都行,然后就可用 docker swarm 命令了。

创建 Swarm 集群

一个 Swarm 集群中至少要有一个 Manager 节点

创建 Manager 节点

在 ubuntu-master 机器上执行

--addvertise-addr 表示 worker 节点与 manager 的联系地址与端口,所以 master 的 2377 端口要打开。上面同时显示了在 worker 中如何加入到 Swarm 集群中的命令,在 master 上用以下两命令可随时查看加入 worker 或新 manager  的完整命令

这时可使用 docker infodocker node ls 查看 Swarm 集群的信息

加入 Worker 节点到 Swarm  集群

在 ubuntu-worker1 和 ubuntu-worker2 两个节点上执行相同的命令

完后在 manager 机器上再用 docker infodocker node ls 查看下

在 worker 上看到的  docker info 信息略有不同,且 docker node 命令是不能在 worker 上执行的。

在 Swarm 集群中部署服务

现在我们有了一个由一个 manager 和两个 worker 组成的 Swarm 集群了,可以开始在这个集群中运行我们的 docker 容器(服务) 了。

有别于我们通常用 docker run 的方式在当前机器为宿主机上运行容器,在 Swarm 集群中部署服务要在 manager 节点上用 docker service 命令。

  1. --replicas 指定启动服务由几个实例组成
  2. --name 与 docker run 时的 --name  一样,指定服务名
  3. alpine 为 docker 镜像名称
  4. ping docker.com 服务执行的命令,由于 Linux 下的 ping 命令是不会停的,因此后面可以观察运行状态

查看 Swarm 中服务信息

docker service ls 查看服务列表

docker service inspect 查看服务信息,与 docker inspect 查看容器信息类似

类似于 docker psdocker service ps <SERVICE-ID> 命令可查询哪个(些) 节点正在运行该服务

我们注意到前面指定了 --replicas=2 运行的两份服务分别在 ubuntu-worker1ubuntu-master 两个节点上。所以我们可以跑到所有节点上用 docker ps 验证一下

没问题,Docker Swarm 的集群就相当于我们跑到每个独立结节上按需运行 docker run --name helloworld.x alpine ping docker.com 的效果。

在 Swarm 集群中服务的动态伸缩

有集群的好处就是我们可以在群集中对服务进行动态伸缩,规模超过集群节点数也不是问题,无外乎在一个节点上会运行多个服务。

helloworld=5 相当于创建服务时指定的 --replicas=5 一样

再查看一下服务节点分配的列表

其中有两个节点运行了两个服务。不妨往小里试一番

再看服务列表

在每一次用 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

更新时为了尽量不中断服务,Swarm 会进行逐个服务停止,更新,再启动。

Swarm 中节点的离线与上线

对运行服务中的 Swarm 集群,我们可以让某个点节离线,那么其上的服务就会转移到另一个可用的节点上。离线的节点可以重新上线,但先前上面的服务不会重新转移过来,只要在进行服务伸缩或创建新服务时才会分配到新上线的节点上。看下面的一个完整演示

管理 Swarm 集群

最后是几个管理 Swarm 集群的命令

worker 离开 Swarm 集群

离开后用 docker node ls 看到的节点状态是 down

注意 worker 离开后,在 Swarm 集群中运行的服务仍然会依赖 --replicas=<NUM> 进行重新分配。如果所有 worker 都删除后,服务全都会部署到 Manager 节点上。如果需要从 docker node ls 中删除节点,需要用

删不掉就加上  --force 参数

最后 manager 节点的退出相当于 Swarm 集群的消失

Swarm 集群最络也被删除了。

这差不多是 Docker Swarm 的基本的内容了,如果 Swarm 集群创建有问题,请留意以下两个端口号没被防火墙挡住

  1. 7946 端口,用于集群节点之间的通信
  2. 4789 端口,用于 overlay 网络流量

接下来就会移步到 Docker compose, 甚至 compose 可以部署到 Swarm 集群中,终极目标还是会去了解 Kubernetes。 

本文链接 https://yanbin.blog/docker-swarm-cluster-in-action/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

1 Comment
Inline Feedbacks
View all comments
trackback

[…] Kubernetes 进发,上一篇 Docker Swarm 集群模式实操 了解完 Swarm 后,有必要对 Docker Compose 了解一番。Docker Swarm 是把 Docker […]