一、Docker Swarm
简介:
1、Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。
2、Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具,Swarm可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。
3、Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。
优点:
1、任何规模都有高性能表现、灵活的容器调度、服务的持续可用性;
2、和 Docker API 及整合支持的兼容性;
3、Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持。
相关概念:
节点分为管理 (manager) 节点和工作 (worker) 节点;
任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器;
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。
1.实验环境部署
首先server1关闭上个实验环境
后台开启harbor
新创建虚拟机server4,用于后续部署为swarm集群中的一个节点;
(之后server4编写docker.repo仓库指向文件,安装启动docker)
之前server1已经给了server2/3做了免密通信,现在对server4实现免密登陆远程主机
为了使server3/4可以访问到仓库地址,将server1 /etc/docker 的 daemon.json文件传给server3/4(server2之前已经配置好了)
server1发送证书文件
然后server3/4都重启docker,docker info可以查看到仓库地址
server3/4加入仓库的地址解析
2.Docker Swarm实践
由于server1上有harbor仓库,因此让 server2 创建 Swarm 集群(作为manager)
docker swarm init:初始化集群,根据提示在其他docker节点上执行命令
server3/4加入集群
查看swarm集群节点,可以看到server2是leader
将真机的myapp.tar传给server1,后续实验需要
导入镜像(两个版本),修改标签为仓库中的library项目
上传至仓库
上传成功
创建集群服务,命名为webservice,物理机的80端口映射到容器内的80端口,副本数量为3,使用myapp:v1镜像;
查看服务是否运行;
在server3/4上可以看到容器已经运行起来了
测试,可以看到访问的服务自动负载均衡,因为刚才 开启三个节点,所以负载均衡每三次是一个循环
弹性伸缩:扩充服务的数量为6,平均的分布在三个服务器上
可以看到访问的服务自动负载均衡,六个结点
访问server2,3,4哪个IP都可以看到
3.Docker Swarm监控
先将上面的实验清理,删除所创建的集群服务
真机将虚拟化工具的tar包传给server1
server1导入visualizer镜像,修改标签为仓库library中,并上传镜像到仓库
创建服务,–replicas :设置启动的示例数为6 (副本6个)
创建监控,名字叫viz,8080端口映射到8080
网页访问监控visualizer,映射端口到主机的8080,可以看到六个服务,一个监控
扩容到20个
把原来的v1更新为v2,parallelism参数表示一次五个;delay参数是表示每隔5秒更新一次
查看
查看日志
测试访问,版本为v2
回滚到v1版本,默认是一个一个回滚
回滚到v1
二、docker stack部署
基于 Docker Swarm 之上来完成应用的部署,面向大规模场景下的多服务部署和管理。
docker stack与docker-compose的区别:
1、Docker stack不支持“build”指令,它是需要镜像是预先已经构建好的, 所以docker-compose更适合于开发场景;Docker Compose是一个Python项目,使用Docker API规范来操作容器。
2、Docker Stack功能包含在Docker引擎中,是swarm mode的一部分,Docker stack不支持基于第2版写的docker-compose.yml ,也就是version版本至少为3。然而Docker Compose对版本为2和3的 文件仍然可以处理;
3、docker stack把docker compose的所有工作都做完了,因此docker stack将占主导地位。
docker stack相关命令:
在前面的操作中,我们采用命令行的方式建立了swarm集群,但是这样的操作比较麻烦,可以编写脚本自动创建;
删除上面的实验环境
编写docker-compose脚本
[root@server2 ~]# cat docker-compose.yml
version: "3.8"
services:
web:
image: myapp:v1
ports:
- "80:80" %端口映射,主机80映射容器80
networks:
- webnet %网络接口为webnet
deploy:
replicas: 6 %副本数量为6
update_config:
parallelism: 2 %每次更新的数量为2
delay: 5s %更新时间间隔
restart_policy:
condition: on-failure
visualizer:
image: visualizer:latest
ports:
- "8080:8080" %监控端口为主机映射8080到容器的8080
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints:
- "node.role==manager"
networks:
webnet:
使用脚本部署集群,名为mycluster;
查看stack进程:六个节点已经成功拉起
页面查看
修改脚本,扩容为60个
重新执行脚本
查看页面监控
再次修改脚本将镜像改为v2时
就会实现滚动更新
查看监控,发现开始逐渐变化为v2
查看到原来的v1也在,这是为了便于回滚
swarm集群在创建成功时会自动添加虚拟网卡
三、Portainer可视化
在前面的操作中,我们采用命令行的方式建立了swarm集群,接着为swarm集群管理添加图形化管理界面;
为了更好的区分,在仓库中新建一个项目portainer
导入镜像,修改标签,上传到仓库的portainer项目中
将portainer-agent-stack.yml文件传给server2
version: '3.2'
services:
agent:
image: portainer/agent
environment:
# REQUIRED: Should be equal to the service name prefixed by "tasks." when
# deployed inside an overlay network
AGENT_CLUSTER_ADDR: tasks.agent
# AGENT_PORT: 9001
# LOG_LEVEL: debug
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
networks:
- agent_network
deploy:
mode: global
placement:
constraints: [node.platform.os == linux]
portainer:
image: portainer/portainer
command: -H tcp://tasks.agent:9001 --tlsskipverify
ports:
- "9000:9000"
volumes:
- portainer_data:/data
networks:
- agent_network
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
networks:
agent_network:
driver: overlay
attachable: true
volumes:
portainer_data:
在server2上执行脚本,查看portainer开启了9000端口
网页访问进入图形界面(设置两次密码)
即可进入管理界面
scale修改数字,直接就可以扩/缩容,修改启动的示例数为6
然后展开看到只剩6个
查看监控
添加仓库信息
仓库中已有镜像game2048
权限访问打开
添加service,选择刚才创建的仓库名,添加服务game2048,8000端口映射为80
可以看见服务创建成功
因为刚才设置端口映射为8000,所以访问serve2的8000端口:
172.25.36.2:8000
由于server2/3/4是一个集群,也可以访问172.25.36.3:8000或者172.25.36.4:8000
实验完毕,关闭并离开集群,worker主机输入docker swarm leave
manager主机 输入docker swarm leave --force