一、前言
Docker Swarm是Docker官方提供的容器集群管理以及容器编排解决方案,Docker Swarm基于Docker Compose组件以及网络等基础能力,提供了服务编排、负载均衡、动态伸缩、滚动更新等能力,本文ken.io主要介绍Docker Swarm基本概念、集群搭建与基础使用~
1、本文主要内容
- Docker Swarm基本概念
- Docker Swarm集群搭建
- Docker Swarm集群管理
- Docker Swarm基础使用
2、本文环境信息
环境 | 说明 |
---|---|
Docker | Docker CE 23.0.1 |
Linux Server | CentOS 7.x |
Golang | 1.20 |
Windows | Windows 11 |
curl for Windows | 7.87 |
3、前置知识
二、Docker Swarm基本概念
1、Docker Swarm 节点介绍
Docker Swarm一共有两种节点:管理节点(Manager Node) 和工作节点 (Worker Node)
- 管理节点(Manager Node):用于Swarm集群的管理,Manager节点可以有1个或者多个,通常由3个以上的奇数Manger节点构成Manager集群,Manager节点中的主节点(Leader节点)选举通过Raft协议实现
- 工作节点(Worker Node):用于执行Manager节点下发的任务:部署服务、扩容服务、更新服务等等
管理节点本身也是工作节点,在测试时可以不做区分,不过在生产环境可以通过deploy相关参数指定服务部署的节点类型
2、Docker Swarm服务和任务介绍
服务(Service):一个应用(镜像)的一个或者多个容器实例的统称,也可以说是一组任务的统称
任务(Task):服务的一个容器实例,是构成服务的最小逻辑单元
3、Docker Swarm 网络介绍
Docker Swarm集群创建时会初始化一个名为ingress的overlay类型的网络,用于管理管理和路由在Docker Swarm集群中运行的服务的入口流量。通过ingress网络,可以将外部请求路由到Docker Swarm集群中的服务,对于部署了多个实例(任务)的服务,ingress网络中的load balancer提供了负载均衡的能力,支持轮询、源IP哈希等负载均衡策略,另外Docker Swarm也通过ingress网络打通了不同节点部署的容器之间的网络访问
三、Docker Swarm集群部署
1、环境准备
准备3-5台虚拟机,其中1-3台为管理节点,2台为工作节点
Docker Swarm集群有1个Manager节点也能满足基本要求,为了Manager节点高可用可以部署3个及以上的奇数节点
机器名 | IP | 必要 | 操作系统 | 环境信息 |
---|---|---|---|---|
swarm-manager-01 | 192.168.99.131 | 是 | openEuler 22.03 LTS /CentOS 7 | Docker CE 23.0.1 |
swarm-manager-02 | 192.168.99.132 | 否 | openEuler 22.03 LTS /CentOS 7 | Docker CE 23.0.1 |
swarm-manager-03 | 192.168.99.133 | 否 | openEuler 22.03 LTS /CentOS 7 | Docker CE 23.0.1 |
swarm-worker-01 | 192.168.99.141 | 是 | openEuler 22.03 LTS /CentOS 7 | Docker CE 23.0.1 |
swarm-worker-02 | 192.168.99.142 | 是 | openEuler 22.03 LTS /CentOS 7 | Docker CE 23.0.1 |
参考Docker入门:Docker安装与基本使用 - Ken的杂谈在各个节点上安装Docker
为了方便后续测试,请开放以下端口
- 2377 用于与管理节点之间进行通信(TCP)
- 7946 用于overlay网络节点发现(TCP&UDP)
- 4789 用于overlay网络节通信(TCP)
- 8000 用于部署服务测试(TCP)
firewalld-cmd --add-port=2377/tcp --permanent
firewalld-cmd --add-port=7946/tcp --permanent
firewalld-cmd --add-port=7946/udp --permanent
firewalld-cmd --add-port=4789/tcp --permanent
firewalld-cmd --add-port=8000/tcp --permanent
firewalld-cmd --reload
或者选择关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
2、 初始化Swarm集群
在swarm-manager-01节点上执行初始化命令
# 初始化
docker swarm init
# 输出示例
Swarm initialized: current node (1dayw2jss8e7pseq1dxaufo7s) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0dm85ix64fa5j62hricif97kds21jj4aharkoqfuzfw22n10mc-9tlq05a1xafxnqtujj94t288k 10.0.10.131:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
如果服务器有多个网卡,可以在初始化时手动指定IP
docker swarm init --advertise-addr 10.0.10.131
初始化之后,当前节点就默认成了管理节点,初始化成功后,会给出加入Swarm集群的命令信息 docker swarm join ……
默认给出的命令使用的是以Worker节点加入集群的的Token,可以通过明明获取Manager节点的命令&Token
# 获取Manager节点加入命令
docker swarm join-token manager
# 获取Worker节点加入命令
docker swarm join-token worker
3、节点加入
在swarm-manager-02、swarm-manager-03节点执行以下命令,作为Manager节点加入Swarm集群
# Manager节点加入命令
docker swarm join --token SWMTKN-1-0dm85ix64fa5j62hricif97kds21jj4aharkoqfuzfw22n10mc-880wdvlcnwgaa0n1jb5b326yr 10.0.10.131:2377
Manager节点只有1个也可以管理整个Swarm集群,是否增加信的Swarm节点,根据自己情况决定
在swarm-worker-01、swarm-worker-02节点执行以下命令,作为Worker节点加入Swarm集群
# Worker节点加入命令
docker swarm join --token SWMTKN-1-0dm85ix64fa5j62hricif97kds21jj4aharkoqfuzfw22n10mc-9tlq05a1xafxnqtujj94t288k 10.0.10.131:2377
三、Docker Swarm部署测试
Docker Swarm服务可以通过命令进行管理,管理命令如非专门说明,默认在Manager节点执行
1、部署服务
在Docker入门文章:构建支持多系统架构的Docker镜像 中有相关的测试代码已经制作镜像上传到了Docker Hub,这里可以用来做Docker Swarm的服务部署测试
# 拉取镜像
docker pull kentalk/helloworld
# 创建服务
docker service create --replicas 1 --name myhello -p 8000:8000 kentalk/helloworld
# 输出示例
bqxt6xxust47q9fhkcf0g48tf
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
2、查看服务
# 查看所有已部署服务
docker service ls
# 输出示例
ID NAME MODE REPLICAS IMAGE PORTS
bqxt6xxust47 myhello replicated 1/1 kentalk/helloworld:latest *:8000->8000/tcp
# 查看指定服务包含的实例(任务)
docker service ps myhello
# 输出示例
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
d1tffihdrsnt myhello.1 kentalk/helloworld:latest swarm-manager-01 Running Running 2 hours ago
# 查看服务详情
docker service inspect myhello
docker service inspect --pretty myhello
3、访问服务
Docker Swarm内置了load balancer,访问Docker Swarm集群任意节点都可以访问到该服务
curl 192.168.99.131:8000
curl 192.168.99.141:8000
#输出示例
Hello, World! ---ken.io
OS:linux/arm64,Host:b0fd349db829,IP:10.0.0.7,172.18.0.3
从返回的HostName可以看出,无论是通过哪个节点访问,都是经过load balancer转发到了具体的容器上,返回的HostName是不变的
4、扩缩容服务
# 由于测试镜像较大,如果网络不稳定,可以在扩容前先在各个节点把镜像拉取完整,再执行扩容
docker pull kentalk/helloworld
# 把myhello服务扩容至3个实例(任务)
docker service scale myhello=3
# 输出示例
myhello scaled to 3
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
# 把myhello服务缩容至2个实例(任务)
docker service scale myhello=2
# 输出示例
myhello scaled to 2
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
5、部署服务时指定节点
Docker Swarm默认可以使用所有Manager、Worker节点部署服务,这个节点选择是随机的,不过我们可以通过—-constraint参数制定节点类型
5.1、使用Manager节点部署服务
# 使用Manager节点创建服务
docker service create --replicas 1 --name myhello -p 8000:8000 --constraint 'node.role==manager' kentalk/helloworld
# 使用Manager节点扩缩容服务
docker service scale myhello=3 --constraint 'node.role==manager'
5.1、使用Worker节点部署服务
# 使用Manager节点创建服务
docker service create --replicas 1 --name myhello -p 8000:8000 --constraint 'node.role==worker' kentalk/helloworld
# 使用Manager节点扩缩容服务
docker service scale myhello=3 --constraint 'node.role==worker'
四、Docker Swarm集群管理
Docker Swarm集群可以通过命令进行管理,通常管理命令只能在Manager节点执行,退出集群等命令可以在Worker节点执行
1、查看集群状态
docker node ls
# 输出示例
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
1dayw2jss8e7pseq1dxaufo7s * swarm-manager-01 Ready Active Leader 23.0.1
vghhihro3jiz60lstbsslh4ud swarm-worker-01 Ready Active 23.0.1
8570e4bjeuj925nudu7o1a2h8 swarm-worker-02 Ready Active 23.0.1
2、查看服务信息
# 查看所有服务
docker service list
# 查看服务详情
docker service inspect {servicename}
3、退出集群
# Manager节点退出集群
docker swarm leave --force
# Worker节点退出集群
docker swarm leave