Docker-学习总结(三剑客之Docker-swarm)

文章目录

  • 相关网站
  • 概念
  • swarm架构
  • 实践
    • 实践环境
    • 实践目的
    • 实践过程
      • 部署集群
      • 集群的容器的数量拉伸、缩减
      • 安装图形化容器visualizer
      • 服务中容器更新镜像
      • 容器镜像回滚

相关网站

  • Docker官方Swarm(目录):https://docs.docker.com/swarm/
  • Docker官方Swarm(概览):https://docs.docker.com/swarm/overview/
  • 图形化容器visualizer:https://github.com/dockersamples/docker-swarm-visualizer

概念

  • 容器编排:在现代开发当中,整体式的应用早已成为过去时,如今的应用由数十乃至数百个松散结合的容器式组件构成,而这些组件需要通过相互间的协同合作,才能使既定的应用按照设计运作。容器编排是指对单独组件和应用层的工作进行组织的流程。
  • 容器编排工具:Docker swarm mode(Docker公司)、Kubernetes(google公司)和Mesos(Mesosphere公司)
  • 单引擎(Single-Engine)模式:不包含在任何 Swarm集群 中的 Docker 节点,称为运行于单引擎(Single-Engine)模式
  • 集群swarm模式:通过使用命令docker swarm init,将本机节点由单引擎模式切换为swarm集群模式。
  • Docker提供了一个用于与Docker守护进程进行交互的API(称为Docker Engine API),以及Go和Python的SDK。 使用SDK,您可以快速轻松地构建和扩展Docker应用程序和解决方案。 如果Go或Python不适用于您,则可以直接使用Docker Engine API。
  • 在Docker生态系统中一共有3种API,这三种API都是依照REST标准:
    • Registry API:提供了与来存储Docker镜像的Docker Registry集成的功能。
    • Docker Hub API:提供了与Docker HUB集成的功能
    • Docker Remote API:提供与Docker守护进程进行集成的功能
  • Docker Swarm API主要是兼容Docker Remote API。Swarm API和Docker Engine API之间的还是有些区别的
  • Swarm是Docker公司在2014年12月初新发布的容器管理工具。和Swarm一起发布的Docker管理工具还有Machine以及Compose。
  • Swarm是一套较为简单的工具,用以管理Docker集群,使得Docker集群暴露给用户时相当于一个虚拟的整体。Swarm使用标准的 Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(dockerclient in go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用Go语言来完成开发,并且还处于一个Alpha版本,目前在github上发布的版本 仅有v0.1.0-rc1。然而Swarm的发展十分快速,功能和特性的变更迭代还非常频繁。因此,可以说Swarm还不推荐被用于生产环境中,但可以肯 定的是Swarm是一项很有前途的技术。
  • Swarm 安全机制:集群内置有繁多的安全机制,提供了开箱即用的合理的默认配置——如 CA 设置、接入 Token、公用 TLS、加密集群存储、加密网络、加密节点 ID 等。

swarm架构

Docker-学习总结(三剑客之Docker-swarm)_第1张图片

  • swarm 集群相关概念:

    • 节点:【node】:管理节点(manager)和工作节点(worker)构成
      • mananger:管理节点(manager)负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。同时负责接收来自docker client的命令反馈至woker中进行运行,同时负责节点与仓库进行镜像拉取,使用Docker swarm API进行交互,并且在创建集群时,Swarm会前往Docker Hub上内建的发现服务中获取一个全球唯一的token,用以唯一的标识Swarm管理的Docker集群
        • Discovery 模块:Swarm发现Docker集群中的节点。discovery是Swarm中用于维护Docker集群状态的机制。既然涉及到 发现节点(但是在发现之前必须先有注册(register))。Swarm中有专门负责发现(discovery)的模块,而关于注册 (register)部分,不同的discovery模式下,注册(register)也会有不同的形式。目前,Swarm中提供了5种不同的发现(discovery)机制:Node Discovery、File Discovery、Consul Discovery、EtcD Discovery和Zookeeper Discovery
        • Scheduler 模块:Swarm内部的调度模块,在被初始化后面,swarm通过发现机制发现所有注册的Docker Node,并收集到所有Docker Node的状态以及具体信息。此后,一旦Swarm接收到具体的Docker管理请求,Swarm需要对请求进行处理,并通过所有Docker Node的状态以及具体信息,来筛选(filter)决策到底哪些Docker Node满足要求,并通过一定的策略(strategy)将请求转发至具体的一个Docker Node
        • Swarm API模块:Swarm创建并初始化API监听服务模块后。从功能的角度来讲,可以将该模块抽象为Swarm Server。需要说明的是:虽然Swarm Server完全兼容Docker的API,但是有不少Docker的命令目前是不支持的,毕竟管理Docker集群与管理单独的Docker会有一些区 别。当Swarm Server被初始化并完成监听之后,用户即可以通过Docker Client向Swarm发送Docker集群的管理请求
      • worker:工作节点,即图中的swarm node,负责使用docker守护进程管理多个容器,负责运行相应的服务来执行任务(task)。
    • 任务:【task】是swarm集群中的最小调度单位,在swarm集群中就是一个单一容器。
    • 服务:【service】,是一组任务的集合,定义了任务的属性
      • 服务模式:复制(replicated) 和 全局(global)
        • replicated:复制模式,是服务的默认模式,这种模式会部署期望数量(Replicas参数)的服务副本,并尽可能均匀地将各个副本分布在整个集群中
        • global:全局模式,在这种模式下,每个节点上仅运行一个副本
      • 服务特性:扩容,缩容,针对的是复制模式下,部署数量的增多和减少
      • 服务其他功能:升级镜像与回滚镜像
        这种模式会部署期望数量的服务副本,并尽可能均匀地将各个副本分布在整个集群中。
        Docker-学习总结(三剑客之Docker-swarm)_第2张图片
  • swarm 流程:

    • 初始化 Swarm第一个管理节点
      • -> 加入额外的管理节点
        • -> 加入工作节点
          • -> 完成
  • swarm 管理节点高可用:

    • swarm内置HA:Swarm 实现了一种主从方式的多管理节点的 HA。管理节点可能有多个,但是仅有一个节点处于活动状态
    • Raft 算法:Swarm 使用了 Raft 共识算法的一种具体实现来支持管理节点的HA,部署管理节点应为奇数个,防止脑裂现象,同时建议不要部署太多管理节点(3-5为最佳)
    • 主节点:【leader】:通常处于活动状态的管理节点被称为“主节点”(leader),而主节点也是唯一一个会对 Swarm 发送控制命令的节点。也就是说,只有主节点才会变更配置,或发送任务到工作节点
    • 从节点:【follower】通常处于非活动状态的管理节点被称为“从节点”(follower),如果一个备用(非活动)管理节点接收到了 Swarm 命令,则它会将其转发给主节点

实践

实践环境

主机 IP 作用
node1 192.168.27.11 安装有Docker(18.09.6)
node2 192.168.27.12 安装有Docker(18.09.6)
node3 192.168.27.13 安装有Docker(18.09.6)

实践目的

通过swarm实现一个集群,拉伸,缩减节点,更新服务内容,并且在主控节点安装一个图像监控visualizer容器

实践过程

部署集群

  1. 由于本次实践,没有配置仓库,无法下载镜像,所以提前在node1、node2、node3中安装镜像ngnix,game2048,在node1中安装visualizer
[root@node1 images]# docker load -i ngnix.tar
[root@node1 images]# docker load -i game2048.tar
[root@node1 images]# docker load -i visualizer.tar

[root@node2 images]# docker load -i ngnix.tar
[root@node2 images]# docker load -i game2048.tar

[root@node3 images]# docker load -i ngnix.tar
[root@node3 images]# docker load -i game2048.tar
  1. swarm配置集群
    1. 创建集群,node1为manager身份
    [root@node1 ~]# docker swarm init
    Swarm initialized: current node (v4xx2txjkdysv6ke783820tcd) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-15suzdeu07c9l6uf0pk2up7a3j21evjlnczrg4t6bqekscvccn-4y9np7dcdmrjtklsybyc2zjsm 192.168.27.11:2377
    #以woork身份加入集群的命令,在其他需要加入集群的节点执行此命即可
    To add a manager to this swarm, run 'docker swarm join-token manager' andfollow the instructions.
    #开启swarm集群,node1为管理节点,上面提示中给出了join woker的方式,如果要以manager身份加入集群,查看join-token,命令docker swarm join-token manager
    
    1. node2与node3节点加入集群,以worker身份
    [root@node2 ~]# docker swarm join --token SWMTKN-1-15suzdeu07c9l6uf0pk2up7a3j21evjlnczrg4t6bqekscvccn-4y9np7dcdmrjtklsybyc2zjsm 192.168.27.11:2377
    This node joined a swarm as a worker.
    [root@node3 ~]# docker swarm join --token SWMTKN-1-15suzdeu07c9l6uf0pk2up7a3j21evjlnczrg4t6bqekscvccn-4y9np7dcdmrjtklsybyc2zjsm 192.168.27.11:2377
    This node joined a swarm as a worker.
    
    1. 查看集群信息
    [root@node1 images]# docker node ls
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    v4xx2txjkdysv6ke783820tcd *   node1               Ready               Active              Leader              18.09.6
    mv238rores67ue8bc3nocfb6h     node2               Ready               Active                                  18.09.6
    iiu8b0tw4bzsf848smjrc7r6c     node3               Ready               Active                                  18.09.6
    
  2. swarm配置服务
[root@node1 images]# docker service create -p 80:80 --replicas 3 --name web_cluster nginx
image nginx:latest could not be accessed on a registry to record
its digest. Each node will access nginx:latest independently,
possibly leading to different nodes running different
versions of the image.
#因为没有使用仓库,报错提示,不影响试验
sb8uuq2ekxghlv8qzlg5csm0j
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
#服务建立过程
[root@node1 images]# docker service ls
ID                  NAME                MODE                REPLICAS      IMAGE               PORTS
sb8uuq2ekxgh        web_cluster         replicated          3/3      nginx:latest        *:80->80/tcp
#查服务是否建立
[root@node1 images]# docker service ps web_cluster
ID                  NAME                IMAGE               NODE      DESIRED STATE       CURRENT STATE                    ERROR     PORTS
qz72v7tujl8r        web_cluster.1       nginx:latest        node3      Running             Running less than a second ago
xa75noxnlsqt        web_cluster.2       nginx:latest        node1      Running             Running 42 seconds ago
ytdr9mg6nu5n        web_cluster.3       nginx:latest        node2      Running             Running 44 seconds ago
#查看建立的服务web_cluster,中具体的task任务分布情况
  1. 修改各节点容器ngnix的访问页面,进行测试
    容器是自动生成的,所以命名随机,需要查看,才能修改容器内容
[root@node1 images]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS
f0870e291b8c        nginx:latest        "nginx -g 'daemon of…"   13 minutes ago      Up 13 minutes       80/tcp
#查看容器ID
[root@node1 images]# echo node1 > index.html
[root@node1 images]# docker cp index.html 
f0870e291b8c :/usr/share/nginx/html/index.html
#修改index内容

[root@node2 opt]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS
999072a92b00        nginx:latest        "nginx -g 'daemon of…"   15 minutes ago      Up 14 minutes       80/tcp
#查看容器ID
[root@node2 opt]# echo node2 > index.html
[root@node2 opt]# docker cp index.html 999072a92b00:/usr/share/nginx/html/index.html
#修改index内容

[root@node3 opt]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS
a0be23d3551a        nginx:latest        "nginx -g 'daemon of…"   18 minutes ago      Up 18 minutes       80/tcpluster.1.qz72v7tujl8r11dzebb7i0ccc
#查看容器ID
[root@node3 opt]# echo node3 > index.html
[root@node3 opt]# docker cp index.html a0be23d3551a:/usr/share/nginx/html/index.html
#修改index内容
  1. 进行测试,因为swarm是分布式的,访问任意几点,均可以实现web功能,所以分别针对node1、node2、node3的地址进行访问
[root@node1 images]# for i in {1..10};do curl 192.168.27.11;done
node2
node3
node1
node2
node3
node1
node2
node3
node1
node2
[root@node1 images]# for i in {1..10};do curl 192.168.27.12;done
node3
node1
node2
node3
node1
node2
node3
node1
node2
node3
[root@node1 images]# for i in {1..10};do curl 192.168.27.13;done
node1
node2
node3
node1
node2
node3
node1
node2
node3
node1

集群的容器的数量拉伸、缩减

[root@node1 images]# docker service scale web_cluster=6
web_cluster scaled to 6
overall progress: 6 out of 6 tasks
1/6: running
2/6: running
3/6: running
4/6: running
5/6: running
6/6: running
verify: Service converged
[root@node1 images]# docker service ps web_cluster
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                    ERROR               PORTS
qz72v7tujl8r        web_cluster.1       nginx:latest        node3               Running             Running less than a second ago
x9jpdjbdq5r7        web_cluster.2       nginx:latest        node1               Running             Running 10 minutes ago
ytdr9mg6nu5n        web_cluster.3       nginx:latest        node2               Running             Running 13 minutes ago
u1j1romoes7c        web_cluster.4       nginx:latest        node1               Running             Running 8seconds ago
jy78pio77yoe        web_cluster.5       nginx:latest        node3               Running             Running less than a second ago
1rpve5ncf7l9        web_cluster.6       nginx:latest        node2               Running             Running 9seconds ago
[root@node1 images]# docker service scale web_cluster=4
web_cluster scaled to 4
overall progress: 4 out of 4 tasks
1/4: running
2/4: running
3/4: running
4/4: running
verify: Service converged
[root@node1 images]# docker service ps web_cluster
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                    ERROR               PORTS
qz72v7tujl8r        web_cluster.1       nginx:latest        node3               Running             Running less than a second ago
x9jpdjbdq5r7        web_cluster.2       nginx:latest        node1               Running             Running 12 minutes ago
ytdr9mg6nu5n        web_cluster.3       nginx:latest        node2               Running             Running 14 minutes ago
u1j1romoes7c        web_cluster.4       nginx:latest        node1               Running             Running about a minute ago

安装图形化容器visualizer

  1. 根据官网指示,下载安装包,根据给定代码安装服务
[root@node1 images]# docker service create   --name=viz   --publish=8080:8080/tcp   --constraint=node.nager   --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock   dockersamples/visualizer
image dockersamples/visualizer:latest could not be accessed on a registry to record
its digest. Each node will access dockersamples/visualizer:latest independently,
possibly leading to different nodes running different
versions of the image.

uusdr62myrnopa7zf44io3obp
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged
[root@node1 images]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE             PORTS
uusdr62myrno        viz                 replicated          1/1                 dockersamples/visualizer:latest   *:8080->8080/tcp
sb8uuq2ekxgh        web_cluster         replicated          9/9                 nginx:latest             *:80->80/tcp
#服务显示,viz创建
[root@node1 images]# docker service ps viz
ID                  NAME                IMAGE                             NODE                DESIRED    CURRENT STATE           ERROR               PORTS
bupr51oo05yn        viz.1               dockersamples/visualizer:latest   node1               Running    Running 2 minutes ago
#服务具体任务
  1. 开启了9个容器,显示效果如下
    Docker-学习总结(三剑客之Docker-swarm)_第3张图片
  2. 停止容器node3的docker服务,容器数量仍然为9个,从node3漂移到了node1和node2上了
    Docker-学习总结(三剑客之Docker-swarm)_第4张图片
  3. 重启服务,容器并不回回切到nodn3上
    Docker-学习总结(三剑客之Docker-swarm)_第5张图片

服务中容器更新镜像

  1. 为了测试明显,本次更新由原来的ngnix更新为game2048镜像
    由于没有配置仓库,镜像需要安装在node1、node2、node3每一个节点上
  2. 进行更新
[root@node1 images]# docker service update --image game2048 --update-delay 5s --update-parallelism 5 web_cluster
#docker service update 更新命令
#--image 更新镜像
#--update-parallelism 5 每次更新容器并行运行的数量,本次设置为5个,也就是每一批更新5个
#--update-delay	5s	每批次更新容器之间的时间间隔,本次设置为5秒
image game2048:latest could not be accessed on a registry to record
its digest. Each node will access game2048:latest independently,
possibly leading to different nodes running different
versions of the image.

web_cluster
overall progress: 9 out of 9 tasks
1/9: running
2/9: running
3/9: running
4/9: running
5/9: running
6/9: running
7/9: running
8/9: running
9/9: running
verify: Service converged

  1. 图像显示更新完成
    Docker-学习总结(三剑客之Docker-swarm)_第6张图片
  2. 更新完成访问game2048,效果达成。
    Docker-学习总结(三剑客之Docker-swarm)_第7张图片

容器镜像回滚

  1. 由game2048回滚到之前的ngnix
[root@node1 images]# docker service update --image nginx --rollback-parallelism 3 --rollback-delay 2s web_cluster
#docker service update 回滚也属于更新命令下的选项
#--rollback-parallelism 每一批回滚容器的个数,与更新一样
#--rollback-delay 每批次回滚容器之间的时间间隔,与更新一样
image nginx:latest could not be accessed on a registry to record
its digest. Each node will access nginx:latest independently,
possibly leading to different nodes running different
versions of the image.

web_cluster
overall progress: 9 out of 9 tasks
1/9: running
2/9: running
3/9: running
4/9: running
5/9: running
6/9: running
7/9: running
8/9: running
9/9: running
verify: Service converged

  1. 回滚成功显示
    Docker-学习总结(三剑客之Docker-swarm)_第8张图片
  2. 回滚结果测试
    Docker-学习总结(三剑客之Docker-swarm)_第9张图片

你可能感兴趣的:(Linux运维-企业实战,Docker)