在 Ubuntu 中,我尝试在 VPN 上创建具有指定子网的 docker 网络,但出现以下错误:
$ docker network create my-network --subnet 172.17.24.0/18
Error response from daemon: Pool overlaps with other one on this address space
查看路由表:
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 cscotun0
0.0.0.0 192.168.0.1 0.0.0.0 UG 20600 0 0 wlp0s20f3
10.174.33.0 0.0.0.0 255.255.255.0 U 0 0 0 cscotun0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 cscotun0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlp0s20f3
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
188.64.152.45 192.168.0.1 255.255.255.255 UGH 0 0 0 wlp0s20f3
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 cscotun0
192.168.0.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp0s20f3
192.168.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 wlp0s20f3
我没有看到我的 VPN(cscotun0
)占用了该范围,所以发生了什么事?
除非172.17.24.0/18
与 重叠docker0
:
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
但我认为两者docker0
应该172.17.24.0/18
能够存在于同一范围内?
答案1
守护进程的错误响应:网络池与此地址空间上的另一个网络池重叠。
就我而言,我有一个带有硬编码网络 IP 地址的 docker-compose.yaml 文件,并且另一个容器使用同一网络启动。
networks:
vpn-net:
ipv4_address: 172.21.0.2
为了解决这个问题,首先找到当前正在使用它的容器:
# docker network ls
NETWORK ID NAME DRIVER SCOPE
ca9b2b29a253 bridge bridge local
45e9488d9140 host host local
5966656f9981 none null local
b3edda2ed475 my-service-net bridge local
a9eb7c1f3d20 another-network bridge local
# docker inspect my-service-net | grep 172.21.0.2
"IPv4Address": "172.21.0.2/16"
停止找到的网络的服务:
# docker stop my-service-net
最后,启动失败的新容器。您也可以删除 IP 网络配置或更改 IP。
答案2
但我假设 docker0 和 172.17.24.0/18 应该能够存在于同一范围内?
理论上这是允许的,但这会导致 172.17.0.0/16 网络出现漏洞,其中 172.17.24.0/18 通过,docker0
因为最具体的路由获胜。Linux 内核可能会允许您配置这一点,但这不是好的形式,而且它将要由于网络子网重叠,导致有趣的问题。
解决方案是使地址空间不重叠。