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

Why do I have to periodically use `docker network prune` to reenable docker mapping ip connections inside a container?

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

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

可见不同的网络。

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

您可以告诉 docker 只从您的 select 子网池中选择网络。您将需要确定您的 VPN、家庭、办公室、咖啡店等使用的子网,然后 select docker 任何这些子网之外的私有 IP 范围。此配置位于桥接网络的 daemon.json 文件中(在 Mac 上,您转到 docker 图标,打开 settings/preferences,转到守护程序,然后高级) 看起来像:

{
  "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) 将用于指定子网大小。

"default-address-pools" 选项出现在 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 命令使用的相同符号。