在不同的宿主机上打通 Docker 网络可以通过以下几种方法:
一、使用 Docker 原生的网络驱动实现跨主机通信
- Overlay 网络
- Overlay 网络允许在多个 Docker 守护进程之间创建一个分布式网络。它使用 VXLAN 等技术在不同的宿主机之间进行通信。
- 步骤如下:
- 在所有要连接的宿主机上安装 Docker 的 swarm 模式组件,即使不打算使用 swarm 来管理容器,仅仅是为了使用 Overlay 网络。
- 创建一个 Overlay 网络:
docker network create -d overlay my-overlay-network
。 - 在不同的宿主机上启动容器时指定这个网络:
docker run -d --network my-overlay-network <image_name>
。容器将能够通过容器名称或 IP 地址相互通信。
- Macvlan 网络
- Macvlan 网络允许为容器分配物理网络上的 MAC 地址,使容器看起来像物理网络上的独立主机。
- 步骤如下:
- 确保宿主机的网络接口支持混杂模式。可以使用
ip link set <interface_name> promisc on
来开启,但这可能需要管理员权限。 - 创建 Macvlan 网络:
docker network create -d macvlan --subnet=<subnet> --gateway=<gateway> -o parent=<physical_interface_name> my-macvlan-network
,其中<subnet>
是你所在物理网络的子网,<gateway>
是网关地址,<physical_interface_name>
是宿主机的物理网络接口名称。 - 启动容器并连接到这个网络:
docker run -d --network my-macvlan-network <image_name>
。
二、使用第三方工具实现跨主机通信
- Weave Net
- Weave Net 是一个专门用于 Docker 容器网络的工具,可以在不同的宿主机之间创建一个虚拟网络。
- 步骤如下:
- 在每台宿主机上安装 Weave Net:
curl -L git.io/weave -o /usr/local/bin/weave && chmod a+x /usr/local/bin/weave
。 - 在一台宿主机上启动 Weave 路由器:
weave launch
。 - 在其他宿主机上连接到这个路由器:
weave connect <router_ip>
,其中<router_ip>
是第一台宿主机的 IP 地址。 - 启动容器时使用 Weave 网络:
docker run -d --net=weave <image_name>
。
- Flannel
- Flannel 为 Kubernetes 设计,但也可以单独用于 Docker 容器网络,它使用 UDP 封装来在不同的宿主机之间传输网络数据包。
- 步骤如下:
- 在每台宿主机上安装 Flannel:
curl -L https://github.com/coreos/flannel/releases/latest/download/flannel-linux-amd64.tar.gz | tar -xz -C /usr/local/bin
。 - 创建一个 Flannel 配置文件,例如
/etc/flannel/config.json
,内容如下:
{ "Network": "10.10.0.0/16", "Backend": { "Type": "udp" } }
- 在每台宿主机上启动 Flannel:
/usr/local/bin/flanneld -etcd-endpoints=<etcd_ip>:2379 -iface=<interface_name> -config-file=/etc/flannel/config.json
,其中<etcd_ip>
是 Etcd 服务器的 IP 地址(如果不使用 Etcd,可以忽略这个参数),<interface_name>
是宿主机的网络接口名称。 - 配置 Docker 使用 Flannel 网络:编辑
/etc/docker/daemon.json
文件,添加以下内容:
{ "bip": "10.10.0.1/16" }
然后重启 Docker 服务。
- 启动容器时,它们将自动连接到 Flannel 网络,并可以通过容器 IP 地址相互通信。
无论使用哪种方法,都需要确保宿主机之间的网络连接正常,并且防火墙设置不会阻止容器之间的通信。同时,不同的方法有各自的优缺点和适用场景,你可以根据实际需求选择最适合的方法。