目录
一、Docker Swarm简介
二、Docker Swarm部署实践
三、监控Swarm集群
四、使用脚本创建集群
一、Docker Swarm简介
- Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。
- Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。
- Swarm可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。
- Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。
Docker三剑客Docker machine、Docker compose、Docker Swarm中,只有Docker Swarm不需要额外安装,它是Docker中一个内嵌的子命令模块,相较于k8s更加轻量级,但应用于生产环境还存在一些问题。
Docker Swarm 优点:
- 任何规模都有高性能表现
- 灵活的容器调度
- 服务的持续可用性
- 和 Docker API 及整合支持的兼容性
- Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持。
Docker Swarm 相关概念:
- 节点分为管理 (manager) 节点和工作 (worker) 节点
- 任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
- 服务 (Services) 是指一组任务的集合,服务定义了任务的属性。
二、Docker Swarm部署实践
实验环境:四台虚拟机,test1中部署了Habbor仓库,test2初始化一个swarm集群部署swarm管理节点,在test3、4部署swarm工作节点
准备工作:(开启harbor仓库,安装docker-ce,拉取myapp镜像,配置镜像源为harbor仓库)
(1)由于test4是新创建的虚拟机,我们要将其部署为swarm集群中的一个节点,所以需要将test3上的docker源指向文件复制给test4,为test4配置docker源,安装docker-ce
(2)test1中部署了Habbor仓库,test2、3、4在做swarm集群部署时,从test1中拉取镜像,为了后续配置,这里为test1和test4做免密传输(test2、3之前做过)
(3)打开test3,4的地址转发
在test3,4上刷新内核文件,读取添加的文件
(4)由于habbor仓库做了认证,所以我们需要把test1中的认证证书复制给test2、3、4,test2、3、4才能从仓库中拉取镜像(test2在之前的实验中已经复制了证书,故此处我直接从test2复制给test3,4)
将test2之前部署过的docker镜像仓库指向文件也复制给test3、4
重载test3、4的docker服务
(5)为test3、4配置test1中habbor仓库的域名地址解析 (test2已做过解析)
(6)在habbor目录下开启docker-compose服务并打入后台运行
(7)在harbor仓库中关闭内容信任功能
(8)在test1中拉取myapp:v1和myapp:v2并上传到harbor仓库中
集群部署:test2初始化一个swarm集群部署swarm管理节点,在test3、4部署swarm工作节点
(1)在test2初始化一个swarm集群,部署swarm管理节点
(2)在test3、4部署swarm工作节点
此时在test2可以看到swarm集群的所有节点,test2为leader
(3)在test2管理节点可以创建服务,使用–replicas指定创建三个副本(注意:一定要做端口映射,否则外网无法访问容器),此时查看服务可以看到三个swarm节点上各有一个副本服务(在生产环境中master尽量不要参与到负载均衡中,只负责调度)
docker service create --name webcluster -p 80:80 --replicas 3 myapp:v1
(4)此时在test1上连续访问terst2、3、4中的任一swarm节点,都可以看到三个副本容器自动进行了负载均衡
(5)这里还可以对服务副本数量进行扩充(规定扩至多少个)
docker service scale webcluster=6
测试访问,可以看到6个副本容器自动进行了负载均衡
三、监控Swarm集群
(1)监控服务需要由visualizer来提供,在test1中拉取dockersamples/visualizer:stable并上传到harbor仓库中
docker pull dockersamples/visualizer:stable
docker tag dockersamples/visualizer:stable reg.westos.org/library/visualizer:latest
docker push reg.westos.org/library/visualizer:latest
(2)在test2中创建监控,指定名字是viz,公开8080端口
docker service create \
--name=viz \
--publish=8080:8080/tcp \
--constraint=node.role==manager \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
visualizer
(3)访问172.25.73.2:8080,页面显示6个web服务和一个我们刚才创建的监控viz
(4)将服务副本数量扩充到10个,再次访问172.25.73.2:8080,可以看到10个web服务和1个监控
(5)把原来的v1镜像更新为v2镜像
docker service update --image myapp:v2 --update-parallelism 2 --update-delay 5s webcluster
–update-parallelism:表示一次更新几个节点,这里指定一次更新2个
–update-delay:表示每几秒更新一次,这里指定每隔5秒更新一次
(6)如果版本更新后需要回滚,可以使用如图命令,默认一次回滚一个节点
docker service rollback webcluster
四、使用脚本创建集群
通过命令行的方式创建集群效率比较低,我们可以通过编写脚本来快速创建集群
(1)删除之前的实验环境
(2)在test2的家目录编写webcluster.yml
version: "3.9"
services:
webcluster:
image: myapp:v2
ports:
- "80:80"
deploy:
replicas: 6
update_config:
parallelism: 2
delay: 5s
restart_policy:
condition: on-failure
visualizer:
image: visualizer
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints:
- "node.role==manager"
(3)编写好webcluster.yml文件后,在当前目录下部署集群
docker stack deploy web -c webcluster.yml
查看该集群,可以看到我们在yml配置文件中配置的6个副本
查看监控
(4)修改脚本,扩充到12个副本
执行脚本
查看监控
(5)修改脚本,将v2版本更新为v1
执行脚本
查看监控,可看到版本变为v1