当前,我们正在将组合环境堆栈部署到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
开始重新启动?还是发生其他事情?我无法在文档中找到任何此类信息。
基本上,我想知道这是我应该主动采取的措施,而不是在出现问题时采取的措施。
提前谢谢!
答案 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。似乎按顺序分配:
当我实际运行它时,它跳过了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.go
:
https://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}}
)
上面的默认网络是硬编码的,并且似乎在每个部署中都选择了其中之一。