Docker Swarm 学习笔记(八): Docker Swarm 相关命令
集群相关
1、 创建集群(在集群的管理节点中执行)
docker swarm init --advertise-addr 通告地址 --availability 节点可用性 --default-addr-pool 默认地址池 --listen-addr 监听地址 --task-history-limit 任务历史记录保存数 --autolock
参数说明:
--advertise-addr
: 通告地址,指定其他节点加入此 Swarm 集群时连接的管理节点地址,不配置时使用当前主机的 ip,若主机存在多个 ip,则必须配置
--availability
: 节点可用性,指定当前节点的可用性,即当前节点是否允许调度任务,默认为 active
active
: 可用,可将新任务分配至此节点
pause
: 暂停,不可将新任务分配至此节点,但现有任务不变
drain
: 不可用,不可将新任务分配至此节点,同时将此现有的任务转移至其他节点
--default-addr-pool
: 指定地址池,即分配给服务的 ip地址,默认为 10.0.0.0/8
--listen-addr
: 监听地址,即 Swarm 集群管理节点的监听地址,默认为 0.0.0.0:2377
--task-history-limit
: 任务历史记录保存限制,即保存多少份任务的历史记录,默认为 5
--autolock
: 启用集群的自动锁定功能
示例:
- 在 192.168.10.100 主机上创建一个 Docker Swarm 集群,初始管理节点为 192.168.10.100
- 192.168.10.100 仅作为管理节点,不调度任务
- 使用默认的服务地址池:10.0.0.0/8
- 使用默认的监听地址: 0.0.0.0:2377
- 任务历史记录保存 10 份
docker swarm init --advertise-addr 192.168.10.100 --availability drain --task-history-limit 10
2、 查看加入为集群节点的命令/令牌(在集群的管理节点中执行)
- 查看加入为管理节点时使用的命令
docker swarm join-token manager
- 查看加入为工作节点时使用的目录
docker swarm join-token worker
- 仅查看管理节点的令牌
docker swarm join-token --quiet manager
- 仅查看工作节点的令牌
docker swarm join-token --quiet worker
3、 更新加入集群的令牌(在集群的管理节点中执行)
- 更新全部令牌
docker swarm join-token --rotate
- 仅更新管理节点令牌
docker swarm join-token --rotate manager
- 仅更新工作节点令牌
docker swarm join-token --rotate worker
4、 更新集群
docker swarm update --task-history-limit 任务历史记录保存数 --autolock true/false
参数说明:
--task-history-limit
: 任务历史记录保存限制,即保存多少份任务的历史记录,默认为 5
--autolock
: 是否启用集群的自动锁定功能(可选 true、false)
示例:
- 启用集群的自动锁定功能
docker swarm update --autolock=true
- 禁用集群的自动锁定功能
docker swarm update --autolock=false
5、 查看解锁集群的秘钥
docker swarm unlock-key
6、 更新解锁集群的秘钥
docker swarm unlock-key --rotate
7、 解锁集群
docker swarm unlock
节点相关
1、 查看节点列表(在集群的管理节点中执行)
docker node ls
2、 查看节点详情(在集群的管理节点中执行)
docker node inspect --pretty 节点ID或HOSTNAME
参数说明:
--pretty
: 格式化输出,默认以 JSON 格式输出,添加此参数后以可读形式格式化输出
示例(查看 manager1 节点的详细信息):
docker node inspect --pretty manager1
3、 新增节点(在新增的节点中执行)
docker swarm join --token 令牌 管理节点IP:2377
说明:
- 新增管理节点和工作节点使用的命令相同,但令牌不同,因此加入时注意令牌是否正确
- 可以通过
docker swarm join-token manager
直接获取新增管理节点的命令 - 可以通过
docker swarm join-token worker
直接获取新增工作节点的命令
示例(将主机添加至以 192.168.10.100 为管理节点的 Swarm 集群):
docker swarm join --token SWMTKN-1-26phxwpgfmj0k6formcikx9wg9b9yzyw1gqyjyksbpqy0jb3o5-083rakqb5la00btvp5l50d7hg 192.168.10.100:2377
4、 将工作节点升级为管理节点(在集群的管理节点中执行)
- 方式一: 使用 promote
docker node promote 需要升级的节点ID或HOSTNAME(多个节点以空格分割)
示例(将 work1 节点升级为管理节点):
docker node promote work1
- 方式二: 使用 update
docker node update --role manager 节点ID或HOSTNAME
示例(将 work1 节点升级为管理节点):
docker node update --role manager work1
5、 将管理节点降级为工作节点(在集群的管理节点中执行)
- 方式一: 使用 demote
docker node demote 需要升级的节点ID或HOSTNAME(多个节点以空格分割)
示例(将 manager2 节点降级为工作节点):
docker node demote manager2
- 方式二: 使用 update
docker node update --role worker 节点ID或HOSTNAME
示例(将 manager2 节点降级为工作节点):
docker node update --role worker manager2
6、 修改节点可用性(在集群的管理节点中执行)
docker node update --availability 可用性 节点ID或HOSTNAME
参数说明:
--availability
: 节点可用性
active
: 可用,可将新任务分配至此节点
pause
: 暂停,不可将新任务分配至此节点,但现有任务不变
drain
: 不可用,不可将新任务分配至此节点,同时将此现有的任务转移至其他节点
示例:
- 修改 work1 节点为可用(可调度新任务)
docker node update --availability active work1
- 修改 work2 节点为暂停(不可调度新任务,但现有任务不变)
docker node update --availability active work2
- 修改 manager1 节点为不可用(不可调度新任务,同时转移现有任务)
docker node update --availability drain manager1
7、 新增节点元数据(在集群的管理节点中执行)
docker node update --label-add key=value 节点ID或HOSTNAME
示例(将 env=demo 标签添加至 manager1 节点):
docker node update --label-add env=demo manager1
8、 删除节点元数据(在集群的管理节点中执行)
docker node update --label-rm key=value 节点ID或HOSTNAME
示例(从 manager1 节点移除标签 env=demo ):
docker node update --label-rm env=demo manager1
9、 删除节点
第一步: 将节点离开集群(在需要删除的节点中执行)
docker swarm leave -f
参数说明:
-f
: 强制离开,若此节点为唯一的管理节点,则集群将不可用
第二步: 在集群中删除节点(在集群的管理节点中执行)
docker node rm 节点ID或HOSTNAME
示例(将 work2 节点移出集群):
docker node rm work2
服务相关
1、 查看服务列表
docker service ls
2、 查看服务详情
docker service inspect --pretty 服务名称
参数说明:
--pretty
: 格式化输出,默认以 JSON 格式输出,添加此参数后以可读形式格式化输出
示例(查看 nginx 服务的详细信息):
docker service inspect --pretty nginx
3、 查看服务日志
docker service logs -f -n 输出行数 -t 服务名称
参数说明:
-f
: 持续输出后续日志
-n
: 指定已有日志的输出行数(仅显示最后多少行的日志)
-t
: 显示时间戳
示例(持续输出包含时间戳的 nginx 服务日志信息,同时已有日志仅输出最后 100 行):
docker service logs -f -n 100 -t nginx
4、 创建新服务
docker service create \
--name 服务名称 --replicas 副本数 \
--env 环境变量 \
--workdir 工作目录 --user 用户 --mode 模式 \
--mount type=类型,src=卷名称或主机目录,dst=容器目录,readonly \
--config source=config名称,target=容器内文件,mode=模式(权限) \
--secret source=secret名称,target=容器内文件,mode=模式(权限) \
--update-delay 更新延时时间 --update-parallelism 同时更新任务数 --update-failure-action 更新失败时的处理方式 \
--network 网络名称 \
--publish published=服务端口,target=容器端口,protocol=端口协议,mode=模式 \
--reserve-cpu 预留的CPU核数 --reserve-memory 预留的内存容量 \
--constraint 约束条件 \
--placement-pref '首选项' \
镜像名称:镜像TAG \
运行的命令
参数说明:
--name
: 指定服务的名称,不指定时随机生成
--replicas
: 指定服务的副本数,不指定时默认为 1
--env
: 指定服务容器内部的环境变量,格式为 key=value
--workdir
: 之前服务容器内部的工作目录
--user
: 指定服务容器使用的用户
--mode
: 服务模式(可选 replicated、global,不配置时默认为 replicated )
replicated
:复制
global
:全局(每个节点都将运行此服务的一个副本(任务),当有新的节点加入集群时,会自动在新节点中部署一个副本(任务))
--mount
: 指定服务容器的挂载目录
type
: 类型(可选 volume、bind,默认为 volume)
volume
: 存储卷
bind
: 主机目录
src
: 卷名称或主机目录
dst
: 容器目录
readonly
: 标记为只读挂载,不加此项是默认为读写挂载
--config
: 指定需要挂载至容器内部的 config
source
: 指定 config 的名称
target
: 指定 config 挂载至容器内部的文件,即 config 要挂载至容器内部的哪个文件
mode
: 指定容器内部文件的权限
--secret
: 指定需要挂载至容器内部的 secret
source
: 指定 secret 的名称
target
: 指定 secret 挂载至容器内部的文件,即 secret 要挂载至容器内部的哪个文件
mode
: 指定容器内部文件的权限
--update-delay
: 指定服务的更新延时时间,h 表示小时、m 表示分支、s 表示秒
--update-parallelism
: 指定同时更新的任务数量,不配置时默认为 1,即同时仅更新 1 个任务
--update-failure-action
: 指定更新失败时的处理方式(可选 pause、continue、rollback,不配置是默认为 pause)
pause
: 停止,更新失败时停止更新,已更新成功的副本不会修改
continue
: 继续,更新失败时继续更新其他副本
rollback
: 回退,更新失败时回退副本
--network
: 指定此服务使用的 Docker Network,需要此 network 已经存在,且 network 的 driver 需要为 overlay(在 docker network create 时指定 -d overlay)
--publish
: 指定需要暴露给集群外部的端口
published
为服务端口
target
为容器端口
protocol
为端口协议(可选 tcp、udp,不配置时默认为 tcp )
mode
为端口模式(可选 ingress、host,不配置时默认为 ingress)
ingress
: 使用路由网格,通过 Swarm 集群的路由网格代理暴露服务
发送至该端口的请求会先达到 Swarm 集群的路由网格,再由路由网格将请求转发至任一可用的服务
无论服务的副本数为多少,访问集群任意主机的该端口,均可正常访问服务
host
:主机模式,直接使用主机的端口暴露服务
发送至该端口的请求直接到达主机对应的服务,不经过 Swarm 集群的路由网格
发送至指定主机的请求,只会由此主机处理,不会转发至其他主机,因此当某主机不存在该服务的副本时,直接发送至此主机的请求将无法正常访问服务
一般情况下,设置端口模式为 host 时,会同时将服务的模式设置为 global ,这样可以保证此服务在集群的每个主机中都存在一个副本,从而保证请求任意主机均可正常使用服务,同时也可以保证指定主机的请求只会被指定主机处理,不会被转发至其他的主机
--reserve-cpu
: 指定服务需要预留的 CPU 核数
--reserve-memory
: 指定服务需要预留的内存容量
--constraint
: 指定服务的约束条件,格式为 key=value 或 key!=value,可配置多个,多个直接的关系为并且,即需要同时满足多个条件才调度任务
--placement-pref
: 指定服务的放置首选项,是非强制性的约束,集群会将任务优先调度到满足条件的节点,当这样的节点不存在时,仍然会调度至现有的节点
示例:
- 使用 nginx:1.23.4-alpine3.17 镜像创建一个服务
- 服务名称为 nginx
- 副本数为 3
- 更新延时时间为 10 秒
- 将容器端口号 80 暴露至 10080 端口,即直接访问集群任意主机的 10080 端口,即可访问到此 Nginx 服务
docker service create --name nginx --replicas 3 --update-delay 10s --publish published=10080,target=80 nginx:1.23.4-alpine3.17
5、 修改服务副本数
docker service scale 服务名称=副本数
示例(将 nginx 服务的副本数修改为 5):
docker service scale nginx=5
6、 修改服务
docker service update \
--replicas 副本数 \
--env-add 新增的环境变量 --env-rm 删除的环境变量 \
--workdir 工作目录 --user 用户 --args "需要执行的命令" \
--mount-add type=类型,src=卷名称或主机目录,dst=容器目录,readonly --mount-rm type=类型,src=卷名称或主机目录,dst=容器目录,readonly \
--config-add source=config名称,target=容器内文件,mode=模式(权限) --config-rm config名称 \
--secret-add source=secret名称,target=容器内文件,mode=模式(权限) --secret-rm secret名称 \
--update-delay 更新延时时间 --update-parallelism 同时更新任务数 --update-failure-action 更新失败时的处理方式 \
--image 新镜像名称:新镜像TAG \
--network-add 新增的网络名称 --network-rm 删除的网络名称 \
--publish-add published=服务端口,target=容器端口,protocol=端口协议,mode=模式 --publish-rm published=服务端口,target=容器端口,protocol=端口协议,mode=模式 \
--reserve-cpu 预留的CPU核数 --reserve-memory 预留的内存容量 \
--constraint-add 新增的约束条件 --constraint-rm 删除的约束条件 \
--placement-pref-add 新增的放置首选项 --placement-pref-rm 删除的放置首选项 \
服务名称
参数说明:
--replicas
: 指定服务的副本数
--env-add
: 指定需要新增的环境变量,格式为 key=value
--env-rm
: 指定需要删除的环境变量,格式为 key=value
--workdir
: 之前服务容器内部的工作目录
--user
: 指定服务容器使用的用户
--args
: 指定服务容器需要执行的命令
--mount-add
: 指定需要新增的挂载
--mount-rm
: 指定需要删除的挂载
--config-add
: 指定需要新增的 config
--config-rm
: 指定需要删除的 config
--secret-add
: 指定需要新增的 secret
--secret-rm
: 指定需要删除的 secret
--update-delay
: 指定服务的更新延时时间,h 表示小时、m 表示分支、s 表示秒
--update-parallelism
: 指定同时更新的任务数量,不配置时默认为 1,即同时仅更新 1 个任务
--update-failure-action
: 指定更新失败时的处理方式(可选 pause、continue、rollback,不配置是默认为 pause)
pause
: 停止,更新失败时停止更新,已更新成功的副本不会修改
continue
: 继续,更新失败时继续更新其他副本
rollback
: 回退,更新失败时回退副本
--image
: 指定服务使用的新镜像
--network-add
: 指定此服务需要新增的 Docker Network,需要此 network 已经存在,且 network 的 driver 需要为 overlay
(在 docker network create 时指定 -d overlay)
--network-rm
: 指定此服务需要删除的 Docker Network
--publish-add
: 新增需要暴露给集群外部的端口,具体描述同上方创建新服务的 --publish 参数
--publish-rm
: 删除已经暴露给集群外部的端口,具体描述同上方创建新服务的 --publish 参数
--reserve-cpu
: 指定服务需要预留的 CPU 核数
--reserve-memory
: 指定服务需要预留的内存容量
--constraint-add
: 指定服务新增的约束条件,格式为 key=value 或 key!=value,可配置多个,多个直接的关系为并且,即需要同时满足多个条件才调度任务
--constraint-rm
: 指定服务删除的约束条件
--placement-pref-add
: 指定服务新增的放置首选项,是非强制性的约束,集群会将任务优先调度到满足条件的节点,当这样的节点不存在时,仍然会调度至现有的节点
--placement-pref-rm
: 指定服务删除的放置首选项
示例:
- 将 nginx 服务的副本数修改为 3 个
- 镜像更新为 nginx:1.24.0-alpine3.17
- 移除 10080 端口暴露
- 将容器端口号 80 暴露至 80 端口,即直接访问集群任意主机的 80 端口,即可访问到此 Nginx 服务
docker service update --replicas 3 --image nginx:1.24.0-alpine3.17 --publish-rm published=10080,target=80 --publish-add published=80,target=80 nginx
7、 回滚服务
docker service update --rollback \
--rollback-delay 回滚延时 \
--rollback-failure-action 回滚失败时的处理方式 \
--rollback-max-failure-ratio 回滚时允许的故障率 \
--rollback-monitor 失败判定时间 \
--rollback-parallelism 同时回滚任务数 \
服务名称
参数说明:
--rollback
: 标识此次更新为回滚操作
--rollback-delay
: 指定回滚的延时时间,在多任务情况下,回滚完前一个任务之后,等待多长时间开始回滚后一个任务
--rollback-failure-action
: 指定回滚失败时的处理方式(可选 pause、continue,默认为 pause)
--rollback-max-failure-ratio
: 指定回滚时允许的故障率,表示回滚时最多允许多少比例的失败,可选 0 ~ 1 及其之间的任意数,0 表示不允许任何失败、1 表示允许全部失败
--rollback-monitor
: 指定回滚失败的判断时间,即多长时间内,任务启动失败表示为回滚失败,默认为 5s
--rollback-parallelism
: 指定同时回滚的任务数,默认为 1
示例(回滚 nginx 服务至上一个版本):
docker service update --rollback nginx
8、 删除服务
docker service rm 服务名称
示例(删除 nginx 服务):
docker service rm nginx
任务相关
1、 查看指定服务的任务列表
docker service ps 服务名称(多个服务间以空格分割)
示例(查看 nginx 服务的任务列表):
docker service ps nginx
评论已关闭