为什么我必须定期使用"docker 网络修剪"来重新启用容器内的 docker 映射 ip 连接?



我大部分时间都在使用 vpn,我注意到有时外部网络连接会失败,例如从远程位置安装到容器中会被拒绝连接。docker network prune允许 docker 重新映射连接,然后我可以继续我正在做的任何事情,但这里到底发生了什么?使用 docker for mac,如果相关的话。

docker network prune

删除任何未使用的网络,然后使用类似docker-composedocker stack deploy的内容重新部署项目将重新创建网络。当 docker 创建网络时,它会从私有 IP 池中进行选择,并排除当前可以路由到的任何网络。最后一部分是当您连接和断开与VPN的连接时,或者在docker可见的不同网络的不同位置工作时正在更改的内容。

我怀疑你看到的是网络冲突。当 docker 选择您后来发现自己连接到的同一网络子网时(例如,在新位置打开 VPN 或 wifi)尝试从 docker 容器连接到该外部网络,路由到 docker 网络而不是外部网络。这会导致连接失败。

您可以告诉 docker 仅从选定的子网池中选取网络。您需要确定 VPN、家庭、办公室、咖啡店等使用的子网,然后为 docker 选择任何子网之外的专用 IP 范围。它的配置在桥接网络的 daemon.json 文件中(在 Mac 上,您转到 docker 图标,打开设置/首选项,转到守护程序,然后高级)如下所示:

{
"bip": "10.15.0.1/24",
"default-address-pools": [
{"base": "10.20.0.0/16", "size": 24},
{"base": "10.40.0.0/16", "size": 24}
]
}

"bip"设置适用于网桥 IP,又名 docker0 或名为网桥的网桥网络。bip 地址必须有效,因此不要以 0 或 255 结尾,它将用于网关,掩码 (/24) 将用于指定子网大小。

"默认地址池"选项出现在 18.06 中,它指定了用于 docker 创建的其他网桥网络的子网,包括docker network create网桥和docker-compose创建的任何网桥。

对于 swarm 模式,从 18.09 开始,您可以在首次创建 swarm 时使用以下命令定义要用于覆盖网络的池:

$ docker swarm init 
--default-addr-pool 10.20.0.0/16 
--default-addr-pool 10.40.0.0/16 
--default-addr-pool-mask-length 24

如果需要更改这些,则需要删除并重新创建群。

要查看当前正在使用的网络,您可以运行ip r以查看所有路由。第一列以 CIDR 表示法显示每个子网和掩码。与上面的 docker 命令使用的相同表示法。

最新更新