Docker Swarm

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

Docker 1.12 Swarm mode 已经内嵌入 Docker 引擎,成为了 docker 子命令 docker swarm。请注意与旧的 Docker Swarm 区分开来。

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

  • 基本概念

Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具

  • 节点

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

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

管理节点:用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。
工作节点:是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。也可以通过配置让服务只运行在管理节点。

在这里插入图片描述

  • 服务

服务是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
replicated services: 按照一定规则在各个工作节点上运行指定个数的任务。
global services :每个工作节点上运行一个任务。
两种模式通过 docker service create--mode 参数指定。

  • 任务

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

容器、任务、服务的关系如下所示:
在这里插入图片描述
docker swarm:集群管理命令有initjoinleaveupdatedocker swarm --help查看帮助)

docker node:节点管理命令有acceptpromotedemoteinspectupdate, taskslsrmdocker node --help查看帮助)

docker service:服务管理命令有createinspectupdateremovetasksdocker service--help查看帮助)

开始搭建Swarm

  • 在需要设置为Manager的节点上输入如下命令,开始容器集群搭建,IP地址写当前服务IP。
$ docker swarm init --advertise-addr <MANAGER-IP>
[root@gpu03 ~]# docker swarm init --advertise-addr 10.168.103.151
Swarm initialized: current node (mclobj2doj65sek345mjkklfo) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-52qr2b726yufvm3mqye9ay69xftej8f6dc19kze3znuo1psc4v-4p305qp65j9k2hs9he4i8nhcn 10.168.103.151:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

在其它主机上执行上述返回的命令加入swarm:

[hesangang@hesangang ~]#docker swarm join --token SWMTKN-1-52qr2b726yufvm3mqye9ay69xftej8f6dc19kze3znuo1psc4v-4p305qp65j9k2hs9he4i8nhcn 10.168.103.151:2377

manager节点通过docker node ls命令查看节点信息

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
sflpfedy8d3qrbt4izkmezq2g *   gpu03               Ready               Active              Leader              19.03.2
7ngt13w56zcngcay50t6pt1r9     hesangang           Ready               Active                                  19.03.8
ymqajb70b44me1dqwsr0ub3vg     ubuntu-zhzy         Ready               Active                                  19.03.4

如果后续我们有新的主机被当做managerworker节点想要加入到集群中来,但要不记得当时创建集群时的token,在manager主机上执行以下命令:

  docker swarm join-token manager
  docker swarm join-token worker

AVAILABILITY列的说明

  • Active 意味着调度程序可以将任务分配给节点。
  • Pause 意味着调度程序不会将新任务分配给节点,但现有任务仍在运行。
  • Drain 意味着调度程序不会向节点分配新任务。调度程序关闭所有现有任务并在可用节点上调度它们。

MANAGER STATUS列的说明
显示节点是属于manager或者worker

  • 没有值 表示不参与群管理的工作节点。
  • Leader 意味着该节点是使得群的所有群管理和编排决策的主要管理器节点。
  • Reachable 意味着节点是管理者节点正在参与Raft共识。如果领导节点不可用,则该节点有资格被选为新领导者。
  • Unavailable 意味着节点是不能与其他管理器通信的管理器。如果管理器节点不可用,您应该将新的管理器节点加入群集,或者将工作器节点升级为管理器。

升级或降级节点

您可以将工作程序节点提升为manager角色。这在管理器节点不可用或者您希望使管理器脱机以进行维护时很有用。 类似地,您可以将管理器节点降级为worker角色。
无论您升级或降级节点,您应该始终在群中维护奇数个管理器节点。
要升级一个节点或一组节点,请从管理器节点运行docker node promote

[root@gpu03 ~]# docker node promote hesangang
Node hesangang promoted to a manager in the swarm.
[root@gpu03 ~]# docker node ls
sflpfedy8d3qrbt4izkmezq2g *   gpu03               Ready               Active              Leader              19.03.2
7ngt13w56zcngcay50t6pt1r9     hesangang           Ready               Active              Reachable           19.03.8
ymqajb70b44me1dqwsr0ub3vg     ubuntu-zhzy         Ready               Active                                  19.03.4

要降级一个节点或一组节点,请从管理器节点运行docker node demote:

[root@gpu03 ~]# docker node demote hesangang
Manager hesangang demoted in the swarm.
[root@gpu03 ~]# docker node ls
sflpfedy8d3qrbt4izkmezq2g *   gpu03               Ready               Active              Leader              19.03.2
7ngt13w56zcngcay50t6pt1r9     hesangang           Ready               Active                                  19.03.8
ymqajb70b44me1dqwsr0ub3vg     ubuntu-zhzy         Ready               Active                                  19.03.4

创建自定义的overlay网络

docker network create --driver overlay --attachable --subnet 172.19.0.0/16 sg-net

查询swarm网络 docker network ls

[root@gpu03 ~]# docker network ls
NETWORK ID          NAME                            DRIVER              SCOPE
d0f2d68382d9        bridge                          bridge              local
b519d6da2092        docker_default                  bridge              local
ec949a93ee57        host                            host                local
kvt9ibn4tua4        ingress                         overlay             swarm
a93c3b19194a        none                            null                local
1fx2olvzn3os        sg-net                          overlay             swarm

基于swarm创建服务

先摘取docker镜像

docker pull nginx

执行命令创建service:

docker service create --name web --replicas 3 --network sg-net --publish 81:80 nginx

docker service create中的参数:

  • name 服务名
  • replicas 是创建的副本的数量
  • network 是使用的网络
  • publish 是服务公开的端口 :

