在Linux环境中搭建容器编排能力,不一定非要引入复杂的Kubernetes。Docker Swarm作为Docker原生的集群管理工具,能够以极小的运维负担把多台机器组织成一个虚拟资源池。下面以常见的Ubuntu与CentOS为例,说明从零开始配置Swarm集群的具体做法。

一、环境准备与端口开放
在真正初始化Swarm之前,必须保证各节点之间网络互通,且特定端口未被防火墙拦截。Swarm管理平面依赖TCP 2377进行集群通信,节点之间的Overlay网络使用UDP 4789,容器网络发现使用TCP/UDP 7946。如果遗漏这些端口,节点虽然能加入但服务无法跨主机联通。
以Ubuntu使用的UFW为例,需要在每个节点执行如下命令放通端口。CentOS则应改用firewalld的富规则或直接在iptables中放行。很多初学者只在管理节点开放端口,导致工作节点上的容器无法被调度,这是典型的配置盲区。
# Ubuntu节点开放Swarm所需端口 sudo ufw allow 2377/tcp sudo ufw allow 7946/tcp sudo ufw allow 7946/udp sudo ufw allow 4789/udp sudo ufw reload
二、初始化管理节点
选取一台性能相对稳定、网络可靠的Linux主机作为管理节点(Manager)。在这台机器上执行docker swarm init命令即可拉起内置的Raft一致性模块。该命令会输出一个包含令牌的docker swarm join指令,后续工作节点凭此令牌加入。
如果服务器拥有多块网卡,必须使用--advertise-addr指定对外通信的IP,否则Swarm可能绑定到内部网桥地址,使其他节点无法连接。下面的示例显式声明了广告地址为192.168.0.10。
# 在管理节点初始化Swarm并指定广告地址 docker swarm init --advertise-addr 192.168.0.10 # 命令成功后会打印类似如下加入命令 # docker swarm join --token SWMTKN-1-xxx 192.168.0.10:2377
初始化完成后,可通过docker node ls查看当前集群仅包含管理节点自身,状态应为Ready。此时控制平面已经具备高可用基础,但还没有真正的工作负载节点。
三、工作节点加入集群
在计划作为工作节点的Linux主机上,粘贴管理节点初始化时给出的join命令。该命令中的令牌是节点身份认证凭据,泄露可能导致未授权机器加入集群,因此不建议明文写入公用脚本。
若初始化时的令牌丢失,可在管理节点运行docker swarm join-token worker重新获取。加入成功后再次在管理节点执行docker node ls,就能看到新节点处于Active状态。
# 在工作节点执行(令牌为示例,请替换为实际值) docker swarm join --token SWMTKN-1-0abc 192.168.0.10:2377 # 回到管理节点确认 docker node ls
四、部署服务与Overlay网络
Swarm使用服务(Service)概念而非直接运行容器。通过docker service create可以指定副本数、网络和端口映射。当服务跨多台主机时,Swarm会自动创建名为ingress的Overlay网络,实现外部访问的负载均衡。
下面的代码创建了一个Nginx服务,副本数为3,并将容器80端口映射到集群的8080端口。无论请求打到哪台节点,Swarm路由网格都会把流量转发到实际运行的容器。
# 创建跨节点Nginx服务 docker service create --name web --replicas 3 --publish published=8080,target=80 nginx:stable # 查看服务分布 docker service ps web
如果业务需要自定义Overlay网络以便服务间通过名称互通,可先创建网络再挂载。注意自定义Overlay网络在Swarm外部无法直接被单机容器使用,这是与bridge网络的重要区别。
# 创建自定义Overlay网络 docker network create --driver overlay --attachable mynet # 在服务中引用该网络 docker service create --name api --network mynet myapi:1.0
五、常见误区与维护建议
第一个常见误区是混淆<input>标签与函数调用,在Shell里把docker swarm init()当成命令输入,实际上init是子命令而非函数。第二个误区是只配置单管理节点,一旦该机宕机集群将无法变更调度,生产环境应配置3或5个奇数个管理节点以容忍故障。
日常维护中,可用docker node update --availability drain 节点名将节点置为维护状态,Swarm会把上面运行的任务迁移走。升级Docker版本时建议逐节点排空再操作,避免服务整体中断。
| 操作项 | 推荐做法 | 风险做法 |
|---|---|---|
| 管理节点数 | 3或5个奇数 | 仅1个 |
| 令牌管理 | 保密存储于配置中心 | 写公开脚本 |
| 节点维护 | 先drain再升级 | 直接关机 |
Swarm的优势在于几乎零额外组件,但它调度粒度与生态扩展不如Kubernetes。若业务规模扩大,可在此基础上平滑迁移至更重的编排系统。
通过上述步骤,你已经在Linux上完成了Docker Swarm的基础配置,并能够部署具备跨主机调度能力的容器服务。后续可结合监控与日志方案进一步完善生产集群。
Docker_Swarm容器编排Linux配置修改时间:2026-08-08 18:42:50