Docker "ERREUR: impossible de trouver un pool d'adresses IPv4 disponible et sans chevauchement parmi les valeurs par défaut à attribuer au réseau"

154

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

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

J'essaye d'exécuter ce qui suit docker-compose.yml:

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

Dockerfilepour torest

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 privoxyest

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

où se configcompose des deux lignes

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

et le Dockerfilepour scraperest

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

requirements.txtcontient la seule ligne requests. Enfin, le programme newnym.pyest conçu pour tester simplement si la modification de l'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 __name__ == '__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)))

La docker-compose buildcompilation réussit, mais si j'essaye 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 rechercher de l'aide sur ce message d'erreur, mais je n'en ai trouvé aucune. Qu'est ce qui cause cette erreur?

Kurt Peek
la source
1
Non, docker psne montre aucun conteneur en cours d'exécution.
Kurt Peek
78
Avez-vous un VPN connecté? Aussi, avez-vous essayé de redémarrer votre ordinateur? (Je cherche sur
Robert
3
Pouvez-vous essayer de docker network lsconfirmer si des réseaux ont déjà été créés sur votre hôte.
Peter Hauge
1
Merci @Robert J'avais PIA VPN en cours d'exécution, une fois que je me suis déconnecté et quitté, cela a fonctionné.
xx1xx
15
docker network prune. Cela résoudra votre problème
Jinna Balu

Réponses:

275

Je l'ai vu suggérer que le docker pourrait être à son maximum de réseaux créés. La commande docker network prunepeut ê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 l'a commenté: un problème avec openvpn a service openvpn stop«résolu» le problème.

bbeecher
la source
10
Si vous devez exécuter docker avec vpn, voici une solution possible: stackoverflow.com/q/45692255/7918 .
jb.
45
Le service OpenVPN était le problème pour moi.
Liviu Ilea
Pour ajouter à la réponse ci-dessus, si vous rencontrez un problème comme celui-ci, le système peut vraiment vous aider. Docker system prunepeut également être un correctif, mais soyez prudent, cela peut supprimer votre base de données, utilisez-la uniquement si vous ne vous souciez pas de votre base de données, ou si votre conteneur de base de données est en cours d'exécution, cette commande est sûre car elle élague uniquement les éléments non utilisés par au moins un conteneur.
Sweet Chilly Philly
Merci. Je confirme que pour arrêter le client openvpn fonctionnera. Je l'avais commencé il y a quelques jours, puis j'ai lancé le docker-compose aujourd'hui et j'ai eu cette erreur.
Dat TT du
1
Imaginez une vie où nos outils nous fournissent des informations de débogage utiles.
Damien Roche le
157

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

DrDamnit
la source
9
Idem ici avec un autre fournisseur VPN (expressvpn).
berkes
1
Le même problème avec l'exécution d'OpenVPN
Nicolai
6
J'ai donc eu le même problème et je me demande pourquoi cela se produit. Pourquoi le réseau Docker est-il confus lorsqu'il est connecté à un VPN?
David Ficociello
2
J'ai eu le même problème avec l'accès Internet privé
Nicolas
1
J'ai ajouté des routes plutôt que redirect-gateway def1de contourner le problème sans tuer mon service openvpn.
Douglas Liu
59

J'ai rencontré ce problème avec OpenVPN fonctionnant également et j'ai trouvé une solution où vous ne devriez PAS arrêter / démarrer le serveur OpenVPN.

Idée que vous devez spécifier exactement le sous-réseau que vous souhaitez utiliser. Par docker-compose.ymlécrit:

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

C'est tout. Maintenant, le defaultréseau sera utilisé et si votre VPN ne vous a pas attribué quelque chose du 172.16.57.*sous-réseau, tout va bien.

Arenim
la source
2
C'est bien! Ma boîte serveur ne peut pas se passer d'OpenVPN, donc les conseils sur la désactivation (même temporaire) du VPN sont pour moi absurdes.
iBug
4
cela devrait être la réponse acceptée, car tuer simplement un VPN est stupide
michnovka
172.177.57.0/24 n'est-il pas un newtork routé? Si tel est le cas, cela pourrait entraîner des problèmes pour contacter un nombre limité d'hôtes sur Internet.
dstromberg
1
oui, un pépin ici. Serait préférable d'en utiliser un à partir du 172.16.*.*sous
Arenim
Je ne pense pas que l'utilisation 172.177.57.*soit une bonne idée, car ce n'est pas dans le fichier en.wikipedia.org/wiki/Private_network#Private_IPv4_addresses . Utilisez des adresses comprises dans cette plage.
lucidyan
53

À la suite de Peter Hauge d » commentaire , sur l' exécution , docker network lsj'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 NAMEet DRIVERcomme les deuxhost semble être ce à quoi il se réfère avec "réseaux déjà créés sur votre hôte". Donc, après https://gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b430 , j'ai exécuté la commande

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

Fonctionne maintenant docker-compose up(bien que newnym.pyproduit une erreur).

Kurt Peek
la source
8
Ne fonctionne pas dans les versions plus récentes du docker - ils ont interdit la suppression des réseaux intégrés (tels que default)
pospi
Si vous utilisez Traefik, assurez-vous d'arrêter ce conteneur avant d'exécuter cette commande. Sinon, il pensera que tous vos réseaux sont actifs.
Allure Web Solutions
si je cours, docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')je reçois Error response from daemon: bridge is a pre-defined network and cannot be removedUbuntu Docker version 19.03.9, build 9d988398e7 docker-compose version 1.25.0, build unknown
20.04
47

J'ai le même problème. J'ai couru docker system prune -a --volumes,docker network prune mais aucun ne m'a aidé.

J'utilise un VPN, j'ai désactivé le VPN et, une fois que le docker a démarré normalement, j'ai pu créer un réseau. Après cela, vous pouvez réactiver le VPN.

madjardi
la source
3
Ma connexion VPN était sur le même sous-réseau que celui que le docker essayait d'utiliser. La déconnexion a résolu le problème pour moi. :)
XtraSimplicity
1
ahhhVPN était en cours d'exécution.
Adiii
25

Comme d'autres réponses l'ont mentionné, le bridgeréseau local par défaut de Docker ne prend en charge que 30 réseaux différents (chacun d'eux étant identifiable de manière unique par son nom). Si vous ne les utilisez pas, alorsdocker network prune fera l'affaire.

Cependant, vous pourriez être intéressé par l'établissement de plus de 30 conteneurs, chacun avec son propre réseau. Si cela vous intéressait, il vous faudrait définir un overlayréseau. C'est un peu plus délicat mais extrêmement bien documenté ici .

EDIT (mai 2020): Le lien est devenu indisponible, en parcourant la documentation, il n'y a pas de remplacement exact, mais je recommanderais de partir d' ici .

Carlos Segarra
la source
Votre lié est un 404
chovy
@chovy merci de m'avoir fait savoir, ils ont réorganisé leurs documents. Mise à jour maintenant.
Carlos Segarra
13

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 docker non par défaut (et toutes les images et tous les conteneurs également) mais cela n'a pas aidé - docker n'était toujours pas en mesure de créer un nouveau réseau.

La cause du problème était dans les interfaces réseau qui ont été laissées après l'installation d'OpenVpn. (Il a été installé sur l'hôte précédemment.) Je les ai trouvés en exécutant la ifconfigcommande:

...
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.

Rara
la source
Cela a fonctionné pour moi après avoir essayé plusieurs options - arrêt openvpn, PC redémarré, docker réinstallé, élagage réseau, etc ...
Matt
10
  1. Vérifiez si un autre conteneur est en cours d'exécution, si oui, faites: docker-compose down
  2. Si VPN est connecté, déconnectez-le et essayez à nouveau de mettre en place le conteneur Docker:

    docker-compose up -d container_name
Nandini Chaurasiya
la source
Je n'ai pas de VPN en cours d'exécution mais je l'ai docker-compose downréparé pour moi
IMB
8

Tu peux essayer

$sudo service network-manager restart

A travaillé pour moi.

Ivan Mishur
la source
A travaillé pour moi aussi!
mmrs151
8

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

faire une: docker network ls Choisissez-en un à supprimer en utilisant:docker network rm networkname_default

Amine Benkeroum
la source
7

TL; DR

Ajouter

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

Lire network_modedans la documentation .

Version longue

Avertissement : je ne connais pas très bien le réseau Docker, mais cela a fait l'affaire pour moi. YMMV.

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

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

Vous pouvez trouver des réseaux existants comme celui-ci:

# 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 bridgeréseau par défaut , j'ai donc ajouté

services:
  web:
    ...

networks:
  default:
    external:
      name: bridge

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

J'ai maintenant l'erreur suivante:

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

Cela a conduit à ce problème Docker Github , qui indiquait clairement que je devais ajouter l' network_modeobjet à mon docker-compose:

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

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

Stefan van den Akker
la source
1
est-ce une question ou une réponse?
chovy
Plus un: mes aventures dans le réseau Docker et comment je suis tombé sur quelque chose qui est resté coincé.
Stefan van den Akker le
6

Cela m'est arrivé parce que j'utilisais OpenVPN . J'ai trouvé un moyen de ne pas avoir besoin d'arrêter d'utiliser le VPN ou d'ajouter manuellement un réseau au fichier docker-compose ni d'exécuter un script fou.

Je suis passé à WireGuardau lieu de OpenVPN. Plus précisément, alors que j'exécute la solution nordvpn, j'ai installé WireGuard et j'ai utilisé leur version, NordLynx.

ehzicamesmo
la source
La commande spécifique pour passer d'OpenVPN au protocole WireGuard pour NordVPN est nordvpn set technology NordLynx. Ce n'est pas un produit distinct et n'est actuellement disponible que sur Linux et iOS.
tephyr
6

Tuer le VPN n'est pas nécessaire.

Cet autre commentaire sur l'utilisation d'un nouveau réseau est assez proche de la solution pour moi , et a fonctionné pendant un certain temps, mais j'ai trouvé un meilleur moyen grâce à quelques discussions dans une autre question

Créez un réseau avec:

docker network create your-network --subnet 172.24.24.0/24

Ensuite, en bas de docker-compose.yaml, mettez ceci:

networks:
  default:
    external: 
      name: your-network

Terminé. Pas besoin d'ajouter des réseaux à toutes les définitions de conteneurs, etc. et vous pouvez également réutiliser le réseau avec d'autres fichiers docker-compose si vous le souhaitez.

Lotus
la source
4

Si vous voulez beaucoup de réseaux, vous pouvez contrôler la quantité d'espace IP que le docker distribue à chaque réseau via le default-address-poolsparamètre de démon, vous pouvez donc ajouter ceci à votre /etc/docker/daemon.json:

{
  "bip": "10.254.1.1/24",
  "default-address-pools":[{"base":"10.254.0.0/16","size":28}],
}

Ici, j'ai réservé 10.254.1.1/24(254 adresses IP) pour le réseau de pont.

Pour tout autre réseau que je crée, docker partitionnera l' 10.254.0.0espace (65k hôtes), donnant 16 hôtes à la fois (se "size":28réfère au masque CIDR , pour 16 hôtes).

Si je crée quelques réseaux et que je les exécute docker network inspect <name>, cela peut afficher quelque chose comme ceci:

        ...
        "Subnet": "10.254.0.32/28",
        "Gateway": "10.254.0.33"
        ...

Les 10.254.0.32/28moyens de ce réseau peuvent utiliser 16 adresses IP 10.254.0.32- 10.254.0.47.

Matthieu
la source
1

J'ai rencontré le même problème

Création du réseau "schemaregistry1_default" avec le pilote par défaut
ERREUR: impossible de trouver un pool d'adresses IPv4 disponible et sans chevauchement parmi les valeurs par défaut à attribuer au réseau

et rien n'a aidé jusqu'à ce que j'éteigne le VPN Cisco. après que docker-compose up a fonctionné

Вячеслав Калякин
la source
-3

J'ai résolu ce problème par étapes:

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

  2. redémarrez votre système.

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

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

salim
la source