实现 docker 跨主机通信(Swarm版)
本文将在云服务器之间实现基于 Swarm 集群的 Overlay 网络,以达到跨主机通信的目的。
概念解析
Docker 的安装教程非常之多,这里不再赘述。
Swarm 是 Docker 官方提供的容器编排工具之一,用于管理多个 Docker 主机上运行的容器。它允许将多个 Docker 主机组成一个集群,并通过统一的接口来管理这些主机上的容器。Swarm 提供了高可用性、伸缩性和容错性,使得在生产环境中部署和管理容器化应用变得更加简单和可靠。
Overlay 网络是 Docker 提供的一种网络模型,采用了多种技术来实现容器间的通信,其中包括了本文中将使用的 VXLAN(Virtual Extensible LAN)技术,VXLAN 可以将容器的数据包封装在 UDP 数据包中,并在底层网络中传输,从而实现跨主机的容器通信。
环境配置
节点名 | 节点IP | 节点服务 |
---|---|---|
dnode0 | 10.0.0.11 | 安装 Docker,并初始化Swarm集群 |
dnode1 | 10.0.0.12 | 安装 Docker |
dnode2 | 10.0.0.13 | 安装 Docker |
配置三台机器,请注意修改hostname
为不同的值(本文将分别设置为 dnode0、dnode1、dnode2),防火墙放行如下端口:
- TCP端口2376 用于安全的 Docker 客户端通信,这是 Docker Machine(被用来编排Docker的主机)正常工作所必需的。
- TCP端口2377 用于 Docker Swarm 或集群中节点之间的通信,只需要在管理节点上打开。
- UDP端口4789 用于覆盖网络流量(容器入口网络)。
- TCP和UDP端口7946 用于节点之间的通信(容器网络发现)。
初始化Swarm
集群服务
在dnode0
节点上执行以下命令来初始化 Swarm 集群。
docker swarm init
如果没有记住加入集群的token
,以下可以重新获取。
docker swarm join-token worker
其他节点分别加入Swarm
集群
确保将token
替换为实际获得的值,并将IP地址替换为dnode0
节点的IP地址。
docker swarm join --token tokenxxxxxxx 10.0.0.11:2377
在主节点上创建overlay
网络
创建一个名为ovnet
的 overlay 网络,其中包括了一个子网范围为10.0.2.0/24
,并指定网关为10.0.2.1
。
docker network create --driver overlay --subnet=10.0.2.0/24 --gateway=10.0.2.1 --attachable ovnet
测试跨主机网络连通性
分别在不同的节点上创建一个附加到ovnet
网络的临时容器,它们将可以在 Swarm 集群中的不同节点上互相通信。
docker run -it --rm --network ovnet --ip 10.0.2.5 alpine
docker run -it --rm --network ovnet --ip 10.0.2.6 alpine
docker run -it --rm --network ovnet --ip 10.0.2.7 alpine
接下来,可以在已经打开的临时容器中,尝试使用 ping 10.0.2.x
命令测试网络连通性。