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"] 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 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 probar simplemente si está funcionando cambiar 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 se compila correctamente, pero si pruebo docker-compose up , aparece 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 networkIntenté buscar ayuda sobre este mensaje de error, pero no pude encontrar ninguna. Que esta causando este error?
Me encontré con este problema porque tenía OpenVPN ejecutándose. Tan pronto como eliminé OpenVPN, docker-compose up activó y el error desapareció.
Encontré este problema con OpenVPN funcionando también y encontré una solución en la que NO debe detener / iniciar el servidor OpenVPN.
Idea de que debe especificar qué subred exactamente desea usar. En docker-compose.yml escribe:
networks: default: driver: bridge ipam: config: - subnet: 172.16.57.0/24 Eso es todo. Ahora, se usará la red default y si su VPN no le asignó algo de la subred 172.16.57.* , está bien.
He visto que la ventana acoplable sugerida puede estar en su máximo de redes creadas. El comando docker network prune se puede usar para eliminar todas las redes que no usa al menos un contenedor.
Mi problema terminó siendo, como comentó Robert : un problema con service openvpn stop 'resolvió' el problema.