python - start - Docker "ERROR: no se pudo encontrar un grupo de direcciones IPv4 no superpuesto disponible entre los valores predeterminados para asignar a la red"
manual docker compose (12)
Tengo un directorio
apkmirror-scraper-compose
con la siguiente estructura:
.
├── docker-compose.yml
├── privoxy
│ ├── config
│ └── Dockerfile
├── scraper
│ ├── Dockerfile
│ ├── newnym.py
│ └── requirements.txt
└── tor
└── Dockerfile
Estoy tratando de ejecutar el siguiente
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
donde está el
Dockerfile
para
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"]
eso para
privoxy
es
FROM alpine:latest
EXPOSE 8118
RUN apk --update add privoxy
COPY config /etc/privoxy/config
CMD ["privoxy", "--no-daemon"]
donde
config
consta de las dos líneas
listen-address 0.0.0.0:8118
forward-socks5 / tor:9050 .
y el
Dockerfile
para
scraper
es
FROM python:2.7-alpine
ADD . /scraper
WORKDIR /scraper
RUN pip install -r requirements.txt
CMD ["python", "newnym.py"]
donde
requirements.txt
contiene las
requests
de una sola línea.
Finalmente, el programa
newnym.py
está diseñado para simplemente probar si está funcionando el cambio de la dirección 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 build
compila correctamente, pero si intento
docker-compose up
,
docker-compose up
el siguiente mensaje de error:
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
Intenté buscar ayuda para este mensaje de error, pero no pude encontrar ninguna. Que esta causando este error?
TL; DR
Añadir
version: "3.7"
services:
web:
...
network_mode: "bridge"
Lea sobre
network_mode
en la documentación
.
Versión larga
Descargo de responsabilidad : no conozco mucho las redes de Docker, por lo que la "solución" que funcionó para mí es como un encantamiento mágico y YMMV.
Cuando ejecuté
docker run my-image
la red no me dio problemas, pero cuando convertí este comando en un archivo
docker-compose.yml
, obtuve el mismo error que el OP.
Leí la respuesta de Arenim y algunas otras cosas en Internet que sugerían reutilizar una red existente.
Puede encontrar redes existentes como esta:
# docker network ls
NETWORK ID NAME DRIVER SCOPE
ca0415dfa442 bridge bridge local
78cbbda034dd host host local
709f13f4ce2d none null local
Quería reutilizar la red
bridge
predeterminada, así que agregué
services:
web:
...
networks:
default:
external:
name: bridge
a la
raíz
de mi
docker-compose.yml
(por lo tanto, no dentro de uno de mis
services
, sino en la sangría de la raíz).
Ahora recibí el siguiente error:
ERROR: para el alias con alcance de red de su contenedor solo se admite para contenedores en redes definidas por el usuario
Esto llevó a
este problema de Docker Github
, que decía claramente que debería agregar el objeto
network_mode
a mi
docker-compose
:
version: "3.7"
services:
web:
...
network_mode: "bridge"
Estaba usando Docker versión
18.09.8
,
docker-compose
versión
1.24.1
y el formato de archivo compose
3.7
.
-
Compruebe si se está ejecutando algún otro contenedor. En caso afirmativo, haga:
docker-compose down
-
Si la VPN está conectada, desconéctela e intente nuevamente subir el contenedor acoplable:
docker-compose up -d container_name
Como se mencionó en otras respuestas, la red de
bridge
local predeterminada de Docker solo admite 30 redes diferentes (cada una de ellas identificable de forma única por su nombre).
Si no los está utilizando, entonces
docker network prune
hará el truco.
Sin embargo, es posible que le interese establecer más de 30 contenedores, cada uno con su propia red.
Si estaba interesado en hacerlo, necesitaría definir una red
overlay
.
Esto es un poco más complicado pero extremadamente bien documentado
here
.
He visto que sugiere que Docker puede estar en su máximo de redes creadas.
El comando
docker network prune
se puede usar para eliminar todas las redes no utilizadas por al menos un contenedor.
Mi problema terminó siendo, como
Robert
comentó: un problema con el
service openvpn stop
"resolver" el problema.
Me encontré con el mismo problema, la razón es que llegaste al máximo de redes:
hacer un:
docker network ls
Elija uno para eliminar usando:
docker network rm networkname_default
Me encontré con este problema con OpenVPN funcionando también y encontré una solución donde NO debería detener / iniciar el servidor OpenVPN.
Idea de que debe especificar exactamente qué subred desea usar.
En
docker-compose.yml
escribe:
networks:
default:
driver: bridge
ipam:
config:
- subnet: 172.177.57.0/24
Eso es.
Ahora, se usará la red
default
y si su VPN no le asignó algo desde
172.177.57.*
Subred Está bien.
Me encontré con este problema porque tenía OpenVPN ejecutándose.
Tan pronto como maté a OpenVPN,
docker-compose up
Docker se
docker-compose up
y el error desapareció.
Puedes probar
$sudo service network-manager restart
Trabajó para mi.
Siguiendo el
comment
Peter Hauge
, al ejecutar la
docker network ls
vi (entre otras líneas) lo siguiente:
NETWORK ID NAME DRIVER SCOPE
dc6a83d13f44 bridge bridge local
ea98225c7754 docker_gwbridge bridge local
107dcd8aa889 host host local
La línea con
NAME
y
DRIVER
como
host
parece ser a lo que se refiere con "redes ya creadas en su host".
Entonces, siguiendo
https://gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b430
, ejecuté el comando
docker network rm $(docker network ls | grep "bridge" | awk ''/ / { print $1 }'')
Ahora
docker-compose up
funciona (aunque
newnym.py
produce un error).
Solucioné este problema por pasos:
-
apague su red (inalámbrica o por cable ...).
-
reinicie su sistema.
-
antes de encender su red en la PC, ejecute el comando docker-compose up, creará una nueva red.
-
entonces puedes encender la red y continuar ...
Tengo el mismo problema.
docker system prune -a --volumes
,
docker network prune
, pero ambas no me ayudaron.
Uso VPN, apago la VPN y, después de eso, Docker comenzó a funcionar normalmente y él puede crear una red.
Después de todo, puede habilitar VPN nuevamente
Tuve un problema idéntico con el mismo mensaje de error, pero la solución con la eliminación de redes de acopladores no utilizadas no me ayudó. Eliminé todas las redes de acopladores no predeterminadas (y también todas las imágenes y contenedores), pero no sirvió de nada: el acoplador aún no pudo crear una nueva red.
La causa del problema estaba en las interfaces de red que quedaron después de la instalación de OpenVpn.
(Se instaló en el host anteriormente). Los encontré ejecutando el comando
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)
...
Descubrí que puedo eliminarlos con un par de comandos:
ip link delete tun0
ip link delete tun1
Después de esto, el problema ha desaparecido.