我有一个apkmirror-scraper-compose具有以下结构的目录:
apkmirror-scraper-compose
. ├── docker-compose.yml ├── privoxy │ ├── config │ └── Dockerfile ├── scraper │ ├── Dockerfile │ ├── newnym.py │ └── requirements.txt └── tor └── Dockerfile
我正在尝试运行以下命令docker-compose.yml:
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
其中,Dockerfile用于tor为
Dockerfile
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"]
那privoxy是
privoxy
FROM alpine:latest EXPOSE 8118 RUN apk --update add privoxy COPY config /etc/privoxy/config CMD ["privoxy", "--no-daemon"]
其中config由两个线
config
listen-address 0.0.0.0:8118 forward-socks5 / tor:9050 .
而Dockerfile对于scraperIS
scraper
FROM python:2.7-alpine ADD . /scraper WORKDIR /scraper RUN pip install -r requirements.txt CMD ["python", "newnym.py"]
其中requirements.txt包含单行requests。最后,该程序newnym.py旨在仅测试使用Tor更改IP地址是否有效:
requirements.txt
requests
newnym.py
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)))
在docker-compose build成功建立,但如果我尝试docker-compose up,我得到以下错误信息:
docker-compose build
docker-compose up
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
我尝试搜索有关此错误消息的帮助,但找不到任何消息。是什么导致此错误?
跟随彼得·豪格PeterHaug的评论,在跑步时,docker network ls我发现(其中包括)以下内容:
docker network ls
NETWORK ID NAME DRIVER SCOPE dc6a83d13f44 bridge bridge local ea98225c7754 docker_gwbridge bridge local 107dcd8aa889 host host local
NAME和DRIVER两者的界线host似乎就是他所说的“在您的主机上已经创建的网络”。因此,按照https://gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b430,我运行了命令
NAME
DRIVER
host
docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')
现在docker-compose up可以工作(尽管newnym.py会产生错误)。