by Devin Yang
(This article was automatically translated.)

Published - 1 year ago ( Updated - 1 year ago )

Maybe in some old versions of docker environment, when using Docker compose to start the container, you will encounter the following error:



 Error response from daemon: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network

This is actually a symptom of running out of default-address-pools. In these environments, docker-compose will use the private network of Class B by default.
The private IP of segment 172 has a range, from 172.16.0.0 to 172.31.255.255.
That is to say, when we start a docker-compose project, we will eat a private segment of Class B, which is very heroic.
A network segment of class B can have 65,534 hosts, which is equivalent to having 65,534 services.
You can use the command below to check which subnets your network has used.

docker inspect $(docker network ls|tail -n+2|awk '{print $1}') -f "{{.IPAM}}"|sort

Take my MacOS as an example, the result is as follows: (Because deviny/phpenv can use the function of ./all start, so I deliberately built a bunch of env files to simulate)

docker inspect $(docker network ls|tail -n+2|awk '{print $1}') -f "{{.IPAM}}"|sort
{default map[] []}
{default map[] []}
{default map[] [{10.99.0.0/24   map[]}]}
{default map[] [{172.17.1.0/24  172.17.1.1 map[]}]}
{default map[] [{172.18.0.0/16  172.18.0.1 map[]}]}
{default map[] [{172.19.0.0/16  172.19.0.1 map[]}]}
{default map[] [{172.20.0.0/16  172.20.0.1 map[]}]}
{default map[] [{172.21.0.0/16  172.21.0.1 map[]}]}
{default map[] [{172.22.0.0/16  172.22.0.1 map[]}]}
{default map[] [{192.168.112.0/20  192.168.112.1 map[]}]}
{default map[] [{192.168.128.0/20  192.168.128.1 map[]}]}
{default map[] [{192.168.144.0/20  192.168.144.1 map[]}]}
{default map[] [{192.168.160.0/20  192.168.160.1 map[]}]}
{default map[] [{192.168.176.0/20  192.168.176.1 map[]}]}
{default map[] [{192.168.192.0/20  192.168.192.1 map[]}]}
{default map[] [{192.168.208.0/20  192.168.208.1 map[]}]}
{default map[] [{192.168.224.0/20  192.168.224.1 map[]}]}
{default map[] [{192.168.240.0/20  192.168.240.1 map[]}]}

Every time a docker-compose is started, it will automatically run out of a subnet segment, but it will not be full on my MacOS, and it will automatically switch to other network segments, such as segment 192😆.

Assume that in an environment that does not automatically switch subnets when full, take deviny/phpenv's docekr-compose environment as an example, the default web and php in
.env, plus an additional three ssh, mariadb_ssh and redis.
You can think of the achievements as different services in docker-compose.
It’s amazing that there are only five services, and in this setting, my maraidb service is still hung in the ssh service.

In this environment, For four services, building a private segment subnet of class b is a waste of IP, and no cluster is built.

If unfortunately your Docker environment encounters the problem I mentioned, here is my solution for reference:

How to solve


One trick:  Delete the network that is not in use, please pay attention to the prompt message instructions, you can try it if you need it urgently, but I think this is a temporary solution, not the root cause, maybe there is no unused network that can be deleted, Or it's almost full.

docker network prune

Trick 2: Manually specify the network
1. Build the network first, then start the container. The manually built network will not be automatically removed when docker-compose is disabled. At least that's how it is in my environment.

docker network create demo_dlaravel_net --subnet 10.99.0.0/24

Take deviny/phpenv as an example. His Project is demo, so there will be a demo_dlaravel_net network, so in the above command, my network name is demo_dlaravel_net.
Please set according to the folder name and network name in your own docker-compose.yml.

deviny/ phpenv is not used by everyone, here is my custom.yml for reference, maybe you will be more interested

version: '3.6'
services:
#=== web service ======================
 web:
  build:
    context: ./dockerfiles
    dockerfile: Dockerfile-nginx
    args:
      USER_ID: ${USER_ID-1000}
      GROUP_ID: ${GROUP_ID-1000}
  image: ${PROJECT}_nginx
  dns: 8.8.8.8
  depends_on:
    - php
  ports:
    - ${HTTP_PORT-1050}:80
    #- ${HTTPS_PORT-1250}:443
  volumes:
  - ${FOLDER-./project}:/var/www/html
  - ./etc:/etc/nginx/conf.d
  networks:
    - dlaravel_net

#=== php service ==========================
 php:
  build:
    context: ./dockerfiles
    dockerfile: Dockerfile-php-7.4-${CPU-x86_64}
    args:
      USER_ID: ${USER_ID-1000}
      GROUP_ID: ${GROUP_ID-1000}
  image: ${PROJECT}_php
  volumes:
    - ./etc/php:/usr/local/etc/php/conf.d
    - ${FOLDER-./project}:/var/www/html
    - ./etc/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf
    - ./etc/cache:/home/dlaravel/.composer/cache
    - ./etc/supervisor:/etc/supervisor/conf.d
  environment:
    - TZ=Asia/Taipei
    - project=${HOST-localhost}
  command: ["sudo", "/usr/bin/supervisord"]
  networks:
    dlaravel_net:
