为什么我必须定期使用“docker network prune”在容器内重新启用docker映射ip连接?

为什么我必须定期使用“docker network prune”在容器内重新启用docker映射ip连接?,docker,docker-for-mac,Docker,Docker For Mac,我大部分时间都在使用vpn,我注意到有时外部网络连接会失败,比如从远程位置安装到容器中会导致连接被拒绝docker network prune允许docker重新映射连接,然后我可以继续我正在做的任何事情,但是在引擎盖下面到底发生了什么?使用docker for mac,如果相关的话。Adocker network prune删除任何未使用的网络,然后使用类似于docker compose或docker stack deploy的内容重新部署项目将重新创建网络。当docker创建一个网络时,它会

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

A
docker network prune
删除任何未使用的网络,然后使用类似于
docker compose
docker stack deploy的内容重新部署项目将重新创建网络。当docker创建一个网络时,它会从一个私有IP池中进行挑选,并排除它当前可以路由到的任何网络。最后一部分是当您连接和断开VPN,或者在docker可见的具有不同网络的不同位置工作时所发生的变化

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

您可以告诉docker仅从您选择的子网池中选择网络。您需要识别VPN、家庭、办公室、咖啡馆等使用的子网,然后为docker选择这些子网之外的私有IP范围。此配置位于桥接网络的daemon.json文件中(在Mac上,转到docker图标,打开设置/首选项,转到daemon,然后进入高级),如下所示:

{
  "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或名为bridge的网桥网络。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
如果您需要更改这些,则需要删除并重新创建swarm

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