4 台 2C2G 服务器逆袭!手把手教你用 Docker Swarm+Portainer 打造超便捷集群
4 台 2C2G 服务器逆袭!手把手教你用 Docker Swarm+Portainer 打造超便捷集群
在资源有限的情况下,如何最大化服务器性能?本文将基于 4 台 2C2G 服务器,带你通过 Docker Swarm 和 Portainer 构建高效集群,轻松实现资源整合与可视化管理。
一、集群规划与架构设计
1. 硬件配置
4 台 2C2G 服务器(示例 IP:192.168.1.100~192.168.1.103),操作系统统一是使用 Ubuntu 20.04 LTS。
2. 角色分配
节点 IP | 角色 | 职责描述 |
---|---|---|
192.168.1.100 | Swarm Manager | 集群管理节点(主管理节点) |
192.168.1.101 | Swarm Worker | 工作节点 |
192.168.1.102 | Swarm Worker | 工作节点 |
192.168.1.103 | Swarm Worker | 工作节点 |
3. 架构图
二、环境准备(所有节点)
1. 安装 Docker CE
# 更新包索引
sudo apt update
# 安装依赖工具
sudo apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加Docker软件源
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装Docker CE
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 启动Docker服务并设置开机自启
sudo systemctl enable --now docker
# 允许当前用户管理Docker(非必须,建议使用sudo)
sudo usermod -aG docker $USER
2. 检查 Docker 版本(需 >=1.12)
docker --version
# 预期输出类似:Docker version 24.0.6, build ed223bc
3. 开放集群通信端口(所有节点)
sudo ufw allow 2377/tcp # Swarm管理端口
sudo ufw allow 7946/tcp # 容器网络通信(TCP)
sudo ufw allow 7946/udp # 容器网络通信(UDP)
sudo ufw allow 4789/udp # 容器overlay网络
sudo ufw allow 9000/tcp # Portainer管理端口(仅管理节点)
sudo ufw enable
三、初始化 Swarm 集群(管理节点 192.168.1.100)
1. 初始化管理节点
docker swarm init --advertise-addr 192.168.1.100
执行后会输出工作节点加入命令,类似:
Swarm initialized: current node (abcdef123456) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4567890abcdef1234567890 192.168.1.100:2377
2. 查看集群节点状态
docker node ls
# 预期输出:只有当前管理节点,状态为Ready,角色为Manager
四、添加工作节点(192.168.1.101~103)
在每台工作节点执行初始化时输出的加入命令:
docker swarm join --token SWMTKN-1-4567890abcdef1234567890 192.168.1.100:2377
验证节点加入
在管理节点再次执行:
docker node ls
# 预期输出4个节点,1个Manager,3个Worker,状态均为Ready
五、部署 Portainer 可视化管理工具(管理节点)
1. 创建数据卷(持久化存储配置)
docker volume create portainer_data
2. 运行 Portainer 服务
docker service create
--name portainer
--publish 9000:9000
--constraint 'node.role == manager'
--mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock
--mount type=volume,src=portainer_data,dst=/data
portainer/portainer-ce:latest -H unix:///var/run/docker.sock
参数说明:
--constraint
:确保 Portainer 仅在管理节点运行
--mount
:挂载 Docker 套接字实现集群管理,数据卷存储配置
3. 访问 Portainer 界面
在浏览器输入:http://192.168.1.100:9000
首次访问设置管理员密码(建议强密码)
选择 “Connect to a Docker environment”
选择 “Swarm mode” 并点击 “Connect”
六、集群验证与基本操作
1. 查看节点状态(Portainer 界面)
进入 “Nodes” 页面,应显示 4 个节点,状态均为 Active
Manager 节点显示 “Leader” 标识,Worker 节点显示资源使用情况
2. 部署测试服务(Nginx 示例)
命令行部署(管理节点)
docker service create
--name web-service
--replicas 3
--port 80:80
nginx:alpine
Portainer 界面部署
进入 “Stacks” 页面,点击 “Add stack”
使用 Docker Compose 格式部署(示例如下):
version: '3'
services:
web:
image: nginx:alpine
ports:
- "80:80"
deploy:
replicas: 3
3. 验证负载均衡
访问任意节点 IP 的 80 端口,会轮询到不同 Nginx 容器实例
curl 192.168.1.100
curl 192.168.1.101
# 输出应显示不同的容器ID(通过查看容器日志确认)
七、资源优化与最佳实践
1. 限制容器资源(防止单个容器耗尽节点资源)
docker service create
--name restricted-service
--replicas 2
--limit-cpu 1.0 # 最多使用1个CPU核心
--limit-memory 1024m # 最多使用1GB内存
--reserve-cpu 0.5 # 至少保留0.5个CPU
--reserve-memory 512m # 至少保留512MB内存
nginx:alpine
2. 节点标签分组(示例:区分数据库节点)
为特定节点添加标签
docker node update --label-add role=database 192.168.1.101
部署服务时指定标签约束
deploy:
placement:
constraints:
- node.labels.role == database
3. 监控集群资源
在 Portainer 界面的 “Monitoring” 页面可实时查看:
节点 CPU / 内存 / 磁盘使用情况
服务副本运行状态
容器日志实时监控
八、常见问题处理
1. 节点加入失败
检查防火墙是否开放 2377/7946/4789 端口
确认管理节点 IP 可被工作节点访问(ping 测试)
重新生成加入令牌:docker swarm join-token worker
2. Portainer 无法连接集群
检查/var/run/docker.sock
权限是否正确
重启 Portainer 服务:docker service rm portainer && 重新执行部署命令
3. 服务调度不均衡
检查节点资源使用情况(Portainer 监控页面)
添加资源约束或节点标签重新调度任务
九、总结
通过 4 台 2C2G 服务器搭建的 Docker Swarm 集群,配合 Portainer 可视化管理,实现了:
计算资源的集中管理与弹性分配
容器服务的高可用性与负载均衡
可视化的集群监控与便捷操作
此方案适用于中小规模微服务架构、分布式应用测试环境或轻量级生产集群。后续可根据业务需求扩展节点数量,通过 Swarm 的动态调度能力灵活分配资源。