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 intentando 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 el Dockerfile
para tor
es
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 para privoxy
es
FROM alpine:latest
EXPOSE 8118
RUN apk --update add privoxy
COPY config /etc/privoxy/config
CMD ["privoxy", "--no-daemon"]
donde config
consiste en 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 la única línea requests
. Finalmente, el programa newnym.py
está diseñado para simplemente probar si el cambio de dirección IP usando Tor funciona:
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)))
El docker-compose build
se construye con éxito, pero si intento docker-compose up
, obtengo 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
He intentado buscar ayuda sobre este mensaje de error, pero no pude encontrar ninguna. ¿Cuál es la causa de este error?
He visto que se sugiere que Docker puede estar en su máximo de redes creadas. El comando docker network prune
se puede utilizar para eliminar todas las redes no utilizadas por al menos un contenedor.
Mi problema terminó siendo, como Robert comentó: un problema con openvpn service openvpn stop
'solucionado' el problema.
Siguiendo el [comentario] de Peter Hauge's (https://stackoverflow.com/questions/43720339/docker-error-could-not-find-an-available-non-overlapping-ipv4-address-pool-am#comment74485284_43720339), al ejecutar docker network ls
he visto (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 ambos host
parece ser a lo que se refiere con "redes ya creadas en tu host". Así que, 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).
Tuve un problema idéntico con el mismo mensaje de error, pero la solución con la eliminación de las redes Docker no utilizados no me ayudó. He eliminado todas las redes docker no predeterminadas (y todas las imágenes y contenedores también) pero no ayudó - docker todavía no era capaz de crear una nueva red.
La causa del problema estaba en las interfaces de red que quedaron después de la instalación de OpenVpn. (Las 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)
...
He encontrado que puedo eliminarlos con un par de comandos:
ip link delete tun0
ip link delete tun1
Después de esto el problema ha desaparecido.