web-dev-qa-db-fra.com

Docker "ERREUR: impossible de trouver un pool d'adresses IPv4 disponible et ne se chevauchant pas parmi les valeurs par défaut à affecter au réseau"

J'ai un répertoire apkmirror-scraper-compose avec la structure suivante:

.
├── docker-compose.yml
├── privoxy
│   ├── config
│   └── Dockerfile
├── scraper
│   ├── Dockerfile
│   ├── newnym.py
│   └── requirements.txt
└── tor
    └── Dockerfile

J'essaie de lancer le docker-compose.yml suivant:

version: '3'

services:
  privoxy:
    build: ./privoxy
    ports:
      - "8118:8118"
    links:
      - tor

  tor:
    build:
      context: ./tor
      args:
        password: ""
    ports:
      - "9050:9050"
      - "9051:9051"

  scraper:
    build: ./scraper
    links:
      - tor
      - privoxy

Dockerfile pour tor est

FROM Alpine:latest
EXPOSE 9050 9051
ARG password
RUN apk --update add tor
RUN echo "ControlPort 9051" >> /etc/tor/torrc
RUN echo "HashedControlPassword $(tor --quiet --hash-password $password)" >> /etc/tor/torrc
CMD ["tor"]

que pour privoxy est

FROM Alpine:latest
EXPOSE 8118
RUN apk --update add privoxy
COPY config /etc/privoxy/config
CMD ["privoxy", "--no-daemon"]

config est constitué des deux lignes

listen-address 0.0.0.0:8118
forward-socks5 / tor:9050 .

et le Dockerfile pour scraper est

FROM python:2.7-Alpine
ADD . /scraper
WORKDIR /scraper
RUN pip install -r requirements.txt
CMD ["python", "newnym.py"]

requirements.txt contient la seule ligne requests. Enfin, le programme newnym.py est conçu pour tester simplement si le changement d'adresse IP à l'aide de Tor fonctionne:

from time import sleep, time

import requests as req
import telnetlib


def get_ip():
    IPECHO_ENDPOINT = 'http://ipecho.net/plain'
    HTTP_PROXY = 'http://privoxy:8118'
    return req.get(IPECHO_ENDPOINT, proxies={'http': HTTP_PROXY}).text


def request_ip_change():
    tn = telnetlib.Telnet('tor', 9051)
    tn.read_until("Escape character is '^]'.", 2)
    tn.write('AUTHENTICATE ""\r\n')
    tn.read_until("250 OK", 2)
    tn.write("signal NEWNYM\r\n")
    tn.read_until("250 OK", 2)
    tn.write("quit\r\n")
    tn.close()


if __== '__main__':
    dts = []
    try:
        while True:
            ip = get_ip()
            t0 = time()
            request_ip_change()
            while True:
                new_ip = get_ip()
                if new_ip == ip:
                    sleep(1)
                else:
                    break
            dt = time() - t0
            dts.append(dt)
            print("{} -> {} in ~{}s".format(ip, new_ip, int(dt)))
    except KeyboardInterrupt:
        print("Stopping...")
        print("Average: {}".format(sum(dts) / len(dts)))

Le docker-compose build se construit correctement, mais si j'essaie docker-compose up, j'obtiens le message d'erreur suivant:

Creating network "apkmirrorscrapercompose_default" with the default driver
ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network

J'ai essayé de chercher de l'aide sur ce message d'erreur, mais je n'en ai trouvé aucun. Qu'est ce qui cause cette erreur?

76
Kurt Peek

Après Peter Hauge 's comment , en exécutant docker network ls, j'ai vu (entre autres lignes) ce qui suit:

NETWORK ID          NAME                                    DRIVER              SCOPE
dc6a83d13f44        bridge                                  bridge              local
ea98225c7754        docker_gwbridge                         bridge              local
107dcd8aa889        Host                                    Host                local

La ligne avec NAME et DRIVER en tant que Host semble être ce à quoi il fait référence avec "les réseaux déjà créés sur votre hôte". Donc, après https://Gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b4 , j'ai exécuté la commande

docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')

Maintenant, docker-compose up fonctionne (bien que newnym.py génère une erreur).

42
Kurt Peek

Je l'ai vu suggérer que docker soit au maximum de ses réseaux créés. La commande docker network Prune peut être utilisée pour supprimer tous les réseaux non utilisés par au moins un conteneur.

Mon problème a fini par être, comme Robert commenté: un problème avec openvpn service openvpn stop 'a résolu' le problème.

154
bbeecher

J'ai rencontré ce problème parce que j'avais OpenVPN en cours d'exécution. Dès que j'ai tué OpenVPN, docker-compose up s'est déclenché et l'erreur a disparu.

100
DrDamnit

J'ai le même problème. J'ai couru docker system Prune -a --volumes, docker network Prune, mais les deux ne m'ont pas aidé.
J'utilise un réseau privé virtuel, je le désactive, puis le menu fixe démarre normalement et il peut créer un réseau. Après tout, vous pouvez réactiver le VPN

24
madjardi

