Docker Swarm 是 Docker 官方自带的容器编排工具,Swarm,Compose,Machine 合称 Docker 三剑客。Docker Swarm 对于中小型应用来说,还是比较方便,灵活,当然 K8S 对于大型项目在各方面有着明显的优势。技术选型需要针对公司实际情况选择,架构往往是一步一步随着业务变化升级演变而来,本文主要讲解 Docker Swarm + Harbor + Portainer 一套组合拳打法。
flowchart TB subgraph Harbor["Harbor (镜像仓库)"] H_Registry["镜像存储"] H_Webhook["Webhook 触发器"] end subgraph Portainer["Portainer (可视化管理)"] P_UI["Web UI 界面"] P_API["API 接口"] P_Manager["集群管理"] end subgraph Swarm["Docker Swarm (容器编排)"] Manager["管理节点"] Worker1["工作节点 1"] Worker2["工作节点 2"] Worker3["工作节点 3"] Manager --> Worker1 Manager --> Worker2 Manager --> Worker3 end Developer["开发人员"] -->|推送镜像| H_Registry H_Registry -->|镜像拉取| Swarm H_Webhook -->|触发更新| P_API P_Manager -->|管理| Swarm P_UI -->|操作| P_Manager
前置条件
安装Docker:Docker 安装,常用命令
安装Harbor:harbor 搭建和部署
安装Portainer:portainer安装,配置,使用
Docker Swarm 集群
Docker Swarm 是 Docker 的集群管理工具,Swarm 集群的节点分两种:管理节点(manager node),工作节点(work node),两者的主要区别是对集群进行管理需要在管理节点上进行操作,包括集群创建,配置,服务创建,配置等有关工作。除此之后两者没有区别,管理节点和工作节点一样会运行 contarner。
集群初始化
首先我们准备一台虚拟主机安装 docker,然后初始化集群:
docker swarm init
此时当前虚拟机就成功被始化为集群管理节点,我们通过以下命令获取加入集群的代码,这命令仅能在管理节点上使用:
docker swarm join-token worker
命令执行完后,我们将得到类似:docker swarm join —token SWMTKN-1-4omm72rws6flf5icom3w1clqvjtkmwdki8m4hhtxobq3hzwsqe-7vjw75ebdue32yevwirggpk4l 192.168.3.70:2377 的结果,将 command 复制到其它虚拟机(己安装 docker)执行,该虚拟机将以工作节点(worker)的身份加入集群。重复执行再添加三个工作节点,便可以得到上述截图四台虚拟机组成的 docker swarm 集群。
至此 docker swarm 集群搭建就完成了,是不是非常简单方便。所以说针对中小型应用,docker swarm 有着非常小的学习,管理的成本,很合适。下面贴出常用的 docker swarm 集群管理命令:
docker swarm init //docker swarm initdocker swarm join-token worker //查看加入woker的命令。docker swarm join-token manager //查看加入manager的命令docker swarm join //加入集群docker swarm leave //退出集群 docker node ls //查看集群节点docker node rm //删除某个节点(-f强制删除)docker node inspect //查看节点详情docker node demote //节点降级docker node promote //节点升级docker node update //更新节点
集群服务
创建集群之后便是创建服务,也就是一个集群可以包括多个服务,也就意味上可以在一个集群上部署多个项目,创建服务的时候我们就不需要再对节点进行管理,节点的管理归属集群管理。也就是说创建服务是基于当前集群的节点进行部署,当你需要扩展节点的时候,需要先将节点加入集群,然后再更新服务配置。
docker service create --name testweb --replicas 4 -p 80:80 webapplication2:latest
上面命令是创建一个名称为:testweb 的服务。replicas(副本数)为:4,我们集群节点也刚好 4 个,就是说每一个节点都会有一个副本,假如 replicas 为 2,那么我们的集群将有两个节点部署副本,剩余两个节点闲置,当然我们也可以通过更新命令重置 replicas 数量。端口映射为 80:80,镜像及版本是 webapplication2:latest。
至此服务也正式启动了,无论我们从四个节点那个 IP 进行访问,都是可以成功访问到网站。
下面是管理服务常用的命令:
docker service create //创建服务docker service ls //查看所有服务docker service inspect //查看详情docker service logs //查看服务日志docker service rm //删除服务docker service scale //设置服务副本数量docker service update //更新服务配置
注意:设置时区需要使用 TZ,而不是 TimeZone,否则不生效。
Portainer - 管理
手动管理 docker swarm 集群是有点繁琐,以服务创建和更新镜像为例,你需要事先在每个节点上面拉取最新的镜像,docker swarm 在创建服务或更新服务的时候不会主动从仓库中拉取或更新镜像,如果节点或服务多的时候就蛋痛了。一个良好的管理工具就事半功倍来解放你的双手提高工作效率了。安装好 Portainer 之后我们配置接入管理 docker swarm:
API 连接方式,需要配置远程 dcoker 节点,dcoker 管理节点编辑配置文件,配置完之后,重启一下 docker。
vi /usr/lib/systemd/system/docker.service
管理节点重启之后,Portainer 就可以通过 API 连接并且进行管理,可以看到连接的管理节点。
Portainer 连接上之后可以轻松管理 docker swarm,具体的细节自己摸索一下之后基本就可以拿捏了。简单创建一个服务,填写下面红色框架必填值就可以快速默认值创建一个服务。
自行摸搜一下你会发现 Portainer 管理非常方便,无论是创建服务,更新镜像,Portainer 会自动帮你拉取最新镜像然后更新,UI 动动鼠标就可以管理 docker swarm 集群。
Harbor - 自部化部署
配合 Harbor 的 Webhooks,我们可以实现推送镜像之后实现自动化部署。我们创建服务的时候将上图的绿色框开关打开就支持 Webhooks 通知 Portainer , 然后 docker swarm 集群更新,当然这个是 Portainer 的功能而不是 docker swarm 自带的功能。
我们进入事先部署的 harbor 系统,进入项目管理配置 webhooks,配置成功之后就可以实现自动化部署了。
OK,我们简单总结一下自动化部署流程,开发人员打包镜像送到至仓库,仓库配置”Artifact pushed”事件,在这个事件中配置 Webhooks 地址,然后 harbor 会自动触发提交这个地址通知至 Portainer,Portainer 开始执行更新集群镜像工作。docker swarm 默认值在更新中会提断不间断服务,可以放心进行更新,也支持更新后回滚。
高可用
docker swarm 实现高可用性机制来确保集群的稳定性和可靠性。
- Manager 节点高可用:Docker Swarm 集群中有一个或多个 Swarm Manager 节点,它们协调集群中的容器调度和管理。
- 节点监测:Swarm Manager 定期监测集群中的节点状态。
- 服务冗余和复制:Docker Swarm 通过创建服务副本来提供容器的冗余和高可用性。可以指定服务的副本数量,并将它们分布在集群的不同节点上。如果某个节点失效,Swarm Manager 会自动将该节点上的任务重新分配到其他可用节点上的副本。
- 负载均衡:Docker Swarm 集群可以通过内置的负载均衡机制来分发流量到运行在不同节点上的容器副本。这样,即使某个节点失效,负载均衡机制仍然可以将流量转发到其他节点上的容器副本,确保应用程序的连续可用性。
- 故障恢复:如果一个节点失效并重新加入集群,Swarm Manager 会自动将该节点重新纳入集群,并分配之前节点上的任务。这种故障恢复机制确保了集群的稳定性和容错性。
高伸缩
系统的伸缩性是指系统性能扩大或扩小的容易程度,一个高伸缩的系统可以轻易的扩展或减少集群性能。
- Docker Swarm 支持使用更新命令设置服务的副本数量来扩展副本,需要注意是当副本的数量>集群节点的数量的时候,再增加副本数对服务的性能提升意义,应该增加集群节点。
- Docker Swarm 支持自动扩展副本数,可以设置基于 CPU,内存等指标数的阈值来设置规则自动增加副本数。
- 当增加副本数无法有效扩展性能时,可以通过命令增加集群节点,让更多的机器加入集群以增加集群算力提高性能。