Kur*_*eek 101 python docker docker-compose
我有一个apkmirror-scraper-compose
具有以下结构的目录:
.
??? docker-compose.yml
??? privoxy
? ??? config
? ??? Dockerfile
??? scraper
? ??? Dockerfile
? ??? newnym.py
? ??? requirements.txt
??? tor
??? Dockerfile
Run Code Online (Sandbox Code Playgroud)
我正在尝试运行以下内容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
Run Code Online (Sandbox Code Playgroud)
其中,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"]
Run Code Online (Sandbox Code Playgroud)
那privoxy
就是
FROM alpine:latest
EXPOSE 8118
RUN apk --update add privoxy
COPY config /etc/privoxy/config
CMD ["privoxy", "--no-daemon"]
Run Code Online (Sandbox Code Playgroud)
其中config
包括两条线
listen-address 0.0.0.0:8118
forward-socks5 / tor:9050 .
Run Code Online (Sandbox Code Playgroud)
而Dockerfile
为scraper
是
FROM python:2.7-alpine
ADD . /scraper
WORKDIR /scraper
RUN pip install -r requirements.txt
CMD ["python", "newnym.py"]
Run Code Online (Sandbox Code Playgroud)
其中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 __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)))
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
我尝试在此错误消息上搜索帮助,但找不到任何帮助.导致此错误的原因是什么?
bbe*_*her 189
我已经看到它建议docker可能处于最大的创建网络.该命令docker network prune
可用于删除至少一个容器未使用的所有网络.
正如罗伯特评论的那样,我的问题最终出现了:openvpn问题service openvpn stop
"解决了"这个问题.
DrD*_*nit 110
我遇到了这个问题,因为我运行了OpenVPN.一旦我杀死了OpenVPN,docker-compose up
就向右射击,错误就消失了.
Kur*_*eek 46
根据彼得豪格的评论,在跑步时,docker network ls
我看到(以及其他方面)以下内容:
NETWORK ID NAME DRIVER SCOPE
dc6a83d13f44 bridge bridge local
ea98225c7754 docker_gwbridge bridge local
107dcd8aa889 host host local
Run Code Online (Sandbox Code Playgroud)
与线NAME
和DRIVER
作为都host
似乎是什么,他指的是与"你的主机上已经创建网络".所以,按照https://gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b430,我运行命令
docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')
Run Code Online (Sandbox Code Playgroud)
现在docker-compose up
有效(尽管newnym.py
会产生错误).
mad*_*rdi 31
我也有同样的问题.我跑了docker system prune -a --volumes
,docker network prune
但两个都没有帮助我.
我使用VPN,我关闭VPN,然后,docker开始正常,他可以创建一个网络.毕竟,您可以再次启用VPN
Ste*_*ker 29
添加
version: '3.7'
services:
web:
...
network_mode: bridge
Run Code Online (Sandbox Code Playgroud)
免责声明:我对 Docker 网络不是很了解,但这对我有用。天啊。
当我运行docker run my-image
网络时,没有任何问题,但是当我将此命令转换为docker-compose.yml
文件时,我遇到了与 OP 相同的错误。
我在互联网上阅读了Arenim 的回答以及其他一些建议重新使用现有网络的内容。
您可以找到这样的现有网络:
# docker network ls
NETWORK ID NAME DRIVER SCOPE
ca0415dfa442 bridge bridge local
78cbbda034dd host host local
709f13f4ce2d none null local
Run Code Online (Sandbox Code Playgroud)
我想重用默认bridge
网络,所以我添加了
services:
web:
...
networks:
default:
external:
name: bridge
Run Code Online (Sandbox Code Playgroud)
到my的根docker-compose.yml
(所以不在 my 之一内
services
,而是在根缩进处)。
我现在收到以下错误:
错误:对于您的容器,网络范围别名仅支持用户定义网络中的容器
这导致遇到了这个 Docker Github 问题,它明确指出我应该将network_mode
对象添加到我的docker-compose
:
version: '3.7'
services:
web:
...
network_mode: bridge
Run Code Online (Sandbox Code Playgroud)
这是在 Docker version 18.09.8
、docker-compose
version1.24.1
和 compose 文件格式上测试的3.7
。
Are*_*nim 19
我在运行OpenVPN时也遇到了这个问题,并且我找到了一个解决方案,您不应停止/启动OpenVPN服务器。
想法,您应该指定要使用的确切子网。在docker-compose.yml
写:
networks:
default:
driver: bridge
ipam:
config:
- subnet: 172.177.57.0/24
Run Code Online (Sandbox Code Playgroud)
而已。现在,default
将使用网络,并且如果您的VPN没有为您分配来自172.177.57.*
子网的任何内容,您就可以了。
小智 16
运行 VPN 连接时发生同样的错误。尝试使用 docker-compose 创建 docker 镜像。对我有用,可以暂时停止 VPN 连接并执行命令。
Lot*_*tus 14
不需要杀死 vpn。
关于使用新网络的另一条评论对我来说非常接近解决方案,并且已经工作了一段时间,但是由于在另一个问题中进行了一些讨论,我找到了更好的方法
创建一个网络:
docker network create your-network --subnet 172.24.24.0/24
Run Code Online (Sandbox Code Playgroud)
然后,在 docker-compose.yaml 的底部,输入:
networks:
default:
external:
name: your-network
Run Code Online (Sandbox Code Playgroud)
完毕。无需向所有容器定义等添加网络,如果您愿意,也可以将网络与其他 docker-compose 文件一起使用。
Mat*_*hew 12
如果您需要大量网络,那么您可以通过default-address-pools
守护进程设置控制docker向每个网络分配多少IP空间,因此您可以将其添加到您的/etc/docker/daemon.json
:
{
"bip": "10.254.1.1/24",
"default-address-pools":[{"base":"10.254.0.0/16","size":28}],
}
Run Code Online (Sandbox Code Playgroud)
在这里,我10.254.1.1/24
为桥接网络预留了(254 个 IP 地址)。
对于我创建的任何其他网络,docker 将分割10.254.0.0
空间(65k 主机),一次分配16 台主机("size":28
指的是CIDR 掩码,用于 16 台主机)。
如果我创建了几个网络然后docker network inspect <name>
在它们上运行,它可能会显示如下内容:
...
"Subnet": "10.254.0.32/28",
"Gateway": "10.254.0.33"
...
Run Code Online (Sandbox Code Playgroud)
这10.254.0.32/28
意味着该网络可以使用来自10.254.0.32
- 的16 个 IP 地址10.254.0.47
。
Rar*_*ara 10
我有相同的错误消息出现相同的问题,但是删除未使用的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)
...
Run Code Online (Sandbox Code Playgroud)
我发现我可以使用几个命令将其删除:
ip link delete tun0
ip link delete tun1
Run Code Online (Sandbox Code Playgroud)
之后,问题消失了。
Ash*_*arg 10
docker network prune
Run Code Online (Sandbox Code Playgroud)
2022 年 9 月,我在 ubuntu 20 服务器上运行良好。
docker-compose down
如果已连接VPN,则断开连接并再次尝试启动docker容器:
docker-compose up -d container_name
Run Code Online (Sandbox Code Playgroud)小智 8
这发生在我身上,因为我正在使用OpenVPN
. 我找到了一种方法,我不需要停止使用 VPN 或手动将网络添加到 docker-compose 文件,也不需要运行任何疯狂的脚本。
我切换到WireGuard
而不是OpenVPN
. 更具体地说,当我运行 nordvpn 解决方案时,我安装了 WireGuard 并使用了他们的版本 NordLynx。
此链接对此问题有很好的解释。
之所以出现这个问题,是因为默认的 Docker 守护进程的 IP 地址池较小。/etc/docker/daemon.json
这个问题可以通过配置以下内容来解决:
{
"default-address-pools" : [
{
"base" : "172.17.0.0/12",
"size" : 20
},
{
"base" : "192.168.0.0/16",
"size" : 24
}
]
}
Run Code Online (Sandbox Code Playgroud)
如果您有很多网络,则docker network ls
需要运行docker system prune -f
此行删除未使用的数据、未使用的图像和所有未使用的本地卷。我的 crontab 中有它:
# cleanup docker
0 3 * * * /usr/bin/docker system prune -f;/usr/bin/docker image prune -a --filter "until=24h" -f; /usr/bin/docker volume prune -f
Run Code Online (Sandbox Code Playgroud)
小智 5
我遇到了同样的问题,原因是您达到了网络的最大数量:
做一个:docker network ls
选择一个要删除使用:docker network rm networkname_default
小智 5
我遇到了同样的问题
使用默认驱动程序创建网络“schemaregistry1_default”
错误:无法在分配给网络的默认地址池中找到可用的、非重叠的 IPv4 地址池
在我关闭 Cisco VPN 之前,一切都没有任何帮助。docker-compose up 工作后
归档时间: |
|
查看次数: |
54230 次 |
最近记录: |