Docker "ERRORE: impossibile trovare un pool di indirizzi IPv4 disponibile e non sovrapposto tra i valori predefiniti da assegnare alla rete"


154

Ho una directory apkmirror-scraper-composecon la seguente struttura:

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

Sto cercando di eseguire quanto segue 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

dove la Dockerfileper torè

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"]

quello per privoxyè

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

dove configconsiste delle due linee

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

e il Dockerfilefor scraperè

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

dove requirements.txtcontiene la riga singola requests. Infine, il programma newnym.pyè progettato per testare semplicemente se sta cambiando l'indirizzo IP usando Tor:

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 buildcompilazione è corretta, ma se provo docker-compose up, visualizzo il seguente messaggio di errore:

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

Ho provato a cercare aiuto su questo messaggio di errore, ma non sono riuscito a trovarne. Cosa sta causando questo errore?


1
No, docker psnon mostra contenitori in esecuzione.
Kurt Peek,

77
Hai una VPN connessa? Inoltre, hai provato a riavviare il computer? (Sto cercando su Google
Robert

3
Puoi provare a docker network lsconfermare se le reti sono già state create sul tuo host.
Peter Hauge,

1
Grazie a @Robert avevo PIA VPN in esecuzione, una volta disconnesso ed uscito, ha funzionato.
xx1xx,

15
docker network prune. Questo risolverà il tuo problema
Jinna Balu,

Risposte:


276

Ho visto che la finestra mobile potrebbe essere al massimo delle reti create. Il comando docker network prunepuò essere utilizzato per rimuovere tutte le reti non utilizzate da almeno un contenitore.

Il mio problema è finito, come ha commentato Robert : un problema con openvpn service openvpn stop"risolto" il problema.


10
Se è necessario eseguire la finestra mobile insieme a VPN qui è possibile la soluzione: stackoverflow.com/q/45692255/7918 .
jb.

45
Il servizio OpenVPN è stato il problema per me.
Liviu Ilea,

Per aggiungere alla risposta di cui sopra, se si verificano problemi come questa potatura, il sistema può davvero aiutare. Docker system prunepuò anche essere una soluzione, ma fai attenzione, questo può rimuovere il tuo DB, usalo solo se non ti interessa il tuo DB, o se il tuo contenitore di DB è in esecuzione, questo comando è sicuro poiché elimina solo le cose che non vengono utilizzate da almeno un contenitore.
Sweet Chilly Philly,

Grazie. Confermo che per interrompere il client openvpn funzionerà. L'avevo iniziato pochi giorni fa, poi ho eseguito il docker-compose oggi e ho riscontrato quell'errore.
Dat TT,

1
Immagina una vita in cui i nostri strumenti ci forniscano utili informazioni di debug.
Damien Roche,

157

Ho riscontrato questo problema perché OpenVPN era in esecuzione. Non appena ho ucciso OpenVPN, ho docker-compose upsparato e l'errore è scomparso.


9
Lo stesso qui con un altro provider VPN (expressvpn).
Berkes,

1
Lo stesso problema con l'esecuzione di OpenVPN
Nicolai

6
Quindi ho avuto lo stesso problema e mi chiedo perché questo accada. Perché la rete Docker viene confusa quando è connessa a una VPN.
David Ficociello,

2
Ho avuto lo stesso problema con l'accesso privato a Internet
Nicolas,

1
Ho aggiunto percorsi invece di redirect-gateway def1aggirare il problema senza uccidere il mio servizio openvpn.
Douglas Liu,

59

Ho riscontrato questo problema anche con OpenVPN funzionante e ho trovato una soluzione in cui NON dovresti interrompere / avviare il server OpenVPN.

Idea che è necessario specificare esattamente quale sottorete si desidera utilizzare. Per docker-compose.ymliscritto:

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

Questo è tutto. Ora defaultverrà utilizzata la rete e se la tua VPN non ti ha assegnato qualcosa dalla 172.16.57.*sottorete, stai bene.


2
Questo è fantastico! La mia scatola del server non può sopportare senza OpenVPN, quindi i consigli sulla disabilitazione (anche temporanea) della VPN sono per me insensati.
iBug

4
questa dovrebbe essere la risposta accettata, poiché semplicemente uccidere VPN è stupido
michnovka,

172.177.57.0/24 non è un newtork indirizzato? In tal caso, potrebbe causare problemi a contattare un numero limitato di host su Internet.
dstromberg,

1
sì, un problema tecnico qui. Sarebbe meglio usarne uno dalla 172.16.*.*sottorete
Arenim

Non penso che usare 172.177.57.*sia una buona idea, perché non è disponibile in en.wikipedia.org/wiki/Private_network#Private_IPv4_addresses . Usa indirizzi all'interno di questo intervallo.
Lucidyan,

53

Dopo il commento di Peter Hauge , dopo aver visto ho visto (tra le altre righe) quanto segue:docker network ls

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

La linea con NAMEe DRIVERcome entrambi hostsembra essere ciò a cui si riferisce con "reti già create sul tuo host". Quindi, seguendo https://gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b430 , ho eseguito il comando

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

Ora docker-compose upfunziona (sebbene newnym.pyproduca un errore).


8
Non funziona nelle versioni più recenti della finestra mobile - non hanno consentito la rimozione di reti integrate (come default)
pospi

Se stai usando Traefik, assicurati di chiudere quel contenitore prima di eseguire questo comando. Altrimenti penserà che tutte le tue reti siano attive.
Allure Web Solutions,

se corro docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }') ottengo Error response from daemon: bridge is a pre-defined network and cannot be removedsu Ubuntu 20.04Docker version 19.03.9, build 9d988398e7 docker-compose version 1.25.0, build unknown
therobyouknow

