使用 Docker Swarm 纳管节点并实现容器通信
1. 前提条件
- 两个节点(192.168.1.11 和 192.168.1.12)已安装 Docker(建议使用最新版本,例如 20.10 或更高)。
- 两节点网络互通,防火墙允许以下端口:
- TCP 2377(Swarm 管理)
- TCP/UDP 7946(节点通信)
- UDP 4789(覆盖网络数据)
- 确保两节点可以通过 IP 或主机名互相访问。
2. 初始化 Docker Swarm
在主节点(以 192.168.1.11 为例)上初始化 Swarm。
docker swarm init --advertise-addr 192.168.1.11
执行后会返回一个 docker swarm join
命令,类似:
docker swarm join --token SWMTKN-1-xxxx 192.168.1.11:2377
记录此命令,用于后续加入从节点。
3. 加入从节点
在从节点(192.168.1.12)上执行主节点返回的 join
命令:
docker swarm join --token SWMTKN-1-xxxx 192.168.1.11:2377
验证节点是否成功加入,在主节点运行:
docker node ls
输出应显示两个节点,状态为 Ready
。
4. 创建覆盖网络
为了实现跨节点容器通信,需创建 Overlay 网络:
docker network create --driver overlay --attachable my-overlay-network
--driver overlay
:使用 Overlay 网络,支持跨节点通信。--attachable
:允许手动附加容器到网络。
验证网络创建:
docker network ls
5. 部署服务
在 Swarm 中通过服务部署容器,服务会自动分配到不同节点。以下示例部署两个 Nginx 容器,并连接到 Overlay 网络。
在主节点运行:
docker service create --name web1 --network my-overlay-network --replicas 1 nginx
docker service create --name web2 --network my-overlay-network --replicas 1 nginx
验证服务:
docker service ls
查看容器分布:
docker service ps web1
docker service ps web2
6. 测试容器通信
Overlay 网络支持容器通过服务名进行通信。假设 web1
和 web2
分别运行在不同节点,测试通信:
-
进入
web1
容器:docker exec -it $(docker ps -q -f name=web1) /bin/bash
-
在容器内
ping
另一个服务:ping web2
或使用
curl
测试:curl http://web2
服务名(如
web2
)会自动解析为目标容器的 IP。
7. 注意事项
- 防火墙:确保节点间防火墙规则允许 Swarm 相关端口通信。
- 服务发现:Overlay 网络内置 DNS,容器可通过服务名通信,无需手动指定 IP。
- 扩展性:可通过
docker service scale web1=3
扩展服务实例,Swarm 会自动分配到可用节点。 - 故障排查:
- 检查节点状态:
docker node ls
。 - 检查网络:
docker network inspect my-overlay-network
。 - 查看服务日志:
docker service logs web1
。
- 检查节点状态:
8. 清理(可选)
如果需要移除服务或 Swarm:
- 删除服务:
docker service rm web1 web2
- 离开 Swarm(从节点):
docker swarm leave
- 解散 Swarm(主节点):
docker swarm leave --force