背景
在一台服务器上,存在多个应用并且都是通过docker-compose启动。为了避免网段(IP)冲突,事先在/etc/docker/daemon.json
中添加了参数default-address-pools
,如下:
{
"default-address-pools": [
{
"base": "172.100.0.0/16",
"size": 24
},
{
"base": "172.101.0.0/16",
"size": 24
},
{
"base": "172.102.0.0/16",
"size": 24
}
]
}
在该服务器上再部署几个应用,并且都是通过docker-compose启动,此时应用启动失败,提示如下错误:
ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
猜想:假设部署应用后先不启动,直接重启服务器,让docker守护进程拉起应用,此时部分应用应该会启动失败。
原因
假设服务器上docker网络有如下:
[root@localhost docker]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b820882cd705 bin_a_default bridge local
53feb3497270 bin_b_default bridge local
b820882cd701 bin_d_default bridge local
53feb3497272 bin_e_default bridge local
b820882cd703 bin_f_default bridge local
2fc12b3e7fd5 bridge bridge local
4de99102b93b host host local
f408314129a1 none null local
默认情况下,docker的bridge网络需要一个网段,每个docker-compose启动服务都需要一个网络。此时default-address-pools
中只有3个网段,但是现在需要6个网段(bridge、bin_a_default、bin_b_default、bin_c_default、bin_d_default、bin_e_default、bin_f_default),所以就出现上述的错误提示。
提示:通过如上的分析,每当我们在服务器上用docker-compose新启动一个服务(原先的创建network还存在),就需要解决这个网段不够的问题
解决办法
本质:为服务器上的应用启动提供足够IP地址(IPv4 address pool)。
- 把多余的网络移除。
docker network rm <network_name>
- 在
/etc/docker/daemon.json
中增加default-address-pools
的值,然后重启docker。 - 在应用服务启动前,为其创建没有网段冲突的网络,然后在其的
docker-compose.yml
中配置刚刚创建的网络。如:
docker network create --subnet "172.100.0.0/16" mynet
- 在
docker-compose.ym
l中指定网络并使用
网友评论