47

Ho lo stesso problema. Corsi docker system prune -a --volumes, docker network prunema nessuno dei due mi aiutò.

Uso una VPN, ho spento la VPN e, dopo che la finestra mobile è diventata normale, è stata in grado di creare una rete. Successivamente, puoi abilitare nuovamente la VPN.


3
La mia connessione VPN era sulla stessa sottorete dell'unica docker che stava tentando di utilizzare. La disconnessione ha risolto il problema per me. :)
XtraSimplicity il

1
ahhhVPN era in esecuzione.
Adiii

25

Come indicato in altre risposte, la bridgerete locale predefinita di Docker supporta solo 30 reti diverse (ognuna delle quali è identificabile in modo univoco con il proprio nome). Se non li stai usando, alloradocker network prune farà il trucco.

Tuttavia, potresti essere interessato a stabilire più di 30 container, ognuno con la propria rete. Eri interessato a farlo, allora dovresti definire una overlayrete. Questo è un po 'più complicato ma estremamente ben documentato qui .

EDIT (maggio 2020): il collegamento è diventato non disponibile, esaminando i documenti non esiste una sostituzione esatta, ma consiglierei di partire da qui .


Il tuo link è un 404
chovy

@chovy grazie per avermelo fatto sapere, hanno riorganizzato i loro documenti. Aggiornamento ora.
Carlos Segarra,

13

Ho avuto un identico problema con lo stesso messaggio di errore ma la soluzione con la rimozione di reti docker non utilizzate non mi ha aiutato. Ho eliminato tutte le reti docker non predefinite (e anche tutte le immagini e i contenitori) ma non mi è stato d'aiuto: la docker non è stata ancora in grado di creare una nuova rete.

La causa del problema era nelle interfacce di rete che erano rimaste dopo l'installazione di OpenVpn. (È stato installato sull'host in precedenza.) Li ho trovati eseguendo il ifconfigcomando:

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

Ho scoperto che posso rimuoverli con un paio di comandi:

ip link delete tun0
ip link delete tun1

Dopo questo il problema è scomparso.


Questo ha funzionato per me dopo aver provato diverse opzioni - ha interrotto openvpn, riavviato il pc, docker reinstallato, prugna di rete, ecc ...
Matt

10
  1. Verifica se è in esecuzione un altro contenitore. In caso affermativo, fai: docker-compose down
  2. Se la VPN è connessa, quindi disconnettila e riprova ad aprire il contenitore docker:

    docker-compose up -d container_name

Non ho VPN in esecuzione ma l'ho docker-compose downrisolto per me
IMB

8

Puoi provare

$sudo service network-manager restart

Ha funzionato per me.


Ha funzionato anche per me!
mmrs151

8

Ho riscontrato lo stesso problema, il motivo è che hai raggiunto il massimo delle reti:

