一 同宿主机不同网络容器通信
方法一:使用 Docker 网络连接
-
创建一个自定义桥接网络:
- 创建一个新的自定义桥接网络,然后将需要通信的容器连接到这个网络。
docker network create my_custom_network
-
将容器连接到自定义网络:
- 将需要通信的容器连接到同一个自定义网络。
# 假设有两个容器 container1 和 container2 分别连接到不同的网络 docker network connect my_custom_network container1 docker network connect my_custom_network container2
-
验证通信:
- 进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。
docker exec -it container1 ping container2
方法二:使用端口映射
-
将容器的端口映射到宿主机:
- 通过
-p
选项将容器的端口映射到宿主机的端口。
docker run -d --name container1 -p 8080:80 my_image1 docker run -d --name container2 -p 8081:80 my_image2
- 通过
-
通过宿主机 IP 地址通信:
- 容器可以通过宿主机的 IP 地址和映射的端口进行通信。
# 获取宿主机的 IP 地址 HOST_IP=$(hostname -I | awk '{print $1}')# 从 container1 访问 container2 docker exec -it container1 curl http://$HOST_IP:8081
方法三:使用 Docker Compose
-
创建一个 Docker Compose 文件:
- 使用 Docker Compose 文件定义多个服务,并将它们连接到同一个网络。
version: '3' services:container1:image: my_image1networks:- my_custom_networkcontainer2:image: my_image2networks:- my_custom_network networks:my_custom_network:driver: bridge
-
启动 Docker Compose:
- 使用
docker-compose up
命令启动服务。
docker-compose up -d
- 使用
-
验证通信:
- 进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。
docker exec -it container1 ping container2
方法四:使用 Docker 网络插件
-
安装网络插件:
- 使用第三方网络插件,如 Weave Net 或 Flannel,这些插件可以提供更高级的网络功能,包括跨网络的容器通信。
# 安装 Weave Net docker plugin install weaveworks/net-plugin:latest_release
-
配置网络插件:
- 按照插件的文档进行配置,将需要通信的容器连接到同一个网络。
# 使用 Weave Net 创建网络 docker network create -d weave my_weave_network# 将容器连接到 Weave 网络 docker network connect my_weave_network container1 docker network connect my_weave_network container2
-
验证通信:
- 进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。
docker exec -it container1 ping container2
二 跨宿主机容器之间网络互连
1. 覆盖网络(Overlay Network)
覆盖网络是 Docker 内置的一种网络模式,允许多个 Docker 守护进程之间的容器相互通信。这是实现跨宿主机容器网络互连的最常用和推荐的方法。
步骤
-
初始化 Docker Swarm(可选,但推荐):
- 如果你使用 Docker Swarm 模式,首先需要初始化 Swarm。
# 在其中一个宿主机上初始化 Swarm docker swarm init --advertise-addr <宿主机IP>
- 获取加入 Swarm 的命令,并在其他宿主机上执行。
# 获取加入命令 docker swarm join-token worker# 在其他宿主机上执行加入命令 docker swarm join --token <TOKEN> <宿主机IP>:2377
-
创建覆盖网络:
- 创建一个覆盖网络,指定网络驱动为
overlay
。
docker network create --driver overlay my_overlay_network
- 创建一个覆盖网络,指定网络驱动为
-
启动容器并连接到覆盖网络:
- 在每个宿主机上启动容器,并将它们连接到同一个覆盖网络。
# 在宿主机1上启动容器 docker run -d --name container1 --network my_overlay_network my_image# 在宿主机2上启动容器 docker run -d --name container2 --network my_overlay_network my_image
-
验证通信:
- 进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。
docker exec -it container1 ping container2
2. 使用第三方网络插件(Weave Net)
Weave Net 是一个流行的第三方网络插件,提供了易于使用的跨主机网络解决方案。
步骤
-
安装 Weave Net:
- 在每个宿主机上安装 Weave Net。
curl -L git.io/weave -o /usr/local/bin/weave chmod +x /usr/local/bin/weave
-
启动 Weave Net:
- 在每个宿主机上启动 Weave Net。
# 在第一个宿主机上启动 Weave Net weave launch# 获取第一个宿主机的 IP 地址 HOST1_IP=$(hostname -I | awk '{print $1}')# 在其他宿主机上启动 Weave Net 并连接到第一个宿主机 weave launch $HOST1_IP
-
创建 Weave 网络:
- 创建一个 Weave 网络。
docker network create -d weave my_weave_network
-
启动容器并连接到 Weave 网络:
- 在每个宿主机上启动容器,并将它们连接到同一个 Weave 网络。
# 在宿主机1上启动容器 docker run -d --name container1 --network my_weave_network my_image# 在宿主机2上启动容器 docker run -d --name container2 --network my_weave_network my_image
-
验证通信:
- 进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。
docker exec -it container1 ping container2
3. 使用桥接网络(变通方法)
虽然 Docker 的默认桥接网络(bridge
)不支持跨宿主机通信,但可以通过一些变通的方法实现这一点。一种常见的方法是使用路由和 IP 转发。
步骤
-
配置 IP 转发:
- 在每个宿主机上启用 IP 转发。
echo 1 > /proc/sys/net/ipv4/ip_forward
-
配置路由:
- 在每个宿主机上配置路由,使容器的流量通过宿主机转发。
# 假设宿主机1的 IP 地址是 192.168.1.100 # 宿主机2的 IP 地址是 192.168.1.101# 在宿主机1上配置路由 ip route add 172.18.0.0/16 via 192.168.1.101# 在宿主机2上配置路由 ip route add 172.17.0.0/16 via 192.168.1.100
-
创建自定义桥接网络:
- 在每个宿主机上创建自定义桥接网络。
docker network create --driver bridge --subnet 172.17.0.0/16 my_custom_bridge
-
启动容器并连接到自定义桥接网络:
- 在每个宿主机上启动容器,并将它们连接到同一个自定义桥接网络。
# 在宿主机1上启动容器 docker run -d --name container1 --network my_custom_bridge my_image# 在宿主机2上启动容器 docker run -d --name container2 --network my_custom_bridge my_image
-
验证通信:
- 进入其中一个容器,尝试 ping 另一个容器的 IP 地址。
docker exec -it container1 ping 172.17.0.2
总结
跨宿主机的容器网络互连可以通过多种方法实现,每种方法都有其特点和适用场景:
-
覆盖网络(Overlay Network):
- 优点:内置支持,易于使用,支持多主机通信和服务发现。
- 缺点:需要 Docker Swarm 模式。
-
第三方网络插件(如 Weave Net):
- 优点:提供更高级的网络功能,适用于复杂网络需求。
- 缺点:需要额外安装和配置。
-
使用桥接网络(变通方法):
- 优点:不需要额外的网络插件,适用于简单的跨宿主机通信。
- 缺点:配置复杂,需要手动设置路由和 IP 转
还有种docker compose 需要借助 docker swarm 就不介绍了