Docker Swarm集群搭建:轻松打造高可用、可扩展的分布式应用
Docker Swarm集群搭建:轻松打造高可用、可扩展的分布式应用
在现代微服务架构中,容器化技术已经成为不可或缺的一部分,而Docker Swarm则是Docker提供的原生集群管理工具。本文将详细介绍如何在CentOS环境下从零开始搭建一个高可用的Docker Swarm集群。
前置条件
在开始之前,请确保你有以下环境准备:
- 三台CentOS 7或8的服务器
- 每台服务器至少2GB内存
- 每台服务器上已经安装Docker
Docker Swarm简介
Docker Swarm是一个原生的Docker容器编排工具,它可以将多个Docker主机组成一个虚拟的Docker主机,称为Swarm。Swarm中的每个节点可以是工作节点(worker node)或管理节点(manager node)。管理节点负责集群的管理和调度,而工作节点负责运行容器。
配置Docker Swarm集群
初始化Swarm管理节点
在一台主服务器上初始化Swarm集群。
sudo docker swarm init
也可以指定主服务器IP,执行如下命令
sudo docker swarm init --advertise-addr 198.19.249.166
执行命令后,会输出类似以下内容:
Swarm initialized: current node (qwertyuiop) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxx 198.19.249.166:2377
记录下docker swarm join --token ...
命令,稍后在其他节点上使用。
添加Worker节点
在其他两台服务器上执行以下命令,将它们加入Swarm集群。假设其中一台服务器的IP地址为198.19.249.159,另一台为198.19.249.160。
sudo docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxx 198.19.249.166:2377
成功后,输出类似以下内容:
This node joined a swarm as a worker.
验证节点状态
回到管理节点服务器上,验证所有节点的状态:
sudo docker node ls
输出结果应类似于:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
tb3qi5uh3ww9qjxjki2ccozoe * centos-master Ready Active Leader 26.1.2
omd2zw1146g7bos2ymvriyi1z centos-slave1 Ready Active 26.1.2
bgmg5o1rkd1ajztduw5g41bt4 centos-slave2 Ready Active 26.1.2
部署服务
现在你已经有了一个基本的Swarm集群,可以开始部署服务了。我们以部署Portainer作为示例,这是一款流行的Docker容器管理工具。
部署Nginx
在管理节点上执行以下命令:
sudo docker service create --name nginx --replicas 3 --publish -p 80:80 nginx:latest
[root@centos-master docker]# sudo docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
izgt5ffflddt nginx.1 nginx:latest centos-master Running Running 18 hours ago
dyibrokyc8ag nginx.2 nginx:latest centos-slave1 Running Running 18 hours ago
li69fui5z3xu nginx.3 nginx:latest centos-slave2 Running Running 18 hours ago
部署Portainer
在管理节点上执行以下命令:
sudo docker service create \
--name portainer \
--publish 9000:9000 \
--replicas=1 \
--constraint 'node.role == manager' \
--mount type=volume,src=portainer_data,dst=/data \
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
portainer/portainer
代码解释:
--name portainer
: 指定服务名称为“portainer”。--publish 9000:9000
: 将容器的9000端口映射到主机的9000端口。--replicas=1
: 仅运行一个Portainer实例。--constraint 'node.role == manager'
: 将服务限定在Manager节点上运行。--mount type=volume,src=portainer_data,dst=/data
: 挂载Docker卷用于数据持久化。--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock
: 绑定Docker套接字以便Portainer管理Docker实例。
验证服务状态
查看服务状态:
sudo docker service ls
输出结果应显示Nginx, Portainer服务正在运行:
ID NAME MODE REPLICAS IMAGE PORTS
8l5r0u9wpd2e nginx replicated 3/3 nginx:latest *:80->80/tcp
b8sjpg4ideuq portainer replicated 1/1 portainer/portainer:latest *:9000->9000/tcp
管理Swarm集群
扩展服务
你可以根据需要扩展服务的副本数。例如,将Nginx服务扩展为5个副本:
sudo docker service scale nginx=5
更新服务
更新服务的镜像或其他属性:
sudo docker service update --image nginx:latest nginx
删除服务
如果不再需要某个服务,可以将其删除:
sudo docker service rm nginx
清理环境
在调试或测试完成后,你可能需要清理Swarm环境。首先,移除所有节点:
在Worker节点上执行:
sudo docker swarm leave
在Manager节点上执行:
sudo docker swarm leave --force
结语
通过以上步骤,你已经成功在CentOS上搭建了一个Docker Swarm集群,并部署了一个简单的服务。Docker Swarm提供了强大的原生集群管理能力,适用于多种应用场景。无论是开发环境还是生产环境,合理配置和管理Swarm都能显著提升容器化应用的部署和管理效率。