Error response from daemon: all predefined address pools have been fully subnetted
报错核心是这一句:
failed to create network huoshan_tts_service_default: Error response from daemon: all predefined address pools have been fully subnetted
意思是:
Docker 默认可分配的网段已经用光了,所以 docker compose 想创建 huoshan_tts_service_default 这个网络时,分不出新的子网了。
你的日志前面这些都没问题:
• Dockerfile 正常加载
• 镜像正常 build 完成
• 容器服务也准备好了
真正失败点在:
• Service huoshan-tts-service Built
• Network huoshan_tts_service_default Error
所以这是 Docker 网络资源耗尽,不是 Python、Dockerfile、requirements.txt 的错误。
⸻
为什么会这样
一般有几个常见原因:
1)机器上残留了很多 Docker 网络
你可能反复执行过很多项目的 docker compose up,每个项目都会自动建一个 xxx_default 网络,久了就堆满了。
2)自定义网络很多,没有清理
有些旧项目已经不用了,但 network 还留着。
3)Docker 默认地址池太小
Docker 默认 bridge 网络会从预定义地址池里切子网,如果机器长期跑很多 compose 项目,就可能耗尽。
⸻
先怎么排查
先看当前网络数量:
docker network ls
再看哪些网络还挂着容器:
docker network inspect <网络名>
如果你只是想快速恢复,一般先清理不用的网络。
⸻
最常用解决办法
方案一:清理没在用的 Docker 网络
这个最常见、最安全。
docker network prune
它会删除 未被容器使用的网络。
如果你确认很多旧项目都不用了,可以执行:
docker system prune
如果想更彻底一点:
docker system prune -a
注意:
• docker network prune 主要清理网络
• docker system prune 还会清理停止容器、无用镜像、缓存等
先建议你用这个:
docker network prune -f
然后再重新执行:
docker compose up -d
⸻
方案二:删除指定旧项目网络
先看有哪些网络:
docker network ls
如果看到很多类似:
xxx_default
yyy_default
zzz_default
可以删除不用的:
docker network rm 网络名
例如:
docker network rm old_project_default
前提是这个网络没有被运行中的容器占用。
⸻
方案三:给当前 compose 显式指定网络段
如果你不想依赖 Docker 自动分配,可以在 docker-compose.yml 里手动指定一个网段。
例如:
services:
huoshan-tts-service:
build: .
networks:
- tts_net
networks:
tts_net:
driver: bridge
ipam:
config:
- subnet: 172.30.100.0/24
这样 Docker 就不去自动挑默认子网了。
但要注意:
• 这个网段不能和现有 Docker 网络冲突
• 也不能和服务器局域网、VPC 网段冲突
⸻
方案四:扩大 Docker 默认地址池
如果这台服务器会长期跑很多 compose 项目,建议改 Docker 守护进程配置。
编辑:
/etc/docker/daemon.json
例如配置成:
{
"default-address-pools": [
{
"base": "172.80.0.0/16",
"size": 24
},
{
"base": "192.168.0.0/16",
"size": 24
}
]
}
然后重启 Docker:
systemctl restart docker
这个方案适合长期治理,但要注意:
• 重启 Docker 会影响当前运行中的容器
• 地址池不能和现有网络环境冲突
⸻
你现在最建议的处理顺序
先执行这几步:
docker network ls
docker network prune -f
docker compose up -d
如果还不行,再看是否有大量旧网络:
docker network ls
如果网络确实非常多,再考虑:
• 删除无用项目网络
• 或者在 compose 里手动指定 subnet
• 或者修改 /etc/docker/daemon.json 扩大地址池
⸻
一句话总结
这不是代码错误,也不是镜像构建错误,而是:
Docker 可用的默认网络子网分配完了,导致 compose 无法创建项目默认网络。
最直接的修复通常是:
docker network prune -f
然后重试。
更多推荐



所有评论(0)