menu 学习笔记
search self_improvement
目录

Docker Swarm 学习笔记(八): Docker Swarm 相关命令

huty
huty 2023年05月25日  ·  阅读 1,136

集群相关

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

评论已关闭