news 2026/3/23 2:29:35

使用Docker Compose 部署时网络冲突问题排查与解决

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用Docker Compose 部署时网络冲突问题排查与解决

问题描述

今天在使用 Docker Compose 部署周报系统时,遇到了网络创建失败的错误:

错误类型一:无可用地址池

failed to create network deploy_weekly-network: Error response from daemon: could not find an available, non-overlapping IPv4 address pool among the defaults to assign

说明:这个错误发生在让 Docker 自动分配网络地址时,Docker 的默认地址池(172.17.0.0/16, 172.18.0.0/16, 172.19.0.0/16 等)都被占用了,无法找到可用的非重叠 IPv4 地址池。

错误类型二:子网地址冲突

failed to create network deploy_weekly-network: Error response from daemon: Pool overlaps with other one on this address space

问题分析

1. 初始配置

最初的docker-compose.yml配置中指定了固定的网络子网:

networks:weekly-network:driver:bridgeipam:driver:defaultconfig:-subnet:172.20.0.0/24gateway:172.20.0.1

2. 错误原因

Docker 网络子网冲突的主要原因:

错误类型一:could not find an available, non-overlapping IPv4 address pool among the defaults to assign
  • 默认地址池耗尽:Docker 的默认地址池(172.17.0.0/16 到 172.31.0.0/16)已被全部占用
  • 大量容器部署:服务器上运行了大量 Docker 容器,消耗了所有默认网络段
  • 未清理网络:已删除的容器对应的网络未被清理,仍然占用地址池

Docker 默认地址池

172.17.0.0/16 (bridge 网络默认) 172.18.0.0/16 172.19.0.0/16 ... 172.31.0.0/16

当这些地址段都被占用时,Docker 无法自动分配新的网络。

错误类型二:Pool overlaps with other one on this address space
  • 子网地址重复172.20.0.0/24与系统中已存在的 Docker 网络使用了相同的 IP 地址段
  • 多项目部署:在同一台服务器上运行多个 Docker Compose 项目时,容易产生子网冲突
  • 历史遗留:之前创建的容器或网络未被清理,占用了 IP 地址段

3. 相关警告

同时发现了版本警告:

WARN[0000] /home/jiangcaidu/Exp/deploy/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion

解决方案

方案一:更换子网地址

尝试 1:使用 172.25.0.0/24
networks:weekly-network:driver:bridgeipam:driver:defaultconfig:-subnet:172.25.0.0/24gateway:172.25.0.1

结果:仍然冲突 ❌

尝试 2:使用 10.0.0.0/24
networks:weekly-network:driver:bridgeipam:driver:defaultconfig:-subnet:10.0.0.0/24gateway:10.0.0.1

结果:成功创建 ✅

方案二:移除版本字段

删除过时的version: '3.8'字段:

# 删除这一行# version: '3.8'services:# ...

方案三:使用自动网络分配(备选)

如果不想手动指定子网,可以让 Docker 自动分配:

networks:weekly-network:driver:bridge# 不指定 ipam 配置,让 Docker 自动分配

注意:如果出现"could not find an available, non-overlapping IPv4 address pool among the defaults to assign"错误,说明 Docker 的默认地址池已耗尽。此时必须手动指定子网地址。

方案四:清理未使用的网络

当默认地址池耗尽时,可以先清理未使用的网络:

# 查看所有网络dockernetworkls# 清理未使用的网络dockernetwork prune# 查看网络使用情况dockernetwork inspect bridge

清理后,Docker 可以回收被占用的地址池,重新尝试自动分配。

排查步骤

1. 查看现有网络

dockernetworkls

2. 检查网络详细信息

dockernetwork inspect<网络名称>

3. 清理未使用的网络

dockernetwork prune

4. 完全清理并重新开始

# 停止并删除容器、网络、卷docker-composedown -v# 重新启动docker-composeup -d

最佳实践

1. 子网选择建议

推荐使用以下子网范围,避免冲突:

  • 10.0.0.0/8- 私有网络 A 类地址
  • 172.16.0.0/12- 私有网络 B 类地址(注意:Docker 默认使用 172.17.0.0/16)
  • 192.168.0.0/16- 私有网络 C 类地址

推荐顺序

  1. 优先使用10.x.x.x范围
  2. 其次使用192.168.x.x范围
  3. 最后考虑172.16-31.x.x范围

2. 项目命名规范

为每个项目使用独特的网络名称:

