docker三剑客之swarm

Docker Swarm 是 Docker 官方三剑客项目之一,提供 Docker 容器集群服务,是 Docker 官 方对容器云生态进行支持的核心方案。

使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容 器云平台。

Swarm mode 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设 计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的 Swarm 集群具备与 Mesos、Kubernetes 竞争的实力。

基本概念:

Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具。 使用 Swarm 集群之前需要了解以下几个概念。

节点:

运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群, 这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 ( node ) 。

节点分为管理 ( manager ) 节点和工作 ( worker ) 节点。

管理节点用于 Swarm 集群的管理, docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)

一个 Swarm 集群可以有多个管理节 点,但只有一个管理节点可以成为 leader , leader 通过 raft 协议实现。

工作节点是任务执行节点,管理节点将服务 ( service ) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。

管理节点和工作节点之间的关系如图所示:

任务( Task ):是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。

服务 ( Services ): 是指一组任务的集合,服务定义了任务的属性。 服务有两种模式:

  1. replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
  2. global services 每个工作节点上运行一个任务

容器、任务、服务三者之间的关系为服务中包括任务,任务中包括多个容器如图:

创建swarm集群:

通过docker swarm init命令初始化一个集群,执行此命令后此节点将自动变成管理节点,如图:

如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 –advertise-addr 指定 IP。 例如:docoker swarm init –advertise-addr 192.168….

从上图中可以看出,已经提示如果要添加工作节点,执行命令:docker swarm join –token SWMTKN-1-12d5n9zdn545mye7ulojerposfavt1tlninyouk79i5oo76vs5-4lf6ge2ztv67xl5i4cz2oabzh 192.168.170.132:2377

此时我们在另外一个docker主机(worker)上执行命令,显示添加节点成功,如图:

注意:如果在添加过程中报错1:Error response from daemon: error while validating Root CA Certificate: x509: certificate has expired or is not yet valid,此时应该检查管理几点的时间是否有偏差,可以通过date查看,如果时间有偏差,可以执行命令 ntpdate cn.pool.ntp.org 同步时间,然后再添加工作节点即可,报错2:Error response from daemon: –live-restore daemon configuration is incompatible with swarm mode,因为在swarm模式下,容器统一通过swarm调度,不需要–live-restore来管理

添加完成后在管理节点执行命令,docker node ls 可以查看管理节点以及工作节点,如图:

如果有其他工作节点需要加入到管理节点中,但是不记得应该使用哪个命令了,此时可以在管理节点,使用命令docker swarm join-token worker查看,如图:

在管理节点后方的可以看到leader字样,表示为管理节点中正在使用的,如图:

如果有多个管理节点(一般是两个管理节点一个仲裁节点),先在第一个管理节点执行命令docker swarm join-token manager,如图:

从上图中可以看到,下面提示了如何添加管理节点,在另一个同样要作为管理节点的机器上执行上图中的命令docker swarm join –token SWMTKN………,如图:

此时在管理节点再次执行docker node ls 可以看到两个管理节点,其中leader表示当前管理节点中的主节点,Reachable表示备用节点(表示可到达的节点),如图:

注意:管理节点至少需要三台机器,其中一台表示仲裁节点,另外两台作为主备节点,当其中一台挂掉后,另一台可以接管成为新的管理节点(如果只有两台机器,那么一台挂掉后另外一台无法接管服务)

此时在第三台管理节点服务器上执行命令 docker swarm join –token SWMTKN………, 将它加入到swarm集群中,作为第三个管理节点,可以看到一个leader和两个Reachable,如图:

此时模拟主管理节点(leader)挂掉,在其他节点执行docker node ls 可以看到主节点已经变成unreachable,其余节点接管成为主节点,如图:

此时将挂掉的主节点恢复后,此节点又会重新加入到集群中。

退出swarm集群:

管理节点如果要退出swarm集群可以通过命令docker swarm leave –force

工作节点如果要退出swarm集群可以通过命令docker swarm leave

注意:如果管理节点想要退出集群,那么当前状态一定要有三个管理节点才可以,退出一个另外两个不受影响,如果只有两个管理节点,退出一个后,另外一个将无法工作。

