web-dev-qa-db-de.com

Docker "FEHLER: Es konnte kein verfügbarer, nicht überlappender IPv4-Adresspool unter den dem Netzwerk zuzuweisenden Standardeinstellungen gefunden werden"

Ich habe ein Verzeichnis apkmirror-scraper-compose mit folgender Struktur:

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

Ich versuche folgendes 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

wo das Dockerfile für tor ist

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

das für privoxy ist

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

dabei besteht config aus den beiden Zeilen

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

und das Dockerfile für scraper ist

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

wo requirements.txt enthält die einzelne Zeile requests. Schließlich ist das Programm newnym.py soll einfach testen, ob das Ändern der IP-Adresse mit Tor funktioniert:

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

Das docker-compose build wird erfolgreich erstellt, aber wenn ich es versuche docker-compose up Erhalte ich folgende Fehlermeldung:

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

Ich habe versucht, nach Hilfe für diese Fehlermeldung zu suchen, konnte aber keine finden. Was verursacht diesen Fehler?

76
Kurt Peek

Nach Peter Hauge 's Kommentar beim Ausführen von docker network ls Ich habe (unter anderem) folgendes gesehen:

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

Die Zeile mit NAME und DRIVER als beide Host scheint das zu sein, worauf er sich mit "auf Ihrem Host bereits erstellten Netzwerken" bezieht. Also habe ich nach https://Gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b4 den Befehl ausgeführt

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

Jetzt docker-compose up funktioniert (obwohl newnym.py erzeugt einen Fehler).

42
Kurt Peek

Ich habe gesehen, dass Docker möglicherweise die maximale Anzahl an erstellten Netzwerken aufweist. Der Befehl docker network Prune kann verwendet werden, um alle Netzwerke zu entfernen, die nicht von mindestens einem Container verwendet werden.

Meine Ausgabe endete als Robert kommentiert über: eine Ausgabe mit openvpn service openvpn stop 'Problem gelöst.

154
bbeecher

Ich bin auf dieses Problem gestoßen, weil OpenVPN ausgeführt wurde. Sobald ich OpenVPN getötet habe, docker-compose up wurde ausgelöst und der Fehler verschwand.

100
DrDamnit

Ich habe das gleiche Problem. Ich rannte docker system Prune -a --volumes, docker network Prune, aber beide haben mir auch nicht geholfen.
Ich verwende VPN, ich schalte VPN aus und Docker wurde danach normal gestartet und kann ein Netzwerk erstellen. Immerhin können Sie VPN wieder aktivieren

24
madjardi

Wie bereits erwähnt, unterstützt Dockers lokales Standardnetzwerk bridge nur 30 verschiedene Netzwerke (von denen jedes durch seinen Namen eindeutig identifiziert werden kann). Wenn Sie sie nicht verwenden, dann docker network Prune macht den Trick.

Sie könnten jedoch daran interessiert sein, mehr als 30 Container mit jeweils eigenem Netzwerk einzurichten. Wenn Sie daran interessiert wären, müssten Sie ein overlay Netzwerk definieren. Das ist etwas kniffliger, aber sehr gut dokumentiert hier .

12
Carlos Segarra

Ich habe bei diesem Problem festgestellt, dass OpenVPN ebenfalls funktioniert, und habe eine Lösung gefunden, bei der Sie den OpenVPN-Server NICHT stoppen/starten sollten.

Idee, dass Sie angeben sollten, welches Subnetz Sie genau verwenden möchten. In docker-compose.yml Schreiben Sie:

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

Das ist es. Jetzt wird das default -Netzwerk verwendet, und wenn Ihr VPN Ihnen nichts aus dem Subnetz 172.177.57.* Zugewiesen hat, ist alles in Ordnung.

9
Arenim
  1. Überprüfen Sie, ob ein anderer Container ausgeführt wird. Wenn ja, gehen Sie wie folgt vor: docker-compose down
  2. Wenn VPN verbunden ist, trennen Sie die Verbindung und versuchen Sie erneut, den Docker-Container hochzufahren:

    docker-compose up -d container_name
    
8

Ich hatte ein identisches Problem mit der gleichen Fehlermeldung, aber die Lösung zum Entfernen nicht verwendeter Docker-Netzwerke half mir nicht. Ich habe alle nicht standardmäßigen Docker-Netzwerke (und auch alle Bilder und Container) gelöscht, aber es hat nicht geholfen - Docker konnte immer noch kein neues Netzwerk erstellen.

Die Ursache des Problems lag in Netzwerkschnittstellen, die nach der Installation von OpenVpn übrig geblieben waren. (Es wurde zuvor auf dem Host installiert.) Ich habe sie gefunden, indem ich den Befehl ifconfig ausgeführt habe:

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

Ich habe festgestellt, dass ich sie mit ein paar Befehlen entfernen kann:

ip link delete tun0
ip link delete tun1

Danach ist das Problem verschwunden.

8
Rara

Du kannst es versuchen

$Sudo service network-manager restart

Hat für mich gearbeitet.

6
Ivan Mishur

Ich bin auf dasselbe Problem gestoßen. Der Grund dafür ist, dass Sie die maximale Anzahl von Netzwerken erreicht haben:

mache ein: docker network ls Wähle eines zum Entfernen mit: docker network rm networkname_default

3
Amine Benkeroum

Ich habe dieses Problem schrittweise behoben:

  1. schalten Sie Ihr Netzwerk aus (drahtlos oder verkabelt ...).

  2. starten Sie Ihr System neu.

  3. bevor Sie Ihr Netzwerk auf dem PC einschalten, führen Sie den Befehl docker-compose up aus. Es wird ein neues Netzwerk erstellt.

  4. dann kannst du das Netzwerk einschalten und weitermachen ...

0
salim

TL; DR

Hinzufügen

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

Lesen Sie über network_mode In der Dokumentation .

Lange Version

Haftungsausschluss : Ich kenne mich mit Docker-Netzwerken nicht sehr gut aus. Die "Lösung", die für mich funktioniert hat, ist wie eine magische Beschwörung und YMMV.

Als ich docker run my-image Ausführte, gab mir das Netzwerk keine Probleme, aber als ich diesen Befehl in eine docker-compose.yml - Datei konvertierte, bekam ich den gleichen Fehler wie das OP.

Ich las Arenims Antwort und einige andere Artikel im Internet, die vorschlugen, ein vorhandenes Netzwerk wiederzuverwenden.

Sie können bestehende Netzwerke wie folgt finden:

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

Ich wollte das Standardnetzwerk bridge wiederverwenden, also fügte ich hinzu

services:
  web:
    ...

networks:
  default:
    external:
      name: bridge

an die Wurzel meines docker-compose.yml (also nicht in einer meiner services, sondern an der Wurzeleinrückung) .

Ich habe jetzt folgenden Fehler bekommen:

FEHLER: Der Alias ​​für den Netzwerkbereich Ihres Containers wird nur für Container in benutzerdefinierten Netzwerken unterstützt

Dies führte zu diesem Docker Github-Problem , das eindeutig festlegte, dass ich das Objekt network_mode Meinem docker-compose Hinzufügen sollte:

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

Ich habe Docker-Version 18.09.8, docker-compose, Version 1.24.1 Und das Compose-Dateiformat 3.7 Verwendet.