概述
就Docker自身默认的网络来说,单台主机上的不同Docker容器可以借助docker0网桥进行直接通信,这没毛病,而不同主机上的Docker容器之间通过在主机上用映射端口的方法来进行通信,有时会很不方便,甚至不能满足需求。
因此位于不同物理机上的Docker容器之间直接使用本身的IP地址进行直接通信很有必要。再者说如果将Docker容器起在不同的物理主机上,我们不可避免的会遭遇到Docker容器的跨主机通信问题。
Docker容器网络连接基础
众多网络方案是如何与docker集成在一起的?
libnetwork docker容器网络库
CNM (Container Network Model)这个模型对容器网络进行了抽象
跨主机容器连接方案
使用网桥实现跨主机容器连接
使用Open vSwitch实现跨主机容器连接
使用weave实现跨主机容器连接
本文以局域网内的Docker跨主机通信为例,先尝试一下直接路由方式的跨主机通信。
情景构造
如下图所示,我们有两个物理主机1和主机2,我们在各自宿主机上启动一个CentOS的Linux容器,启动成功之后,两个容器分别运行在两个宿主机之上,默认的IP地址分配如图所示,这也是Docker自身默认的网络。
此时两台主机上的Docker容器如何直接通过IP地址进行通信?
一 同宿主机不同网络容器通信
方法一:使用 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_image1
networks: - my_custom_network
container2:
image: my_image2
networks: - 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
二 跨宿主机容器之间网络互连
docker原生的overlay和macvlan
第三方的flannel、weave、calico
覆盖网络(Overlay Network)
优点:内置支持,易于使用,支持多主机通信和服务发现。
缺点:需要 Docker Swarm 模式。
第三方网络插件(如 Weave Net)
优点:提供更高级的网络功能,适用于复杂网络需求。
缺点:需要额外安装和配置。
使用桥接网络(变通方法)
优点:不需要额外的网络插件,适用于简单的跨宿主机通信。
缺点:配置复杂,需要手动设置路由和 IP 转还有种docker com
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
4. 使用Open vSwitch实现跨主机容器连接
先看一个使用openvswitch连接的架构图,连接的方式是vxlan
说明:
每台主机里都有2个网桥ovs1与ovs2,ovs1是管理网络,连接内网网卡em1,ovs2是数据网络,docker测试机都连接这个ovs2,并且container创建的时候网络都是none,使用pipework指定固定ip。
5. 使用端口转发(最方便【Docker】深入浅出Docker基础——容器发展之路
【Docker】深入浅出Docker基础——走进Docker
【Docker】深入浅出Docker基础——Docker安装
【云部署】Win11+WSL2+Ubuntu+Docker-Desktop 支持GPU的深度学习环境搭建
【Docker】深入浅出Docker基础进阶——纵观Docker的运维与开发
【Docker】深入浅出Docker技术——Docker引擎(理论)
【Docker】深入浅出Docker技术——Docker镜像
【Docker】深入浅出Docker技术——Docker容器
【Docker】深入浅出Docker技术——应用的容器化(单节点Dockerfile)
【Docker】从零开始:教你将程序打包成 Docker 镜像
【Docker】秒懂 Dockerfile:构建容器镜像的必备利器
【Docker】深入浅出Docker技术——应用的容器化(单引擎多容器Docker Compose编排部署应用)
【Docker】深入浅出Docker技术——容器的规模化(跨主机单服务Docker Swarm集群)
【Docker】深入浅出Docker技术网络化——Docker网络
【Docker】深入浅出Docker技术——网络化(Docker覆盖网络Overlay Network)
【Docker】Docker容器在两个不同网络间实现连通
【网络通信】MacVlan 让 Docker 实现上网自由
【NAS】Docker 配置Macvlan网络模式,实现单个容器限速与管控
【Docker】深入浅出Docker技术——卷与持久化数据
【Docker】深入浅出Docker技术——容器的规模化(跨主机多服务Docker Stack)
【Docker】深入浅出Docker技术——Docker安全
【Docker】125个Docker的常用命令
【NAS】轻松搞定绿联UGOS系统的Docker远程访问!
【Docker】Play with Docker 在线实验室 使用教程
【NAS】NAS用户必备应用,170+ 好玩的docker容器应用,好用docker新年汇总
【网络通信】虚拟机三种网络模式:桥接模式,NAT模式,仅主机模式)
Windows 上为 WSL2 设置端口转发,实现局域网访问
WSL上搭建了docker服务 xinference
目前局域网内其他电脑无法访问
非本机 Windows 设备访问 WSL 2
要实现局域网内非本机 Windows 设备访问 WSL 2,需要在 Windows 上配置端口转发以及防火墙入站规则。
查看WSL的IP
root@DESKTOP-AETE0Q9 /home/cc hostname -I
192.168.0.109 就是WSL的IP,一会转发到这个IP
在windows上进行端口转发
netsh interface portproxy add v4tov4 listenport=9988 listenaddress=0.0.0.0 connectport=9988 connectaddress=192.168.0.109 protocol=tcp
参数说明
add v4tov4: 指示 netsh 添加一个IPv4到IPv4
的端口转发规则。
listenport=9988: 设置侦听端口,即外部设备将连接到这个端口。在这个例子中,Windows机器将监听在端口9988上的所有入站连接。
listenaddress=0.0.0.0: 设置侦听地址。特殊的IP地址 0.0.0.0 表示接收通过任何网络接口到达该端口的数据,这使得从任何网络接入都被接受。
connectport=9988: 设置连接端口,即当数据到达侦听端口时,数据将被转发到此端口。在此例中,转发的目标端口同样是9988。
connectaddress=192.168.0.109: 设置连接地址,即数据将被转发到这个IP地址。这通常是内部网络中的一个设备(如WSL2
实例)的地址。
protocol=tcp: 指定使用TCP协议进行端口转发。这意味着规则适用于TCP连接,这是大多数网络应用程序(如HTTP服务器、数据库等)的常用协议。
netsh interface portproxy add v4tov4 listenport=9988 listenaddress=0.0.0.0 connectport=9988 connectaddress=localhost
删除转发
delete:
netsh interface portproxy delete v4tov4 listenport=9988 listenaddress=0.0.0.0
windows上添加入站规则
9988
详细操作:https://blog.csdn.net/qq_42370421/article/details/119701356
在windows上进行测试
在其他电脑上访问:192.168.0.109:9988
如果你有Nas上docker创建的Dify容器,需要连接本地电脑上WSL2上docker上的Xinference容器,也可以了!
总结
跨宿主机的容器网络互连可以通过多种方法实现,每种方法都有其特点和适用场景:
覆盖网络(Overlay Network):
优点:内置支持,易于使用,支持多主机通信和服务发现。
缺点:需要 Docker Swarm 模式。
第三方网络插件(如 Weave Net):
优点:提供更高级的网络功能,适用于复杂网络需求。
缺点:需要额外安装和配置。
使用桥接网络(变通方法):
优点:不需要额外的网络插件,适用于简单的跨宿主机通信。
缺点:配置复杂,需要手动设置路由和 IP 转
还有种docker compose 需要借助 docker swarm 就不介绍了
后 记
本文探讨了局域网中不同宿主机间Docker容器直接通信的一种简单的方案。当然现在实现跨主机容器间通信的现成方案也很多,典型的比如flannel、Calico这种,有兴趣的也可以研究一下。
——The End——
记得点赞、分享,让更多的朋友一起探索这个IT世界的新篇章!
AIGC周边正在发布,关注生活,冻龄青春
推荐阅读
【Docker】深入浅出Docker基础——走进Docker
【Docker】深入浅出Docker基础——Docker安装
【云部署】Win11+WSL2+Ubuntu+Docker-Desktop 支持GPU的深度学习环境搭建
【Docker】深入浅出Docker基础进阶——纵观Docker的运维与开发
【Docker】深入浅出Docker技术——Docker引擎(理论)
【Docker】深入浅出Docker技术——Docker镜像
【Docker】深入浅出Docker技术——Docker容器
【Docker】深入浅出Docker技术——应用的容器化(单节点Dockerfile)
【Docker】从零开始:教你将程序打包成 Docker 镜像
【Docker】秒懂 Dockerfile:构建容器镜像的必备利器
【Docker】深入浅出Docker技术——应用的容器化(单引擎多容器Docker Compose编排部署应用)
【Docker】深入浅出Docker技术——容器的规模化(跨主机单服务Docker Swarm集群)
【Docker】深入浅出Docker技术网络化——Docker网络
【Docker】深入浅出Docker技术——网络化(Docker覆盖网络Overlay Network)
【NAS】Docker 配置Macvlan网络模式,实现单个容器限速与管控
【Docker】深入浅出Docker技术——容器的规模化(跨主机多服务Docker Stack)
【Docker】深入浅出Docker技术——Docker安全
【Docker】Play with Docker 在线实验室 使用教程
领取专属 10元无门槛券
私享最新 技术干货