Comme indiqué dans d'autres réponses, le réseau local bridge par défaut de Docker ne prend en charge que 30 réseaux différents (chacun d'eux identifiable de manière unique par son nom). Si vous ne les utilisez pas, alors docker network Prune fera l'affaire.

Toutefois, vous voudrez peut-être créer plus de 30 conteneurs, chacun avec son propre réseau. Si cela vous intéressait, vous auriez besoin de définir un réseau overlay. C'est un peu plus compliqué mais extrêmement bien documenté ici .

12
Carlos Segarra

J'ai rencontré ce problème alors que OpenVPN fonctionnait et j'ai trouvé une solution qui ne devrait PAS arrêter/démarrer le serveur OpenVPN.

Idée selon laquelle vous devez spécifier le sous-réseau à utiliser. Dans docker-compose.yml écrivez:

networks:
  default:
    driver: bridge
    ipam:
      config:
        - subnet: 172.177.57.0/24

C'est ça. Maintenant, default réseau sera utilisé et si votre VPN ne vous a pas attribué quelque chose du sous-réseau 172.177.57.*, vous vous en sortez bien.

9
Arenim
  1. Vérifiez si un autre conteneur est en cours d'exécution. Si oui, procédez comme suit: docker-compose down
  2. Si un réseau privé virtuel est connecté, déconnectez-le et essayez à nouveau d'utiliser le conteneur de menu fixe:

    docker-compose up -d container_name
    
8

J'ai eu un problème identique avec le même message d'erreur mais la solution avec la suppression des réseaux Docker inutilisés ne m'a pas aidé. J'ai supprimé tous les réseaux de menu fixe non définis par défaut (ainsi que toutes les images et tous les conteneurs), mais cela n'a pas aidé - Docker n'a toujours pas été en mesure de créer un nouveau réseau.

Le problème était dû aux interfaces réseau laissées après l'installation d'OpenVpn. (Il était précédemment installé sur l'hôte.) Je les ai trouvés en exécutant la commande ifconfig:

...
tun0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:10.8.0.2  P-t-P:10.8.0.2  Mask:255.255.255.0
      UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
      RX packets:75 errors:0 dropped:0 overruns:0 frame:0
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:100 
      RX bytes:84304 (84.3 KB)  TX bytes:0 (0.0 B)

tun1  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:10.8.0.2  P-t-P:10.8.0.2  Mask:255.255.255.0
      UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
      RX packets:200496 errors:0 dropped:0 overruns:0 frame:0
      TX packets:148828 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:100 
      RX bytes:211583838 (211.5 MB)  TX bytes:9568906 (9.5 MB)
...

J'ai constaté que je pouvais les supprimer avec quelques commandes:

ip link delete tun0
ip link delete tun1

Après cela, le problème a disparu.

8
Rara

Tu peux essayer

$Sudo service network-manager restart

Travaillé pour moi.

6
Ivan Mishur

J'ai rencontré le même problème, la raison en est que vous avez atteint le maximum de réseaux:

do a: docker network ls Choisissez-en un à supprimer en utilisant: docker network rm networkname_default

3
Amine Benkeroum

J'ai résolu ce problème en procédant comme suit:

  1. éteignez votre réseau (sans fil ou filaire ...).

  2. redémarrez votre système.

  3. avant d’allumer votre réseau sur un PC, exécutez la commande docker-compos up, cela va créer un nouveau réseau.

  4. alors vous pouvez activer le réseau et continuer ...

0
salim

TL; DR

Ajouter

version: "3.7"
services:
  web:
    ...
    network_mode: "bridge"

Lisez à propos de network_mode dans la documentation .

Version longue

Disclaimer : Je ne connais pas très bien le réseautage Docker, la "solution" qui a fonctionné pour moi ressemble à une incantation magique et au YMMV.

Lorsque j'ai exécuté docker run my-image, la mise en réseau ne m'a posé aucun problème, mais lorsque j'ai converti cette commande en fichier docker-compose.yml, j'ai obtenu la même erreur que l'OP.

J'ai lu réponse d'Arenim et d'autres informations sur Internet suggérant de réutiliser un réseau existant.

Vous pouvez trouver des réseaux existants comme ceci:

# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
ca0415dfa442        bridge              bridge              local
78cbbda034dd        Host                Host                local
709f13f4ce2d        none                null                local

Je voulais réutiliser le réseau par défaut bridge, alors j’ai ajouté

services:
  web:
    ...

networks:
  default:
    external:
      name: bridge

à la racine de mon docker-compose.yml (donc pas à l'intérieur de l'un de mes services, mais à l'indentation de la racine).

J'ai maintenant l'erreur suivante:

ERREUR: pour les alias de portée du réseau de votre conteneur n'est pris en charge que pour les conteneurs des réseaux définis par l'utilisateur

Cela a abouti à cette question de Docker Github , indiquant clairement que je devrais ajouter l'objet network_mode à mon docker-compose:

version: "3.7"
services:
  web:
    ...
    network_mode: "bridge"

J'utilisais la version Docker 18.09.8, docker-compose version 1.24.1 et le format de fichier de composition 3.7.

0