目录

1. 问题

1.1 问题描述

1.2 原因:

1.3 排查步骤: 

1.3.1 查看docker 网络

1.3.2 查看网络数量 

1.4 解决方案

1.4.1 删除没使用的网络

1.4.2 修改docker默认网络地址

1.4.3 yml指定网络

2.投票


 

好运气不会凭空而来,要么藏在努力里,要么藏在坚持里。

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记一级论点
  • 蓝色:用来标记二级论点

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容器,是使用 bridge

Docker安装时创建的桥接网络,每次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 

2.投票

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