fai un: docker network ls scegline uno da rimuovere usando:docker network rm networkname_default


7

TL; DR

Inserisci

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

Leggi network_modenella documentazione .

Versione lunga

disconoscimento : non sono molto ben informato sulla rete Docker, ma questo ha fatto il trucco per me. YMMV.

Quando ho eseguito docker run my-imagela rete non mi ha dato problemi, ma quando ho convertito questo comando in un docker-compose.ymlfile, ho avuto lo stesso errore dell'OP.

Ho letto la risposta di Arenim e alcune altre cose su Internet che mi hanno suggerito di riutilizzare una rete esistente.

Puoi trovare reti esistenti come questa:

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

Volevo riutilizzare la bridgerete predefinita , quindi ho aggiunto

services:
  web:
    ...

networks:
  default:
    external:
      name: bridge

alla radice della mia docker-compose.yml(quindi non all'interno di una mia services, ma alla rientranza della radice).

Ora ho il seguente errore:

ERRORE: per l'alias nell'ambito della rete del proprio contenitore è supportato solo per i contenitori nelle reti definite dall'utente

Ciò ha portato a questo problema di Docker Github , che ha chiaramente affermato che avrei dovuto aggiungere l' network_modeoggetto al mio docker-compose:

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

Stavo usando la versione Docker 18.09.8, la docker-composeversione 1.24.1e il formato del file di composizione 3.7.


1
è una domanda o una risposta?
amorevole

Più a: le mie avventure nella terra della rete Docker e come mi sono imbattuto in qualcosa che si è bloccato.
Stefan van den Akker,

6

Questo mi è successo perché stavo usando OpenVPN. Ho trovato un modo in cui non ho bisogno di smettere di usare la VPN o aggiungere manualmente una rete al file comporre docker né eseguire script pazzi.

Sono passato a WireGuardinvece di OpenVPN. Più specificamente, mentre eseguo la soluzione nordvpn, ho installato WireGuard e ne ho usato la versione, NordLynx.


Il comando specifico per passare da OpenVPN al protocollo WireGuard per NordVPN è nordvpn set technology NordLynx. Non è un prodotto separato e attualmente è disponibile solo su Linux e iOS.
Tephyr

6

Non è necessario uccidere il VPN.

Questo altro commento sull'utilizzo di una nuova rete mi avvicina molto alla soluzione e ha funzionato per un po ', ma ho trovato un modo migliore grazie ad alcuni talk over in un'altra domanda

Crea una rete con:

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

Quindi, nella parte inferiore di docker-compose.yaml, inserisci questo:

networks:
  default:
    external: 
      name: your-network

Fatto. Non è necessario aggiungere reti a tutte le definizioni dei container, ecc. E puoi riutilizzare la rete anche con altri file di composizione docker, se lo desideri.


4

Se desideri un sacco di reti, puoi controllare la quantità di spazio IP docker distribuito a ciascuna rete tramite l' default-address-poolsimpostazione di Deamon, quindi puoi aggiungere questo al tuo /etc/docker/daemon.json:

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

Qui ho prenotato 10.254.1.1/24(254 indirizzi IP) per la rete bridge.

Per qualsiasi altra rete che creo, la finestra mobile partizionerà lo 10.254.0.0spazio (65k host), distribuendo 16 host alla volta (si "size":28riferisce alla maschera CIDR , per 16 host).

Se creo alcune reti e quindi le eseguo docker network inspect <name>, potrebbe visualizzare qualcosa del genere:

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

Questo 10.254.0.32/28significa che questa rete può usare 16 indirizzi IP da 10.254.0.32- 10.254.0.47.


1

Ho riscontrato lo stesso problema

Creazione della rete "schemaregistry1_default" con il driver
ERRORE predefinito : impossibile trovare un pool di indirizzi IPv4 disponibile e non sovrapposto tra i valori predefiniti da assegnare alla rete

e nulla ha aiutato fino a quando non ho spento la VPN Cisco. dopo che il docker-compose up ha funzionato


-3

Ho risolto questo problema con i passaggi:

  1. spegni la tua rete (wireless o cablata ...).

  2. riavviare il sistema.

  3. prima di accendere la tua rete su PC, esegui il comando docker-compose up, creerà una nuova rete.

  4. allora puoi accendere la rete e andare avanti ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.