Photo by Denny Müller / Unsplash

Docker Compose Network Address Pools

Self Hosted 自托管
/ Docker
Oct 17, 2024 ~

记录一下Dock Compose使用中容易遇到的 Network Address Pool 的问题。

之前的文章中就提到过,当一台机器上用 Docker Compose 开启的 stack 太多的时候(也不需要很多,十几个左右,就容易产生 network reachability 的问题。甚至可能导致主机直接就不可访问的。

尝试Docker + LXC + ZFS + Proxmox
起因仅仅是因为想要Host新的服务,就是前文提到的 Immich,然后对现在的 Docker + VM + ZFS + Proxmox的方案有点点不满意,觉得每次折腾一个服务的时候,还是很容易把其他的服务一并搞挂了,尤其是Docker的Network有个有点蛋疼的问题,所以想着干脆一不做二不休,把每个服务都单独拿出来,装在一个LXC里面。而Docker其实仅仅是因为觉得Deploy起来方便,再加上Portainer CE版本管理起来,有个UI也确实顺手一些。于是就开启了这次的折腾之旅。 先说结论 不推荐这样做。 最主要的原因:Docker的storage driver在基于ZFS的LXC上面,基本上只能用VFS。这个driver速度慢,空间占用高,对家用SSD对ZFS尤其不友好。Immich的Stack一度因为磁盘速度太慢,根本启动不起来。后来还是在LXC的subvol上面关了zfs的sync(i.e standard -> disable)才能跑起来。而一个Nginx Proxy Manager,跑起来需要大概20GB的空间。如此巨大的空间消耗,和如此慢的磁盘性能,居高不下的

原因是 Docker 默认的第一个 Network Address Pool 用光了,而第二个 Pool 是 192.168 网段的。这个网段就容易和本地的LAN地址出现冲突。

这个Network Address Pool 可以通过 /etc/docker/daemon.json 配置。默认这个文件并不存在,但是其行为和下面这个 config 等效:

{
  "default-address-pools" : [
    {
      "base" : "172.17.0.0/12",
      "size" : 16
    },
    {
      "base" : "192.168.0.0/16",
      "size" : 20
    }
  ]
}

default network address pool

这个 config 的意思是:

  • 第一个网络地址池:
    • 每个网络都是 /16 大小的 (相当不小了)
    • 所有网络的 base 都是 172.17.0.0/12
    • 2^(16-12) -> 16 networks in total
    • 考虑 docker 默认有一个 default bridge,最多也就只能有15个新的network。而每一个 Docker Compose (i.e. stack),都会创建至少一个 Network。有的可能还需要不止一个。
  • 第二个地址池:
    • Base: 192.168.0.0/16。同时每个 network 小很多,最多还是16个networks.

因此如果需要更多的 Docker compose stacks,那么最简单的做法就是修改这个 config:

{
  "default-address-pools":
  [
    {"base":"10.10.0.0/16","size":24}
  ]
}
  • 2^(24-16) -> 最多 256 个networks。对于一台主机(一台用来穷折腾玩自托管的主机)来说,应该是足够了。而代价就是每个 network 最多只有 255 个IP,不过对于仅仅随便跑跑简单的 stack,应该也是够了。

References:

The definitive guide to docker’s default-address-pools option
What the default pools are, why you can’t make more than 31 bridge networks, & how to fix that.

标签