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?
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).
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.
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.
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
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 .
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.
docker-compose down
Wenn VPN verbunden ist, trennen Sie die Verbindung und versuchen Sie erneut, den Docker-Container hochzufahren:
docker-compose up -d container_name
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.
Du kannst es versuchen
$Sudo service network-manager restart
Hat für mich gearbeitet.
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
Ich habe dieses Problem schrittweise behoben:
schalten Sie Ihr Netzwerk aus (drahtlos oder verkabelt ...).
starten Sie Ihr System neu.
bevor Sie Ihr Netzwerk auf dem PC einschalten, führen Sie den Befehl docker-compose up aus. Es wird ein neues Netzwerk erstellt.
dann kannst du das Netzwerk einschalten und weitermachen ...
Hinzufügen
version: "3.7"
services:
web:
...
network_mode: "bridge"
Lesen Sie über network_mode
In der Dokumentation .
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.