如何仅用Docker工具实现不同容器间网络设备及子网共享?
解决方案
要仅通过Docker工具实现container2访问container1中my-device对应的192.168.0.0/16子网,有两种可行的原生方案,无需修改主机iptables:
方案1:直接共享container1的网络命名空间
这种方式让container2完全复用container1的网络栈,包括网络设备、路由表和端口,是最直接的实现方式。
操作步骤
启动container2时指定复用container1的网络:
docker run -d --name container2 --net container:container1 <你的镜像名>
若container2已运行,需先停止重建:
docker stop container2 docker rm container2 docker run -d --name container2 --net container:container1 <你的镜像名>
优缺点
- 优点:配置简单,无需额外路由设置,container2自动拥有和container1一致的网络能力
- 缺点:两个容器完全共享网络栈,端口会冲突,网络隔离性差
方案2:自定义网络+静态路由(推荐,保持网络隔离)
这种方式让两个容器在同一自定义Docker网络中,通过给container2添加静态路由,将192.168.0.0/16的流量指向container1,同时开启container1的IP转发实现流量中转。
操作步骤
- 确保container1开启IP转发
启动container1时添加sysctl参数自动开启:
docker run -d --name container1 --sysctl net.ipv4.ip_forward=1 <你的镜像名>
若container1已运行,可进入容器临时开启(重启后失效):
docker exec -it container1 bash -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
- 创建自定义Docker网络(未创建时执行)
docker network create --driver bridge my-shared-network
- 将两个容器连接到自定义网络
docker network connect my-shared-network container1 docker network connect my-shared-network container2
- 获取container1在自定义网络中的IP
docker inspect container1 | grep -A 10 "my-shared-network" | grep "IPAddress"
假设输出得到的IP为172.19.0.2(以实际输出为准)
- 给container2添加静态路由
使用--route参数指定子网路由的网关为container1的IP:
docker network connect --route 192.168.0.0/16 via 172.19.0.2 my-shared-network container2
验证
进入container2查看路由表:
docker exec -it container2 route -n
此时应能看到新增路由条目:
192.168.0.0 172.19.0.2 255.255.0.0 UG 0 0 0 eth1
优缺点
- 优点:两个容器保持独立网络栈,端口不冲突,网络隔离性好
- 缺点:需要多步配置,依赖Docker 17.06及以上版本(
--route参数从该版本开始支持)
内容的提问来源于stack exchange,提问作者Sergey Kodentsov
相关产品推荐
相关产品推荐