删除节点:

删除工作节点可以使用如下命令,其中-f表示强制删除,如图:

删除管理节点的时候可以看到提示一个错误,此错误表示需要先将管理节点降级为工作节点后才可以删除,如图:

此时需要先通过命令docker node demote 将节点降级,然后删除,如图:

注意:如果在执行命令的时候提示 Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It’s possible that too few managers are online. Make sure more than half of the managers are online. 此时可以执行命令 docker swarm init –force-new-cluster 重新初始化集群

部署服务

通过docker service命令来管理swarm中的服务,此命令只能在管理节点中运行。

swarm集群默认情况下创建的服务可以同时在管理节点或者工作节点运行,一般情况我们只需要在工作节点运行,管理节点只用作管理使用,不跑服务,此时可以通过标签进行指定,让服务只运行在工作节点。

添加标签

其中,gong=nginx为自定义设置,work1表示工作节点1,也可以根据需要自己选择,执行命令如下:

添加完成后执行命令查看标签状态,如图:

在节点二上也执行同样的添加标签命令,如图:

执行命令docker node inspect work2查看标签状态,如图:

从上图中可以看出,节点一和节点二创建了相同的nginx标签,此目录是创建服务的时候,指定此标签后,可以将服务同时分散到两个节点上,避免一个节点挂掉后导致服务停止。

部署服务:

例如:在管理节点,执行命令启动nginx服务,并指定了标签,如图:

注意:docker swarm不会优先使用本地镜像来创建,会从仓库拉取,因此如果本地部署,需要配置harbor仓库

创建完成后,执行命令docker service ps nginx可以看到服务同时在两个节点中运行,此时通过管理节点或者其中任何一个节点访问nginx 都是成功的,如图:

此时模拟work1的docker守护进程down掉,再次查看服务情况,可以看到两个服务都跑在了work2节点中,如图:

在work2节点可以看到运行的两个容器,此时的容器一台是原有的容器,另一个是重新创建的容器,并不是work1漂移过来的,如图:

当work1的docker守护进程恢复后,此时两个容器依旧运行在work2节点中,当work2节点挂掉后,work1节点又会重新创建两个节点运行,如图:

因此,如果如果要保证新创建的容器与原来一样,就需要改变基础镜像,保证每次创建容器的时候使用同样的镜像,这样就可以实现work1或者work2显示的内容一样。

查看服务详情:

执行命令:docker service inspect –pretty nginx 如图:

滚动更新:

当有新版本升级的时候,此时可通过滚动更新完成

例如:此时nginx镜像有一新版本,此时可通过命令更新如下:

注意:滚动更新时如果是本地镜像,需要在每个节点上都要导入镜像才可以更新成功,否则会报错,如果是从仓库拉取镜像,那么需要每个节点都可以访问仓库并可以拉取镜像,然后才管理节点滚动更新即可

回滚镜像:

如果发布后想回滚到发布前的状态,此时可通过命令如下:

重启服务:

如果某个服务要重启,可先通过scale命令将服务副本设置为0,如图:

启动服务的时候,再次将副本的数量设置为原数量即可,如图:

附加:

1、docker swarm 启动容器如何挂载本地路径到容器中?

docker service create --replicas 2  --name nginx \
--mount type=bind,src=/etc/localtime,dst=/etc/localtime  -p 80:80 harbor.com/nginx/nginx:1.27.0 

注:要挂载真实的本地路径才可以,如果挂载从NFS挂载过来的路径会提示找不到

2、docker swarm使用了哪些端口?

  • 2377/tcp:客户端与Swarm进行安全通信的端口。这个端口是用于管理操作的,如服务的创建、更新和查询等
  • 7946/tcp、7946/udp:用于集群内部通信
  • 4789/udp:用于基于VXLAN的overlay网络

如果要变更管理节点,此时可以先将其他管理节点降级为工作节点,此时要变更的节点将会自动升级为leader节点,然后再将其他节点升级为管理节点即可。

降级管理节点命令:docker node demote manager

升级管理节点命令:docker node promote manager

标签