次のような構造のディレクトリapkmirror-scraper-compose
があります。
.
├── docker-compose.yml
├── privoxy
│ ├── config
│ └── Dockerfile
├── scraper
│ ├── Dockerfile
│ ├── newnym.py
│ └── requirements.txt
└── tor
└── Dockerfile
次の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
は、次のとおりです。
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
の
FROM Alpine:latest
EXPOSE 8118
RUN apk --update add privoxy
COPY config /etc/privoxy/config
CMD ["privoxy", "--no-daemon"]
config
は2行で構成されています。
listen-address 0.0.0.0:8118
forward-socks5 / tor:9050 .
そしてDockerfile
の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アドレスを変更することがうまくいっているかどうかを単純にテストするように設計されています。
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)))
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
このエラーメッセージでヘルプを探してみましたが、見つかりませんでした。このエラーの原因は何ですか?
フォロー Peter Hauge 's コメント 、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/5b57ddb3c11942094f8d0a97d461b4 に従って、私はコマンドを実行しました
docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')
docker-compose up
は動作します(ただし、newnym.py
はエラーを生成します)。
私はそれがdockerが作成されたネットワークの最大であるかもしれないことを示唆したのを見ました。コマンドdocker network Prune
は、少なくとも1つのコンテナーによって使用されていないすべてのネットワークを削除するために使用できます。
Robert がコメントしたように、私の問題は結局結局終わりました:openvpn service openvpn stop
に関する問題は問題を '解決'しました。
OpenVPNを実行していたため、この問題に遭遇しました。私がOpenVPNを殺した途端に、docker-compose up
が正しく起動し、エラーが消えました。
私は同じ問題を抱えています。私はdocker system Prune -a --volumes
、docker network Prune
を実行しました、しかしどちらも私を助けませんでした。
私はVPNを使用しています、私はVPNをオフにします、そしてそれの後で、dockerは普通に始めました、そして、彼はネットワークを作ることができます。結局のところ、あなたは再びVPNを有効にすることができます
他の答えが述べたように、Dockerのデフォルトのローカルのbridge
ネットワークは30の異なるネットワーク(それぞれが名前によって一意に識別可能)をサポートするだけです。あなたがそれらを使っていないのなら、docker network Prune
がうまくいくでしょう。
ただし、それぞれが独自のネットワークを持つ、30を超えるコンテナを確立することに興味があるかもしれません。そうすることに興味があるならば、あなたはoverlay
ネットワークを定義する必要があるでしょう。これはもう少し注意が必要ですが、非常によく文書化されています ここ 。
docker-compose down
VPNが接続されている場合は、それを切断して再度docker containerを起動します。
docker-compose up -d container_name
あなたが試すことができます
$Sudo service network-manager restart
私のために働きました。
私は同じエラーメッセージと同じ問題を抱えていたが、未使用のdockerネットワークを削除することで解決策は私を助けにはならなかった。デフォルトではないdockerネットワーク(およびすべての画像とコンテナ)も削除しましたが、役に立ちませんでした - dockerはまだ新しいネットワークを作成できませんでした。
この問題の原因は、OpenVpnのインストール後に残ったネットワークインタフェースにありました。 (以前にホストにインストールされていました。)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)
...
いくつかのコマンドでそれらを削除できることがわかりました。
ip link delete tun0
ip link delete tun1
この後、問題は解決しました。
私はあなたがネットワークの最大値に達したという理由で、同じ問題を助長しました。
docker network ls
を使用して削除するものを選択してください:docker network rm networkname_default
私はOpenVPNも同様に動作してこの問題に遭遇しました、そして私はあなたがOpenVPNサーバーを停止/起動してはいけない解決策を見つけました。
どのサブネットを使用するのかを正確に指定する必要があります。 docker-compose.yml
に次のように書いてください。
networks:
default:
driver: bridge
ipam:
config:
- subnet: 172.177.57.0/24
それでおしまい。今、default
ネットワークが使用され、あなたのVPNが172.177.57.*
サブネットから何かをあなたに割り当てていないのであれば大丈夫です。
私は段階的にこの問題を修正しました:
ネットワークをオフにします(無線または有線...)。
システムを再起動してください。
pCのネットワークをオンにする前に、コマンドdocker-compose upを実行して、新しいネットワークを作成します。
それからあなたはネットワークをオンにしてオンにすることができます...