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

Fleur ·
更新时间:2024-11-13
· 869 次阅读

文章目录相关网站概念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架构

在这里插入图片描述

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:全局模式,在这种模式下,每个节点上仅运行一个副本 服务特性:扩容,缩容,针对的是复制模式下,部署数量的增多和减少 服务其他功能:升级镜像与回滚镜像
这种模式会部署期望数量的服务副本,并尽可能均匀地将各个副本分布在整个集群中。
在这里插入图片描述

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容器

实践过程 部署集群 由于本次实践,没有配置仓库,无法下载镜像,所以提前在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 swarm配置集群 创建集群,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 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. 查看集群信息 [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 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任务分布情况 修改各节点容器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内容 进行测试,因为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 根据官网指示,下载安装包,根据给定代码安装服务 [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 #服务具体任务 开启了9个容器,显示效果如下
在这里插入图片描述 停止容器node3的docker服务,容器数量仍然为9个,从node3漂移到了node1和node2上了
在这里插入图片描述 重启服务,容器并不回回切到nodn3上
在这里插入图片描述 服务中容器更新镜像 为了测试明显,本次更新由原来的ngnix更新为game2048镜像
由于没有配置仓库,镜像需要安装在node1、node2、node3每一个节点上 进行更新 [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 图像显示更新完成
在这里插入图片描述 更新完成访问game2048,效果达成。
在这里插入图片描述 容器镜像回滚 由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 回滚成功显示
在这里插入图片描述 回滚结果测试
在这里插入图片描述
作者:csdnlb



学习 swarm Docker

需要 登录 后方可回复, 如果你还没有账号请 注册新账号