记录一下 docker-compose 使用中容易遇到的 Network Address Pool 的问题。通常 self-hosted 都会有个主机,上面跑着一堆的 Docker Compose 的 stack。

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

原因是 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
    }
  ]
}

这个 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: