DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

pack build 报 fully subnetted:地址池只能分出一个子网

pack build 创建临时网络报 fully subnetted 时,核对 default-address-pools 的 base 与 size、现有网络和宿主路由,再安排容量调整及回退。

pack 构建镜像时,在创建临时 bridge 网络这一阶段失败,错误包含 all predefined address pools have been fully subnetted。如果 Docker 刚配置过 default-address-pools,应先检查 base 与 size,而不是马上清理所有容器和网络。

一种具体情况是 base 为一个 /24 网段,size 也为 24:整个池只能分出一个 /24 子网。它被已有网络占用后,就没有第二个子网给新的构建网络。池里还有未分配给容器的 IP,不代表还能创建另一张网络。

以下针对 Docker 本地网络的自动子网分配,以及需要创建临时网络的 pack 构建。错误若来自其他网络驱动或连接另一个 Docker 服务,先确认实际分配方。

数的是子网,不是容器地址

下面是容量不足的配置示例,不建议采用:

{
  "default-address-pools": [
    { "base": "172.30.0.0/24", "size": 24 }
  ]
}

base 表示可分配的整体网段,size 是每张网络获得的子网前缀长度。忽略占用和冲突时,一个 /16 的池划成 /24,理论上能得到 256 个子网;/24 划成 /24 只有一个。这个数量不是每张网络可放多少容器,网关及保留地址另占容量。

pack 0.35 附近的构建流程开始使用隔离的临时 bridge 网络。升级后第一次触发这个错误,可能只是新流程暴露了旧池的容量限制,并不说明升级损坏了 Docker。当前工具的行为仍需按所用版本核对。

把配置、现有网络与宿主路由对应起来

以下是只读检查入口:

docker context show
docker info
docker network ls
ip route

确认正在查实际承接构建的 Docker 服务。查看 info 中的 Default Address Pools,再针对相关网络使用 docker network inspect 网络名,核对 IPAM.Config 的子网、容器连接和项目标签。客户端所在电脑的路由不能代替远端 Docker 宿主机的路由。

还要比较宿主机、VPN、办公室和业务内网的路由范围。Docker 会尽量避开宿主已使用的前缀,但复杂路由环境仍可能需要主动规划。账面上能划出很多子网,却大部分与路由冲突时,不能简单认为还有足够可用空间。

网络列表里出现多个 pack 临时名称时,检查它们是否属于已结束或中断的构建、是否仍有连接或业务依赖。正常构建网络应按工具的生命周期清理;不同版本和异常中断可能留下残余。不能只因名称看着随机,就判定全部可删。

为新增网络规划独立容量

容量确实不足时,选择经过确认、不与现有路由冲突的私有网段,并按每张网络预计的容器数选择子网大小。例如下面仅展示一个 /16 划分 /24 的结构:

{
  "default-address-pools": [
    { "base": "172.30.0.0/16", "size": 24 }
  ]
}

这里的地址不保证适合你的环境。保留 daemon.json 其他设置,合并修改相关字段,不能用示例覆盖整份文件。也要检查服务启动参数是否重复配置同一个选项。

变更前保存 Docker 配置、现有网络清单、部署配置及数据备份安排。当前 dockerd 支持 --validate --config-file 在不启动守护进程的情况下校验配置;它能发现配置项和格式错误,不能证明地址池与全部业务路由兼容。

按实际 Docker 安装方式安排使配置生效的维护窗口,重启守护进程可能影响正在运行的容器及构建。默认池设置用于后续自动分配,不会替现有网络重新编号。不要因此删除仍在使用的旧网络;需要迁移时,另行安排网络与服务重建。

指定现有网络是有条件的替代

pack 的 --network 可以让构建接入已有网络。它不会自动创建一个还不存在的命名网络,应先确认该网络存在、能满足构建的访问需求,并符合构建隔离设计。

将构建接入通用或业务共享网络,可能改变它能访问的其他容器和服务。不能为了躲过池容量问题,就无条件切回共享 default 网络,尤其在并发构建或处理不受信任代码时。受控的专用构建网络可以作为评估后的方案,但仍需管理其生命周期。

若仅有少量已确认无人使用的残余网络,可逐项按既有清理流程移除。全局 prune 会影响其他项目,不应用强制系统清理或删除卷来解决子网数量问题。

验收新分配,也保留旧业务连接

重新从原构建入口检查临时网络能否创建、构建各阶段能否完成,结束后资源是否按预期清理;同时确认旧容器、VPN和内部服务连通性没有被新路由覆盖。只有看到网络创建成功,尚不足以验收镜像构建结果。

回退时恢复原 Docker 配置并按维护流程生效。本轮已经创建的新网络不会因此自动迁回旧池;移除前确认没有容器或任务仍在使用。旧池若本来只有一个可用子网,配置回退也会带回原来的容量限制。