查看web服务任务分配到的节点 docker service ps web

[root@gpu03 ~]# docker service ps web 
ID                  NAME                IMAGE                      NODE                         DESIRED STATE       CURRENT STATE                ERROR               PORTS
sv6y9jedbetw        web.1               nginx:latest               gpu03                        Running             Running about a minute ago                       
k26fewhj9lzq        web.2               nginx:latest               hesangang                    Running             Running about a minute ago                       
jnr2t0msnumy        web.3               nginx:latest               ubuntu-zhzy                  Running             Running 52 seconds ago           

外部访问公开端口81
http://10.168.103.151:80
http://10.168.103.152:80
http://10.168.103.153:80

Docker Swarm 常用命令

# 管理配置文件
docker config
    # 查看已创建配置文件
    - docker config ls
    # 将已有配置文件添加到docker配置文件中
    - docker config create docker 配置文件名 本地配置文件
 # 管理swarm节点
docker node
    # 查看集群中的节点
    - docker node ls
    # 将manager角色降级为worker
    - docker node demote 主机名
    # 将worker角色升级为manager
    - docker node promote 主机名
    # 查看节点的详细信息,默认json格式
    - docker node inspect 主机名
          # 查看节点信息平铺格式
          - docker node inspect --pretty 主机名
    # 查看运行的一个或多个及节点任务数,默认当前节点
    - docker node ps
    # 从swarm中删除一个节点
    - docker node rm 主机名
    # 更新一个节点
    - docker node update
          # 对节点设置状态(“active”正常|“pause”暂停|“drain”排除自身work任务)
          - docker node update --availability
 # 管理敏感数据存储
docker secret
# 服务栈,栈的形式,一般作为编排使用,格式与docker compose相同。
docker stack
    # 通过.yml文件指令部署
    - docker stack deploy -c 文件名.yml 编排服务名
    # 查看编排服务
    - docker stack ls
 docker stack 不支持使用参数
# 作为集群的管理
docker swarm
    # 初始化一个swarm
    - docker swarm init
          # 指定初始化ip地址节点
          - docker swarm init --advertise-addr 管理端IP地址
          # 去除本地之外的所有管理器身份
          - docker swarm init --force-new-cluster
    # 将节点加入swarm集群,两种加入模式manager与worker
    - docker swarm join
          # 工作节点加入管理节点需要通过join-token认证
          - docker swarm join-token
          # 重新获取docker获取初始化命令
          - docker swarm join-token worker
    # 离开swarm
    - docker swarm leave
    # 对swarm集群更新配置
    - docker swarm update
# 服务管理
docker service
    # 创建一个服务
    - docker service create
          # 创建的副本数
          - docker service create --replicas 副本数
          # 指定容器名称
          - docker service create --name 名字
          # 每次容器与容器之间的更新时间间隔。
          - docker service create --update-delay s秒
          # 更新时同时并行更新数量,默认1
          - docker service create --update-parallelism 个数
          # 任务容器更新失败时的模式,(“pause”停止|continue“继续),默认pause。
          - docker service create --update-failure-action 类型
          # 每次容器与容器之间的回滚时间间隔。
          - docker service create --rollback-monitor 20s
          # 回滚故障率如果小于百分比允许运行
          - docker service create --rollback-max-failure-ratio .数值(列“.2”为%20)
          # 添加网络
          - docker service create --network 网络名
          # 创建volume类型数据卷
          - docker service create --mount type=volume,src=volume名称,dst=容器目录
          # 创建bind读写目录挂载
          - docker service create --mount type=bind,src=宿主目录,dst=容器目录
          # 创建bind只读目录挂载
          - docker service create --mount type=bind,src=宿主目录,dst=容器目录,readonly
          # 创建dnsrr负载均衡模式
          - docker service create --endpoint-mode dnsrr 服务名
          # 创建docker配置文件到容器本地目录
          - docker service create --config source=docker配置文件,target=配置文件路径
          # 创建添加端口
          - docker service create --publish 暴露端口:容器端口 服务名
    # 查看服务详细信息,默认json格式
    - docker service inspect
          # 查看服务信息平铺形式
          - docker service inspect --pretty 服务名
    # 查看服务内输出
    - docker service logs
    # 列出服务
    - docker service ls
    # 列出服务任务信息
    - docker service ps    
          # 查看服务启动信息
          - docker service ps 服务名
          # 过滤只运行的任务信息
          - docker service ps -f "desired-state=running" 服务名
    # 删除服务
    - docker service rm
    # 缩容扩容服务
    - docker service scale
          # 扩展服务容器副本数量
          - docker service scale 服务名=副本数
    # 更新服务相关配置
    - docker service update
          # 容器加入指令
          - docker service update --args “指令” 服务名
          # 更新服务容器版本
          - docker service update --image 更新版本 服务名         
         # 回滚服务容器版本
         - docker service update --rollback 回滚服务名
          # 添加容器网络
          - docker service update --network-add 网络名 服务名
          # 删除容器网络
          - docker service update --network-rm 网络名 服务名
          # 服务添加暴露端口
          - docker service update --publish-add 暴露端口:容器端口 服务名
          # 移除暴露端口
          - docker service update --publish-rm 暴露端口:容器端口 服务名
          # 修改负载均衡模式为dnsrr
          - docker service update --endpoint-mode dnsrr 服务名
  • 初来乍到,写的不好请多指教。
  • 关注博主,敬请期待更多内容。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