创建网关时(例如使用 Compose 文件时)Docker 可以使用哪些 IP 地址范围

s.k*_*s.k 5 docker docker-compose docker-network

我有一个天真的问题,但我注意到通过使用一些 Compose 文件,docker 以表单172.x.0.1为我的项目的所有网络创建网关地址。x通常总是(?)递增(除非重新启动docker服务),从18开始(因为默认桥接网络使用17)直到......一些我在文档中无法弄清楚的数字。之后,docker 跳转到 形式的网关192.168.y.1,在这里,我再次无法弄清楚ydocker 可以使用哪些值范围,以及它在所有这些范围中选择网关地址的策略是什么。

我的强烈印象是它只选择私有IP地址。但我还没有看到诸如 之类的地址10.a.b.c。

任何人都可以向我解释一下,最好有一些官方资源,docker 在创建桥接网络时实际上如何选择网关地址(特别是在 Compose 文件的情况下),docker 可用的所有地址池是什么(以及是否可以手动定义或限制这些范围)?

我查阅的一些页面没有取得太大成功:
https://docs.docker.com/network/
https://docs.docker.com/network/bridge/
https://docs.docker.com/network/network-教程独立/
https://docs.docker.com/compose/networking/ https://github.com/compose-spec/compose-spec/blob/master/spec.md

s.k*_*s.k 5

似乎在那一小段代码中隐藏着一些“解释”:

var (
    // PredefinedLocalScopeDefaultNetworks contains a list of 31 IPv4 private networks with host size 16 and 12
    // (172.17-31.x.x/16, 192.168.x.x/20) which do not overlap with the networks in `PredefinedGlobalScopeDefaultNetworks`
    PredefinedLocalScopeDefaultNetworks []*net.IPNet
    // PredefinedGlobalScopeDefaultNetworks contains a list of 64K IPv4 private networks with host size 8
    // (10.x.x.x/24) which do not overlap with the networks in `PredefinedLocalScopeDefaultNetworks`
    PredefinedGlobalScopeDefaultNetworks []*net.IPNet
    mutex                                sync.Mutex
    localScopeDefaultNetworks            = []*NetworkToSplit{{"172.17.0.0/16", 16}, {"172.18.0.0/16", 16}, {"172.19.0.0/16", 16},
        {"172.20.0.0/14", 16}, {"172.24.0.0/14", 16}, {"172.28.0.0/14", 16},
        {"192.168.0.0/16", 20}}
    globalScopeDefaultNetworks = []*NetworkToSplit{{"10.0.0.0/8", 24}}
)
Run Code Online (Sandbox Code Playgroud)

来源:https://github.com/moby/libnetwork/blob/a79d3687931697244b8e03485bf7b2042f8ec6b6/ipamutils/utils.go#L10-L22

这是我能想到的最好的,因为我还没有找到任何关于此的官方文档......

似乎也可以通过创建一个/etc/docker/daemon.json包含以下内容的文件来强制 Docker 使用一系列允许的子网:

 {
     "default-address-pools": [
         {"base": "172.16.0.0/16", "size": 24}
     ]
 }
Run Code Online (Sandbox Code Playgroud)

也可以指定多个地址池:

 {
     "default-address-pools": [
         {"base": "172.16.0.0/16", "size": 24},
         {"base": "xxx.xxx.xxx.xxx/yy", "size": zz} // <- additional poll can be stacked, if needed
     ]
 }
Run Code Online (Sandbox Code Playgroud)

docker完成后不要忘记重新启动服务:

$ sudo service docker restart
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请访问: https://capstonec.com/2019/10/18/configure-custom-cidr-ranges-in-docker-ee/