Docker问题答疑

could not find an available, non

2022-07-14  本文已影响0人  爱恨_交加

背景

在一台服务器上,存在多个应用并且都是通过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)。

  1. 把多余的网络移除。
docker network rm <network_name>
  1. /etc/docker/daemon.json中增加default-address-pools的值,然后重启docker。
  2. 在应用服务启动前,为其创建没有网段冲突的网络,然后在其的docker-compose.yml中配置刚刚创建的网络。如:
docker network create --subnet "172.100.0.0/16" mynet
  1. docker-compose.yml中指定网络并使用
上一篇下一篇

猜你喜欢

热点阅读