#=== top-level dlaravel_netowks key ======================
networks:
    dlaravel_net:


Third method: This is a great deal, directly adjust daemon.json, but this requires restarting docker.
Linux environment is in
/etc/docker/daemon.json

MacOS environment is in
~/.docker/daemon.json

For example: like me , add a bunch of subnets to the Linux host

    "default-address-pools": [
        {"base":"172.17.1.0/24","size":24},
        {"base":"172.17.2.0/24","size":24},
        {"base":"172.17.3.0/24","size":24},
        {"base":"172.17.4.0/24","size":24},
        {"base":"172.17.5.0/24","size":24},
        {"base":"172.17.6.0/24","size":24},
        {"base":"172.17.7.0/24","size":24},
        {"base":"172.17.8.0/24","size":24},
        {"base":"172.17.9.0/24","size":24},
        {"base":"172.17.10.0/24","size":24},
        {"base":"172.17.11.0/24","size":24},
        {"base":"172.17.12.0/24","size":24},
        {"base":"172.17.13.0/24","size":24},
        {"base":"172.17.14.0/24","size":24},
        {"base":"172.17.15.0/24","size":24},
        {"base":"172.17.16.0/24","size":24},
        {"base":"172.17.17.0/24","size":24},
        {"base":"172.17.18.0/24","size":24},
        {"base":"172.17.19.0/24","size":24},
        {"base":"172.17.20.0/24","size":24},
        {"base":"172.17.21.0/24","size":24},
        {"base":"172.17.22.0/24","size":24},
        {"base":"172.17.23.0/24","size":24},
        {"base":"172.17.24.0/24","size":24},
        {"base":"172.17.25.0/24","size":24},
        {"base":"172.17.26.0/24","size":24},
        {"base":"172.17.27.0/24","size":24},
        {"base":"172.17.28.0/24","size":24},
        {"base":"172.17.29.0/24","size":24},
        {"base":"172.17.30.0/24","size":24},
        {"base":"172.17.31.0/24","size":24},
        {"base":"172.17.32.0/24","size":24},
        {"base":"172.17.33.0/24","size":24},
        {"base":"172.17.34.0/24","size":24},
        {"base":"172.17.35.0/24","size":24},
        {"base":"172.17.36.0/24","size":24},
        {"base":"172.17.37.0/24","size":24},
        {"base":"172.17.38.0/24","size":24},
        {"base":"172.17.39.0/24","size":24},
        {"base":"172.17.40.0/24","size":24}
    ]

If you use the command to check again, there are many subnet masks that have become 24, and nerver be run out any more them all😆.

$ docker inspect $(docker network ls|tail -n+2|awk '{print $1}') -f "{{.IPAM}}"|sort
{default map[] []}
{default map[] []}
{default map[] [{10.99.33.0/24  10.99.33.1 map[]}]}
{default map[] [{172.17.10.0/24  172.17.10.1 map[]}]}
{default map[] [{172.17.1.0/24   map[]}]}
{default map[] [{172.17.12.0/24  172.17.12.1 map[]}]}
{default map[] [{172.17.16.0/24  172.17.16.1 map[]}]}
{default map[] [{172.17.2.0/24  172.17.2.1 map[]}]}
{default map[] [{172.17.21.0/24  172.17.21.1 map[]}]}
{default map[] [{172.17.25.0/24  172.17.25.1 map[]}]}
{default map[] [{172.17.4.0/24  172.17.4.1 map[]}]}
{default map[] [{172.17.6.0/24  172.17.6.1 map[]}]}
{default map[] [{172.17.7.0/24  172.17.7.1 map[]}]}
{default map[] [{172.17.8.0/24  172.17.8.1 map[]}]}
{default map[] [{172.17.9.0/24  172.17.9.1 map[]}]}
{default map[] [{172.18.0.0/16  172.18.0.1 map[]}]}
{default map[] [{172.25.0.0/16  172.25.0.1 map[]}]}

Tags: docker phpenv

Devin Yang

Feel free to ask me, if you don't get it.:)

No Comment

Post your comment

Login is required to leave comments

Similar Stories


docker

How to start HAProxy with Docker on Raspberry

Raspberry is very cheap and has quite a lot of applications, for example, some people use it as a Wi-Fi router, For game consoles, monitors and many other IoT-related applications, I use it as a HAProxy. Long story short, since I have an old Windows server running old versions of PHP and Apache, and can't set up HTTPS certificates, I wanted to say Help through HAProxy. Let this old server also have https URL, So to share my docker-compose.yml configuration.

docker, api

Introduction to Swagger

The best APIs are built using the Swagger tool, This article introduces how to use docker to execute swagger-ui and editor, let us create a testable API file. In the docker environment, we can easily start the swagger editor and user interface.

laravel,docker

How to customize Laravel pagination

Recently, I have been free, and I want to adjust the arrows on the upper and lower pages of the website. If you don’t know how to customize Laravel’s pagination, You can take a look at a short three-minute introduction on how I customize Laravel's pagination.