启动两个docker-compose实例时创建网络卡住是什么问题?
问题原因分析与解决方案
首先可以排除端口配置问题:端口冲突的报错会出现在容器启动阶段,不会卡在网络创建环节,你修改端口号的操作没有问题,问题和端口配置无关。
可能的触发原因及对应解决方法:
原因1:Docker默认网桥地址池耗尽
Docker默认按顺序分配172.17.0.0/16、172.18.0.0/16这类子网段给新建的网桥网络,如果你之前创建过大量未清理的Docker网络,可用子网耗尽就会导致网络创建卡住。
验证命令:# 查看已存在的网络列表 docker network ls # 查看指定网络的子网分配情况 docker network inspect <已存在的网络名>解决方法:执行以下命令清理所有未被容器使用的闲置网络,释放地址池资源:
docker network prune原因2:iptables/nftables规则冲突
Docker创建网桥时会自动写入iptables转发规则,如果你的系统开启了firewalld、ufw等防火墙,或者系统默认使用nftables(CentOS 8+/Debian 10+默认),和你使用的Docker 20.10.8版本存在兼容性问题,就会导致规则写入阻塞。
解决方法:临时关闭防火墙测试启动是否正常,若正常可将Docker的默认子网段加入防火墙白名单;也可以升级Docker到20.10最新稳定版修复nftables兼容性问题。原因3:Docker daemon状态异常
长时间运行的Docker daemon可能出现资源泄露、状态不一致的问题,导致网络创建操作阻塞。
解决方法:重启Docker daemon后再尝试启动实例:systemctl restart docker
长期优化方案
如果需要长期创建大量同类实例,可以手动调整Docker的默认地址池配置,在/etc/docker/daemon.json中添加如下内容:
{ "default-address-pools": [ {"base": "172.16.0.0/12", "size": 24} ] }
修改后重启Docker daemon即可获得更多可用的子网段。
内容的提问来源于stack exchange,提问作者tikurilla

