一、概述
Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm;Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
Swarm 是什么?
Docker Swarm 是Docker官方的跨节点的容器编排工具。用户只需要在单一的管理节点上操作,即可管理集群下的所有节点和容器。
从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。
Docker Swarm 基本结构图
上图可以看出,Swarm是典型的master-slave结构,通过发现服务来选举manager。manager是中心管理节点,各个node上运行agent接受manager的统一管理,集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持。
二、Docker Swarm 工作原理
1)Docker Engine client
- docker service create:我们通过docker service create这个命令去创建一个服务。
2)swarm manager
- API:这个请求直接由Swarm manager的API进行接收,接收命令并创建服务对象。
- orchestrator:为服务创建一个任务。
- allocater:为这个任务分配IP地址。
- dispatcher:将任务分配到指定的节点。
- scheduler:再该节点中下发指定命令。
3)worker node:接收manager任务后去运行这个任务
- container:创建相应的容器。
- worker:连接到调度程序以检查分配的任务
- executor:执行分配给工作节点的任务
Service:为一个副本,可以理解为是一个任务,一个任务是一个容器。
swarm manager:它将这个副本下发到三个可用的work节点。
container:实际的docker容器去运行应用。
task:work任务的名称为service名称后面跟.1根据个数以此类推。
三、Swarm的几个关键概念
- Swarm
集群的管理和编排是使用嵌入docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm
- Node
每一个docker engin都是一个node(节点),分为 manager 和worker。Manager节点还执行维护所需群集状态所需的编排和集群管理功能。Work节点接收并执行从管理器节点分派的任务。
- Service
一个服务是任务的定义,管理机或工作节点上执行。它是群体系统的中心结构,是用户与群体交互的主要根源。创建服务时,你需要指定要使用的容器镜像。
- Task
任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点。一个任务包含了一个容器及其运行的命令。task是service的执行实体,task启动docker容器并在容器中执行任务。
Swarm命令行说明
1)docker swarm:集群管理
集群管理,子命令有init, join, leave, update。(docker swarm --help查看帮助);
作用
执行集群的管理功能,维护集群的状态,选举一个leader节点去执行调度任务。
init #初始化集群
join #将节点加入集群
join-token #管理加入令牌
leave #从集群中删除某个节点,强制删除加参数--force
update #更新集群
unlock #解锁集群
2)docker node:节点管理
节点管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm。(docker node --help查看帮助)
作用
接收和执行任务。参与容器集群负载调度,仅用于承载task。
demote #将集群中一个或多个节点降级
inspect #显示一个或多个节点的详细信息
ls #列出集群中的节点
promote #将一个或多个节点提升为管理节点
rm #从集群中删除停止的节点,--force强制删除参数
ps #列出一个或多个节点上运行的任务
update #更新节点
3)docker service:服务管理
服务创建,子命令有create, inspect, update, remove, tasks。(docker service–help查看帮助)
作用
一个服务是work节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令。
create #创建一个新的服务
inspect #列出一个或多个服务的详细信息
ps #列出一个或多个服务中的任务信息
ls #列出服务
rm #删除一个或多个服务
scale #扩展一个或多个服务
update #更新服务
四、Swarm的调度策略
Swarm在调度(scheduler)节点(leader节点)运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread, binpack, random.
- Random
顾名思义,就是随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点的可用的CPU, RAM以及正在运
行的容器的数量来计算应该运行容器的节点。
- Spread
在同等条件下,Spread策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点。
使用Spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。
- Binpack
Binpack策略最大化的避免容器碎片化,就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在
一个节点上面。
五、Swarm Cluster模式特性
- 批量创建服务
建立容器之前先创建一个overlay的网络,用来保证在不同主机上的容器网络互通的网络模式
- 强大的集群的容错性
Swarm Cluster不光只是提供了优秀的高可用性,同时也提供了节点弹性扩展或缩减的功能。当容器组想动态扩展时,只需通过scale参数即可复制出新的副本出来。
如果有需求想在每台节点上都run一个相同的副本,方法其实很简单,只需要在命令中将"–replicas n"更换成"–mode=global"即可!
- 复制服务(–replicas n)
将一系列复制任务分发至各节点当中,具体取决于您所需要的设置状态,例如“–replicas 3”。
- 全局服务(–mode=global)
适用于集群内全部可用节点上的服务任务,例如“–mode global”。如果大家在 Swarm 集群中设有 7 台 Docker 节点,则全部节点之上都将存在对应容器。
- 调度机制
所谓的调度其主要功能是cluster的server端去选择在哪个服务器节点上创建并启动一个容器实例的动作。它是由一个装箱算法和过滤器组合而成。每次通过过滤器(constraint)启动容器的时候,swarm cluster 都会调用调度机制筛选出匹配约束条件的服务器,并在这上面运行容器。
六、Dcoker Swarm 集群部署
5.1、环境准备(三台linux机器,centos8系统)
IP:192.168.0.110 主机名:manager110 担任角色:swarm manager
IP:192.168.0.111 主机名:node111 担任角色:swarm node
IP:192.168.0.112 主机名:node112 担任角色:swarm node
5.2、开始创建Swarm cluster
1、准备工作
1)修改主机名
# 192.168.0.110执行
$ hostnamectl set-hostname manager110
# 192.168.0.111执行
$ hostnamectl set-hostname node111
# 192.168.0.112执行
$ hostnamectl set-hostname node112
2)在所有节点上配置/etc/hosts文件(可配置可不配置)
$ echo '192.168.0.110 manager110' >> /etc/hosts
$ echo '192.168.0.111 node111' >> /etc/hosts
$ echo '192.168.0.112 node112' >> /etc/hosts
3)设置防火墙
关闭三台机器上的防火墙,不建议直接关闭防火墙,一般生成环境上不允许直接关闭防火墙。如果开启防火墙,则需要在所有节点的防火墙上依次放行2377/tcp(管理端口)、7946/tcp/udp(节点间通信端口)、4789/udp(overlay 网络端口)端口。
如果对防火墙不清楚的,可以看这里
# 放开2377/tcp,7946/udp,4789/udp端口
$ firewall-cmd --zone=public --add-port=2377/tcp --permanent
$ firewall-cmd --zone=public --add-port=7946/tcp --permanent
$ firewall-cmd --zone=public --add-port=7946/udp --permanent
$ firewall-cmd --zone=public --add-port=4789/udp --permanent
# 重新加载生效
$ firewall-cmd --reload
# 查看
$ firewall-cmd --list-ports
4)所有节点安装docker并配置加速器
安装
$ yum -y install docker-ce
【配置加速】修改文件 /etc/docker/daemon.json,没有这个文件就创建
添加以下内容后,重启docker服务:
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
2、创建Swarm并添加节点
1)创建Swarm集群(manager110)
$ docker swarm init --advertise-addr 192.168.0.110
上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的token,作为集群唯一标识。记住这个token值,后续将其他节点加入集群都会用到这个token值。
其中,–advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输出包含了其它节点如何加入集群的命令。
再次执行会报如下错误
解决方法
# 这里的leave就是在集群中删除节点,-f参数强制删除,执行完在重新执行OK
$ docker swarm leave -f
$ docker swarm init --advertise-addr 192.168.0.110
2)查看集群的相关信息
$ docker info
发现swarm状态active,且是manager节点
$ docker node ls
3) 添加node节点主机到Swarm集群
上面我们在创建Swarm集群的时候就已经给出了添加节点的方法。如果忘记了,可以通过以下命令查看token和添加方法
$ docker swarm join-token worker
#node111 主机上执行
$ docker swarm join --token SWMTKN-1-2fhcxi16zhm0wfeijbgw426il1oo8nbt1qkswfyprk4cooq94y-cp543kam4fgna3s7wg5h9q2aa 192.168.0.110:2377
【问题】可能会出现如下问题
这是因为时间不同步的问题,安装chrony时间同步服务即可
【解决】
$ yum install chrony -y
编辑配置文件/etc/chrony.conf,换成阿里的时间同步服务器:
[root@RedHat8-2 ~]# cat /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#pool ntp1.aliyun.com iburst --注释这行,外网时间服务器的网址,阿里的时间同步服务器
server 172.20.10.6 iburst --添加这行,表示与本机同步时间(视情况自行更改)
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3
# Enable kernel synchronization of the real-time clock (RTC).
rtcsync
# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *
# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2
# Allow NTP client access from local network.
allow 172.20.10.0/28 -->>允许哪些服务器或客户端到这台时间服务器来同步时间。必须配置
# Serve time even if not synchronized to a time source.
local stratum 10 -->>该行注释取消掉不然NTP synchronized: 为no 取消掉后变为 NTP synchronized:yes
# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys
# Get TAI-UTC offset and leap seconds from the system tz database.
leapsectz right/UTC
# Specify directory for log files.
logdir /var/log/chrony
# Select which information is logged.
#log measurements statistics tracking
重启chrondy服务
$ systemctl restart chronyd
# 查看同步源
$ chronyc sources -v
# 查看同步状态
$ timedatectl
在manager110节点上重新执行
$ docker swarm leave -f
$ docker swarm init --advertise-addr 192.168.0.110
在node111和node112和节点重新执行以下命令,添加到集群中
# 先查加入集群的命令(在manager110节点上执行)
$ docker swarm join-token worker
$ docker swarm join --token SWMTKN-1-2fhcxi16zhm0wfeijbgw426il1oo8nbt1qkswfyprk4cooq94y-cp543kam4fgna3s7wg5h9q2aa 192.168.0.110:2377
在manager110节点上查看node信息
$ docker node ls
AVAILABILITY 的三种状态:
- Active:调度器能够安排任务到该节点
- Pause:调度器不能够安排任务到该节点,但是已经存在的任务会继续运行
- Drain:调度器不能够安排任务到该节点,而且会停止已存在的任务,并将这些任务分配到其他 Active 状态的节点
改变节点的可用性(availability),如下操作:
$ docker node update --availability drain node111
$ docker node ls
如上,当node1的状态改为drain后,那么该节点就不会接受task任务分发,就算之前已经接受的任务也会转移到别的节点上。
再次修改为active状态(及将下线的节点再次上线)
$ docker node update --availability active node111
$ docker node ls
MANAGER STATUS 的三种状态:
- Leader:为群体做出所有群管理和编排决策的主要管理者节点
- Reachable:如果 Leader 节点变为不可用,该节点有资格被选举为新的 Leader
- Unavailable:该节点不能和其他 Manager 节点产生任何联系,这种情况下,应该添加一个新的 Manager 节点到集群,或者将一个 Worker 节点提升为 Manager 节点
升级/降级节点,示例:
# 升级
$ docker node promote node111
或者
$ docker node update --role manager node111
# 降级
$ docker node demote node111
或者
$ docker node update --role worker node111
3、在Swarm中部署服务(nginx为例)
Docker 1.12版本提供服务的Scaling、health check、滚动升级等功能,并提供了内置的dns、vip机制,实现service的服务发现和负载均衡能力。
1)创建网络(overlay)
$ docker node ls
$ docker network ls | grep nginx_net
2)部署服务
# 就创建了一个具有一个副本(--replicas 1 )的nginx服务,使用镜像nginx
$ docker service create --replicas 1 --network nginx_net --name my_nginx -p 80:80 nginx
# 查看
$ docker service ls
3)查询Swarm中服务的信息
-pretty 使命令输出格式化为可读的格式,不加 --pretty 可以输出更详细的信息:
$ docker service inspect --pretty my_nginx
查询到哪个节点正在运行该服务
$ docker service ps my_nginx
如下该容器被调度到manager-node节点上启动了,然后访问http://192.168.0.110即可访问这个容器应用(如果调度到其他节点,访问也是如此)
登陆该节点,可以查看到nginx容器在运行中
$ docker ps
4)在Swarm中动态扩展服务(scale)
当然,如果只是通过service启动容器,swarm也算不上什么新鲜东西了。Service还提供了复制(类似kubernetes里的副本)功能。可以通过docker service scale 命令来设置服务中容器的副本数比如将上面的my_nginx容器动态扩展到4个。
$ docker service scale my_nginx=4
和创建服务一样,增加scale数之后,将会创建新的容器,这些新启动的容器也会经历从准备到运行的过程,过一分钟左右,服务应该就会启动完成,这时候可以再来看一下 nginx 服务中的容器
$ docker service ps my_nginx
可以看到,之前my_nginx容器只在manager-node节点上有一个实例,而现在又增加了3个实例。
5)模拟宕机node节点
如果一个节点宕机了(即该节点就会从swarm集群中被踢出),则Docker应该会将在该节点运行的容器,调度到其他节点,以满足指定数量的副本保持运行状态。
将node111宕机后或将node111的docker服务关闭,那么它上面的task实例就会转移到别的节点上。当node111节点恢复后,它转移出去的task实例不会主动转移回来,只能等别的节点出现故障后转移task实例到它的上面。使用命令"docker node ls",发现node111节点已不在swarm集群中了(状态为:Down)。
然后过一会查询服务的状态列表
$ docker node ls
6)Swarm 动态缩容服务(scale)
同理,swarm还可以缩容,同样是使用scale命令。
将my_nginx容器变为1个
$ docker service scale my_nginx=1
过段时间查看
$ docker service ps my_nginx
7)除了上面使用scale进行容器的扩容或缩容之外,还可以使用docker service update 命令。 可对 服务的启动 参数 进行 更新/修改。
$ docker service update --replicas 3 my_nginx
$ docker service ps my_nginx
8)为了下面的直观显示,我这里把my_nginx服务直接删除了
$ docker service rm my_nginx
4、Swarm中使用Volume(挂在目录,mount命令)
前面有一篇专门说Volume的,不清楚可以看这里
1)查看volume的帮助信息
$ docker volume --help
2)创建一个volume
$ docker volume create --name testvolume
$ docker volume ls
$ docker volume inspect testvolume
2)创建新的服务并挂载testvolume(nginx为例)
$ docker service create --replicas 3 --mount type=volume,src=testvolume,dst=/usr/share/nginx/html --name test_nginx nginx
温馨提示:
参数src写成source也可以;dst表示容器内的路径,也可以写成target
查看
$ docker service ls
$ docker service ps test_nginx
5、多服务Swarm集群部署
这里部署的服务有三个(nginx服务,visualizer服务,portainer服务) 除了nginx服务作为示例之外,visualizer(官方地址)和portainer(官方地址)都是集群 GUI 管理服务。
docker service部署的是单个服务,我们可以使用docker stack进行多服务编排部署。
1)编写docker-compose.yml文件
$ mkdir swarmGUI
$ cd swarmGUI
$ cat docker-compose.yml
version: "3"
services:
nginx:
image: nginx
ports:
- 8888:80
deploy:
mode: replicated
replicas: 3
visualizer:
image: dockersamples/visualizer
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
portainer:
image: portainer/portainer
ports:
- "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
2)通过这个yml文件部署服务
$ docker stack deploy -c docker-compose.yml deploy_deamon
查看创建服务
$ docker service ls
3)测试验证
第一个服务:deploy_deamon_nginx,先查看调度到哪个节点上
$ docker service ps deploy_deamon_nginx
从上图看调度到manager110和node112节点上
访问:
http://192.168.0.110:8888
http://192.168.0.112:8888
第二个服务:deploy_deamon_portainer
$ docker service ps deploy_deamon_portainer
登录后台
1)第一次登陆,会让我们设置密码。
2)选择local模式
由于portainer支持local、remote、agent等形式来管理docker容器。我们这里是为了管理本地的docker容器,所以选择第一个local。
3)查看我们管理下的endpoint
4)查看endpoint中所有的信息
可以看到该页面包含该endpoint几乎所有的信息,其中有镜像信息、容器信息、容器网络、volume等,并且提供操作。(有时候可能操作会报错,这时再去CMD中操作就可以了)
第三个服务:deploy_deamon_visualizer
$ docker service ps deploy_deamon_visualizer
七、Docker Swarm 网络管理
7.1、Swarm 集群产生两种不同类型的流量
- 控制和管理层面:包括 Swarm 消息管理等,例如请求加入或离开Swarm,这种类型的流量总是被加密的。(涉及到集群内部的hostname、ip-address、subnet、gateway等)
- 应用数据层面:包括容器与客户端的通信等。(涉及到防火墙、端口映射、网口映射、VIP等)
7.2、在 Swarm Service 中有三个重要的网络概念
- Overlay networks :覆盖物网络,顾名思义是附着在主机底层网络之上的网络, 这个网络保证了不同主机之间容器通信,手动创建。
- ingress network:进入网络,顾名思义是外部客户端访问服务时,服务节点间负载均衡(节点在开放端口上收到请求,上交给IPVS,选择容器),是一种特殊的overlay网络,创建集群的时候自动创建。
初始化或加入 Swarm 集群时会自动创建 ingress 网络,大多数情况下,用户不需要自定义配置,但是 docker 17.05 和更高版本可以自定义网络 - docker_gwbridge是一种桥接网络,将 overlay 网络(包括 ingress 网络)连接到一个单独的 Docker 守护进程的物理网络。默认情况下,服务正在运行的每个容器都连接到本地 Docker 守护进程主机的 docker_gwbridge 网络。
docker_gwbridge 网络在初始化或加入 Swarm 时自动创建。大多数情况下,用户不需要自定义配置,但是 Docker 允许自定义。
在初始化或刚加入Swarm集群时,会创建一个Ingress和 docker-gwbridge网络
上面nginx_net是自定义的overlay网络,ingress 和 docker_gwbridge是自动创建的。
八、docker-machine、docker swarm、docker node、docker service 和 docker stack 常用命令
1)docker-machine 常用命令
命令 | 说明 |
---|---|
docker-machine create | 创建一个 Docker 主机(常用-d virtualbox) |
docker-machine ls | 查看所有的 Docker 主机 |
docker-machine ssh | SSH 到主机上执行命令 |
docker-machine env | 显示连接到某个主机需要的环境变量 |
docker-machine inspect | 输出主机更多信息 |
docker-machine kill | 停止某个主机 |
docker-machine restart | 重启某台主机 |
docker-machine rm | 删除某台主机 |
docker-machine scp | 在主机之间复制文件 |
docker-machine start | 启动一个主机 |
docker-machine status | 查看主机状态 |
docker-machine stop | 停止一个主机 |
2)docker swarm 常用命令
命令 | 说明 |
---|---|
docker swarm init | 初始化集群 |
docker swarm join-token worker | 查看工作节点的 token |
docker swarm join-token manager | 查看管理节点的 token |
docker swarm join | 节点加入集群中 |
docker swarm leave | 节点离开集群 |
docker swarm update | 更新集群 |
docker swarm init 初始化集群
docker swarm init
docker swarm init --advertise-addr 192.168.8.110
命令格式:docker swarm init [options]
[root@centos ~]# docker swarm init --help
Usage: docker swarm init [OPTIONS]
Initialize a swarm
Options:
--advertise-addr string Advertised address (format: <ip|interface>[:port])
--autolock Enable manager autolocking (requiring an unlock key to start a stopped manager)
--availability string Availability of the node ("active"|"pause"|"drain") (default "active")
--cert-expiry duration Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)
--data-path-addr string Address or interface to use for data path traffic (format: <ip|interface>)
--data-path-port uint32 Port number to use for data path traffic (1024 - 49151). If no value is set or is set to 0, the
default port (4789) is used.
--default-addr-pool ipNetSlice default address pool in CIDR format (default [])
--default-addr-pool-mask-length uint32 default address pool subnet mask length (default 24)
--dispatcher-heartbeat duration Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
--external-ca external-ca Specifications of one or more certificate signing endpoints
--force-new-cluster Force create a new cluster from current state
--listen-addr node-addr Listen address (format: <ip|interface>[:port]) (default 0.0.0.0:2377)
--max-snapshots uint Number of additional Raft snapshots to retain
--snapshot-interval uint Number of log entries between Raft snapshots (default 10000)
--task-history-limit int Task history retention limit (default 5)
–advertise-addr:当前主机暴露的ip地址
–availability:当前节点状态(active、pause、drain),默认为active(可正常使用)
–listen-addr:监听地址,默认为0.0.0.0:2377
docker swarm join 节点加入集群
docker swarm join-token worker | 查看工作节点的 token 执行后node为worker
# docker swarm join --token SWMTKN-1-5kon47jifi9p4zn10sjl3lf9sr4f1gt1vwzyjrnmlpvv6gikpk-akm7chnvzgcfe6g80juankrab 192.168.8.110:2377
docker swarm join-token manager | 查看管理节点的 token 执行后node为manager
# docker swarm join --token SWMTKN-1-5kon47jifi9p4zn10sjl3lf9sr4f1gt1vwzyjrnmlpvv6gikpk-36b1pkwkpml6rqm69smn02gab 192.168.8.110:2377
命令格式:docker swarm join [options]
[root@centos ~]# docker swarm join --help
Usage: docker swarm join [OPTIONS] HOST:PORT
Join a swarm as a node and/or manager
Options:
--advertise-addr string Advertised address (format: <ip|interface>[:port])
--availability string Availability of the node ("active"|"pause"|"drain") (default "active")
--data-path-addr string Address or interface to use for data path traffic (format: <ip|interface>)
--listen-addr node-addr Listen address (format: <ip|interface>[:port]) (default 0.0.0.0:2377)
--token string Token for entry into the swarm
–token:要加入集群的token
docker swarm leave 节点离开集群
docker swarm leave STATUS 》由Ready变成Down后进行退出
docker swarm leave -f
# 离开节点需对节点进行降级,STATUS由Ready变成Down后执行退出
# 退出当前的swarm节点
docker node rm cdh3
docker node rm --force cdh3
docker node rm --force 2pfwllgxpajx5aitlvcih9vsq
#swarm管理机退出swarm
docker node ls
docker swarm leave --force # swarm管理机退出swarm,需要 --force 参数
docker node ls
命令格式:docker swarm leave [options]
[root@centos ~]# docker swarm leave --help
Usage: docker swarm leave [OPTIONS]
Leave the swarm
Options:
-f, --force Force this node to leave the swarm, ignoring warnings
-f:强制离开集群
docker swarm update 更新集群
# 升级 MANAGER STATUS 》Reachable
docker node promote cdh3
或者
docker node update --role manager cdh3
# 降级 MANAGER STATUS 》空
docker node demote cdh3
或者
docker node update --role worker cdh3
# 在leader节点执行一下两行命令,更新CA证书有效期为99年
docker swarm update --cert-expiry 867240h0m0s
docker swarm ca --rotate | openssl x509 -text -noout
命令格式:docker swarm update [options]
[root@centos ~]# docker swarm update --help
Usage: docker swarm update [OPTIONS]
Update the swarm
Options:
--autolock Change manager autolocking setting (true|false)
--cert-expiry duration Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)
--dispatcher-heartbeat duration Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
--external-ca external-ca Specifications of one or more certificate signing endpoints
--max-snapshots uint Number of additional Raft snapshots to retain
--snapshot-interval uint Number of log entries between Raft snapshots (default 10000)
--task-history-limit int Task history retention limit (default 5)
--autolock:集群自动锁定设置
--cert-expiry:设置证书的有效期
--external-ca:设置自定义证书
--max-snapshots:最大保存的raft快照
--task-history-limit:历史任务保存数量,默认为5
--snapshot-interval:快照间隔周期
--dispatcher-heartbeat-duration:心跳检测周期,默认5s
3)docker node 常用命令
命令 | 说明 |
---|---|
docker node ls | 查看所有集群节点 |
docker node rm | 删除某个节点(-f强制删除) |
docker node inspect | 查看节点详情 |
docker node demote | 节点降级,由管理节点降级为工作节点 |
docker node promote | 节点升级,由工作节点升级为管理节点 |
docker node update | 更新节点 |
docker node ps | 查看节点中的 Task 任务 |
4)docker service 常用命令
命令 | 说明 |
---|---|
docker service create | 部署服务 |
docker service inspect | 查看服务详情 |
docker service logs | 产看某个服务日志 |
docker service ls | 查看所有服务详情 |
docker service rm | 删除某个服务(-f强制删除) |
docker service scale | 设置某个服务个数 |
docker service update | 更新某个服务 |
5)docker stack 常用命令
命令 | 说明 |
---|---|
docker stack deploy | 部署新的堆栈或更新现有堆栈 |
docker stack ls | 列出现有堆栈 |
docker stack ps | 列出堆栈中的任务 |
docker stack rm | 删除堆栈 |
docker stack services | 列出堆栈中的服务 |
docker stack down | 移除某个堆栈(不会删除数据) |
九、docker三剑客区别
组件 | 作用&区别 |
---|---|
docker-compose | dcoker-compose主要是解决本地docker容器编排问题。 |
docker-machine | docker-machine是解决docker运行环境问题。 |
docker-swarm | docker-swarm是解决多主机多个容器调度部署问题。 |