当docker守护进程用尽网络IP地址以在部署撰写环境时分配时会发生什么?

时间:2019-05-01 19:10:04

标签: docker networking docker-compose

当前,我们正在将组合环境堆栈部署到ubuntu服务器。在compose文件中,我们没有定义地址,也没有利用docker compose随附的底层默认docker bridge网络。

当我们将撰写环境部署到开发服务器(IP范围为10.x.x.x)时,基础docker0网络地址始于172.17.0.0

对于随后的每个部署,地址都会递增(即172.18.0.0,然后172.19.0.0)-这是预期的。

我的问题是,当守护程序用完要分配的地址时,会发生什么情况,该进程是否刚从172.17.0.0开始重新启动?还是发生其他事情?我无法在文档中找到任何此类信息。

基本上,我想知道这是我应该主动采取的措施,而不是在出现问题时采取的措施。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

最终会吐出一个错误

  

守护程序的错误响应:在分配给网络的默认值中找不到可用的,不重叠的IPv4地址池

但是,我必须进行实验才能触发该操作;我从来没有在野外遇到过这个问题。

这是实验:

#!/bin/sh
n=32
for i in $(seq "$n"); do
  docker network create "n$i" >/dev/null
done
for i in $(seq "$n"); do
  docker network inspect "n$i" --format '{{ .Name }}: {{ .IPAM.Config }}'
done
for i in $(seq "$n"); do
  docker network rm "n$i" >/dev/null
done

我正在Mac的Docker桌面上运行它。在鲸鱼设置中,默认网络地址为192.168.65.0/24。似乎按顺序分配:

  1. 十六个网络172.16.0.0/16至172.31.0.0/16;然后
  2. 从192.168.0.0/20到192.168.224.0/20的十六个网络

当我实际运行它时,它跳过了192.168.64.0/28(具有默认网络),但也跳过了192.168.192.0/28和192.168.224.0/28;不清楚为什么。即使我的主机本地网络是192.168.1.0/24,它也没有跳过192.168.0.0/28。

看起来docker network create可以选择以CIDR格式指定--subnet,但是似乎没有选择不指定特定地址范围就可以指定块大小的选项。例如,您可以在172.16.0.0/12范围内创建/ 20网络,以拥有更多较小的网络,但是您必须手动分配IP范围。


在实践中,程序和管理员周期都不是免费的:作为操作员,可以在本地系统中容纳并管理的容器数量是有限制的。对于我而言,同时运行多达四个Docker Compose堆栈是很不寻常的,最复杂的Docker Compose网络设置似乎使用默认网络加上两个。将这些网络组合在一起仍然只有12个网络,而大约20个将适合。

如果您确实需要运行或管理许多容器,那么像Kubernetes这样的系统将使管理起来更加容易,但是Kubernetes还附带了一个不同的(复杂的)网络系统,该系统没有遇到此特定限制。如果这确实是您最关心的问题,那么在这里,不同的容器协调器之间会有明显的区别

答案 1 :(得分:0)

对于将来遇到此问题的任何人,似乎在使用网桥网络时,守护程序会从默认池中随机选择一个网络。除非没有清理网络,否则应该没有问题。对于我的特殊情况,默认网络使用的是默认名称。因此,每次都用相同的名称替换网络-此时,先前的网络地址将被释放,因为它们不再被使用。

Docker的网络实用程序utils.gohttps://github.com/docker/libnetwork/blob/a79d3687931697244b8e03485bf7b2042f8ec6b6/ipamutils/utils.go

下面包含utils.go中的代码段:

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}}
)

上面的默认网络是硬编码的,并且似乎在每个部署中都选择了其中之一。