networks:project-name-network:driver:bridge

3. 配置文件优化

  • 移除过时字段:删除version字段
  • 使用环境变量:通过环境变量配置子网,便于不同环境部署
  • 文档化:在 README 中记录使用的子网范围

最终配置

services:mysql:image:mysql:8.4.5container_name:weekly-mysqlrestart:alwaysnetworks:-weekly-networkbackend:build:context:./backenddockerfile:Dockerfilecontainer_name:weekly-backendrestart:alwaysdepends_on:-mysqlnetworks:-weekly-networkfrontend:image:nginx:latestcontainer_name:weekly-frontendrestart:alwaysports:-"5173:80"depends_on:-backendnetworks:-weekly-networknetworks:weekly-network:driver:bridgeipam:driver:defaultconfig:-subnet:10.0.0.0/24gateway:10.0.0.1

经验总结

  1. 网络冲突是常见问题:在多项目部署环境中,网络子网冲突是高频问题
  2. 先检查后配置:在指定子网前,先查看现有网络配置
  3. 使用私有地址:优先使用 RFC 1918 定义的私有地址段
  4. 保持配置简洁:Docker Compose 新版本不需要version字段
  5. 文档化配置:记录每个项目使用的网络配置,便于维护

相关命令速查

# 查看所有网络dockernetworkls# 查看网络详情dockernetwork inspect<网络名称># 清理未使用的网络dockernetwork prune# 创建自定义网络dockernetwork create --driver bridge --subnet10.0.0.0/24 my-network# 连接容器到网络dockernetwork connect<网络名称><容器名称># 断开容器与网络的连接dockernetwork disconnect<网络名称><容器名称># 删除网络dockernetworkrm<网络名称>

参考资源

  • Docker 网络文档
  • Docker Compose 网络配置
  • RFC 1918 - 私有互联网地址分配

如果部署中遇到同样的问题,觉得有帮助,欢迎点赞收藏!有问题欢迎评论区交流~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 22:42:13

不同小波基分解层数的小波变换信号去噪声附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…

作者头像 李华
网站建设 2026/3/16 4:17:04

看完就会,从抓包到接口测试的全过程解析

一、为什么抓包 1、从功能测试角度 通过抓包查看隐藏字段 Web 表单中会有很多隐藏的字段&#xff0c;这些隐藏字段一般都有一些特殊的用途&#xff0c;比如收集用户的数据&#xff0c;预防 CRSF 攻击&#xff0c;防网络爬虫&#xff0c;以及一些其他用途。这些隐藏字段在界面…

作者头像 李华
网站建设 2026/3/16 4:17:00

接口测试用例怎么写?一文1600字教你写一个优秀的接口测试的测试用例

一、用例设计1 1、接口测试概念 接口测试&#xff1a;测试系统间接口的一种测试&#xff0c;测试的对象主要是接口&#xff0c;主要是测试外部系统与所测系统之间以及内部系统之间的交互点 2、接口测试方法 a、可以通过开发脚本代码进行测试 b、可以通过开源免费的接口调用…

作者头像 李华
网站建设 2026/3/16 4:17:02

LoadRunner技巧之思考时间设置

用户访问某个网站或软件&#xff0c;一般不会不停地做个各种操作&#xff0c;例如一次查询&#xff0c;用户需要时间查看查询的结果是否是自己想要的。例如一次订单提交&#xff0c;用户需要时间核对自己填写的信息是否正确等。 也就是说用户在做某些操作时&#xff0c;是会有…

作者头像 李华
网站建设 2026/3/21 10:00:29

AI智能体是否胜任任务?判断何时委派工作的3种方法

你可能已经听说过这样的观点&#xff1a;AI智能体充当人类同事的"协作者"&#xff0c;实际上成为了劳动力的延伸。挑战在于解码它们最适合执行什么工作——这并不是一个简单的问题。 有些任务适合自动化&#xff0c;而另一些则更适合手动处理。但许多任务处于灰色地带…

作者头像 李华
网站建设 2026/3/15 8:59:37

LoadRunner性能测试基本步骤

前言 本文旨在指导初学者使用LoadRunner进行基础的性能测试。 我们在接到一个性能测试任务的时候&#xff0c;需要从以下几点考虑&#xff1a;我们的测试对象是什么&#xff0c;测试要求是什么&#xff0c;测试环境怎么部署的&#xff0c;业务规模如何&#xff0c;哪些业务点是…

作者头像 李华