【Docker系列】docke报错 non-overlapping IPv4 address pool among the defaults to assign to the network 解决方法
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
好运气不会凭空而来要么藏在努力里要么藏在坚持里。
文章标记颜色说明
- 黄色重要标题
- 红色用来标记结论
- 绿色用来标记一级论点
- 蓝色用来标记二级论点
1. 问题
1.1 问题描述
docker-compose up -d 命令部署报错如下
Creating network "test_default" with the default driver
could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
1.2 原因
Docker默认支持30个不同的自定义bridge网络如果超过这个限制就会提示上面的错误
1.3 排查步骤
1.3.1 查看docker 网络
使用命令
docker network ls
查看创建的网络可以查看服务器上目前已存在的网络
说明
bridge、host、none是docker默认网络不能删除
bridge桥接网络
默认情况下启动的Docker容器是使用 bridgeDocker安装时创建的桥接网络每次Docker容器重启时会按照顺序获取对应的IP地址就导致重启后Docker的IP地址就变了
none无指定网络
使用 --network=none docker 容器就不会分配局域网的IP这种适合不需要分配IP的情况。
host 主机网络
使用 --network=host此时Docker 容器的网络会附属在主机上两者是互通的。
例如在容器中运行一个Web服务监听8080端口则主机的8080端口就会自动映射到容器中。
1.3.2 查看网络数量
使用命令
docker network ls | wc -l
可以查看到现有数量33
除去 标题栏 、默认的 host、null 正好有30个bridge网络
也说明了 “Docker默认支持30个不同的自定义bridge网络”是这个原因导致
1.4 解决方案
1.4.1 删除没使用的网络
这种方法可以快速解决问题且不用重启docker,
但是对于服务器数量多复杂的情况也存在一定的风险。
不要盲目删除需要确定能删除才去执行。
使用命令
docker network prune
这种方案可以快速解决问题但是也有一定的不足之处。
输入y即可删除
删除之后查询数量可以看到数量减少了
这时候去部署项目即可成功
1.4.2 修改docker默认网络地址
这种方法可以一劳永逸但是如果对docker重启要求比较严格还是要慎重选择。
可以再docker安装成功之后就修改其网络地址即可避免后期该问题的发生。
通常情况下docker服务安装后docker默认使用的网络IP段是172.17.0.1/24
这样容易对实际环境造成冲突。为了解决这个问题可参考以下方法
1.使用如下命令停止docker
systemctl stop docker
2.cat /etc/docker/daemon.json
cat /etc/docker/daemon.json
在文件中添加 default-address-pools如下
"default-address-pools":[ {"base":"172.20.0.0/16","size":24}, {"base":"172.21.0.0/16","size":24}, {"base":"172.22.0.0/16","size":24}, {"base":"172.23.0.0/16","size":24} ]
这个配置将允许Docker分配
172.20.[0-255].0/24
每个网络允许访问256个地址256*4=1024 总共1024个网络。
此外加入后需要 删除现有网络占用执行命令如下
docker network prune
重启docker 后续该问题应该就不会发生了。
service docker restart
1.4.3 yml指定网络
此方法 需要修改 docker-compose.yml 文件
如果项目docker-compose.yml文件较多 会比较麻烦
创建网络
docker network create docker_compose_default_network --subnet 172.20.1.0/24
docker-compose.yaml指定网络
networks: default: external: name: docker_compose_default_network