Docker“错误:在分配给网络的默认值中找不到可用的、非重叠的 IPv4 地址池”
Posted
技术标签:
【中文标题】Docker“错误:在分配给网络的默认值中找不到可用的、非重叠的 IPv4 地址池”【英文标题】:Docker "ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network" 【发布时间】:2017-09-28 22:35:37 【问题描述】:我有一个目录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
tor
的 Dockerfile
在哪里
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
由两行组成
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 __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
,我会收到以下错误消息:
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
我尝试搜索有关此错误消息的帮助,但找不到任何帮助。是什么导致了这个错误?
【问题讨论】:
不,docker ps
显示没有容器在运行。
您是否连接了 ***?另外,你试过重启你的电脑吗? (我在谷歌上搜索)github.com/moby/moby/issues/30295
您能否尝试docker network ls
并确认您的主机上是否已创建网络。
谢谢@Robert 我已经运行了 PIA ***,一旦我断开连接并退出,它就可以工作了。
docker network prune
。这将解决您的问题
【参考方案1】:
我看到它表明 docker 可能处于创建网络的最大值。命令docker network prune
可用于删除至少一个容器未使用的所有网络。
正如Robert 评论的那样,我的问题最终成为:open*** 的问题service open*** stop
“解决了”问题。
【讨论】:
如果您需要在 *** 旁边运行 docker,这里可能的解决方案是:***.com/q/45692255/7918。 Open*** 服务对我来说是个问题。 添加到上面的答案中,如果您遇到任何这样的问题,修剪系统真的可以提供帮助。Docker system prune
也可以修复,但请注意,这可以删除您的数据库,仅在您不关心您的数据库时使用它,或者如果您的数据库容器正在运行,那么此命令是安全的,因为它只会修剪东西未被至少一个容器使用。
谢谢。我确认停止 open*** 客户端将起作用。几天前我开始了它,然后我今天运行了 docker-compose 并得到了那个错误。
想象一下我们的工具为我们提供有用的调试信息的生活。【参考方案2】:
我遇到了这个问题,因为我运行了 Open***。我一杀死 Open***,docker-compose up
立即启动,错误消失了。
【讨论】:
这里与另一个 *** 提供商 (express***) 相同。 运行 Open*** 的同样问题 所以我遇到了同样的问题,我想知道为什么会这样。为什么 Docker 网络在连接到 *** 时会出现混乱。 我在私人互联网访问方面遇到了同样的问题 我添加了路由而不是redirect-gateway def1
来解决这个问题而不会杀死我的 open*** 服务。【参考方案3】:
我在使用 Open*** 的情况下也遇到了这个问题,我找到了一个解决方案,您不应该停止/启动 Open*** 服务器。
您应该指定要使用的确切子网。在docker-compose.yml
写:
networks:
default:
driver: bridge
ipam:
config:
- subnet: 172.16.57.0/24
就是这样。现在,default
网络将被使用,如果您的 *** 没有为您分配来自172.16.57.*
子网的某些内容,那么您很好。
【讨论】:
这太棒了!如果没有 Open***,我的服务器就无法忍受,所以关于(甚至暂时)禁用 *** 的建议对我来说都是无稽之谈。 这应该是公认的答案,因为简单地杀死 *** 是愚蠢的 172.177.57.0/24 不是路由 newtork 吗?如果是这样,它可能会导致与 Internet 上有限数量的主机联系时出现问题。 是的,这里有个小故障。最好使用172.16.*.*
子网中的一个
我不认为使用172.177.57.*
是一个好主意,因为它不在en.wikipedia.org/wiki/Private_network#Private_IPv4_addresses 中。使用此范围内的地址。【参考方案4】:
在Peter Hauge 的comment 之后,在运行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,我运行了命令
docker network rm $(docker network ls | grep "bridge" | awk '/ / print $1 ')
现在docker-compose up
有效(尽管newnym.py
产生错误)。
【讨论】:
在最近的 docker 版本中不起作用——它们不允许删除内置网络(例如default
)
如果您使用的是 Traefik,请确保在运行此命令之前关闭该容器。否则它会认为你所有的网络都是活跃的。
如果我在 Ubuntu 20.04 上运行 docker network rm $(docker network ls | grep "bridge" | awk '/ / print $1 ')
我得到 Error response from daemon: bridge is a pre-defined network and cannot be removed
Docker version 19.03.9, build 9d988398e7
docker-compose version 1.25.0, build unknown
【参考方案5】:
我也有同样的问题。我跑了docker system prune -a --volumes
、docker network prune
,但都没有帮到我。
我使用 ***,我关闭了 ***,之后 docker 正常启动并能够创建网络。之后,您可以再次启用 ***。
【讨论】:
我的 *** 连接与 docker 尝试使用的一个子网位于同一子网上。断开连接为我解决了这个问题。 :) 另外,请在关闭打开的 *** 连接后为我解决。【参考方案6】:TL;DR
添加
version: '3.7'
services:
web:
...
network_mode: bridge
Read about network_mode
in the
documentation.
加长版
免责声明:我对 Docker 网络不是很了解,但这对我有用。 YMMV。
当我运行 docker run my-image
时,网络没有给我带来任何问题,但是当我运行 docker run my-image
我将此命令转换为docker-compose.yml
文件,我得到了同样的错误
作为OP。
我读过Arenim's answer 和 互联网上的其他一些建议重用现有网络的东西。
你可以像这样找到现有的网络:
# docker network ls
NETWORK ID NAME DRIVER SCOPE
ca0415dfa442 bridge bridge local
78cbbda034dd host host local
709f13f4ce2d none null local
我想重用默认的bridge
网络,所以我添加了
services:
web:
...
networks:
default:
external:
name: bridge
到我的docker-compose.yml
的 root(所以不在我的
services
,但在根缩进处)。
我现在收到以下错误:
错误:对于您的容器网络范围别名仅支持 用户定义网络中的容器
这导致遇到this Docker Github
issue,明确说明
我应该将network_mode
对象添加到我的docker-compose
:
version: '3.7'
services:
web:
...
network_mode: bridge
这是在 Docker 版本 18.09.8
、docker-compose
版本 1.24.1
和撰写文件格式 3.7
上测试的。
【讨论】:
这是一个问题还是一个答案? 更多:我在 Docker 网络领域的冒险经历以及我如何偶然发现卡住的东西。 不是每个人都想使用桥接网络【参考方案7】:正如其他答案所提到的,Docker 的默认本地 bridge
网络仅支持 30 个不同的网络(每个网络都可以通过其名称唯一标识)。如果您不使用它们,那么docker network prune
会解决问题。
但是,您可能有兴趣建立 30 多个容器,每个容器都有自己的网络。如果您有兴趣这样做,那么您需要定义一个overlay
网络。这有点棘手,但非常有据可查 here。
编辑(2020 年 5 月):链接已不可用,浏览文档时没有确切的替代品,但我建议从 here 开始。
【讨论】:
【参考方案8】:运行 *** 连接时出现同样的错误。尝试使用 docker-compose 创建 docker 映像。 对我来说可以暂时停止 *** 连接并执行命令。
【讨论】:
在这里确认。你让我免于开始运行未知命令。【参考方案9】:不需要终止 ***。
另一个comment about using a new network comes pretty close to the solution for me,工作了一段时间,但是I found a better way thanks to some talk over in another question
创建一个网络:
docker network create your-network --subnet 172.24.24.0/24
然后,在 docker-compose.yaml 的底部,放这个:
networks:
default:
external:
name: your-network
完成。无需将网络添加到所有容器定义等中,如果您愿意,您也可以将网络与其他 docker-compose 文件一起使用。
【讨论】:
【参考方案10】:答案是:docker network prune
【讨论】:
也许在这个答案中添加更多细节,说明问题是什么以及这个命令如何解决它。否则,它似乎会迷失在滚动节中,因为它很短:D【参考方案11】:我遇到了相同的错误消息,但删除未使用的 docker 网络的解决方案对我没有帮助。我已经删除了所有非默认 docker 网络(以及所有图像和容器),但它没有帮助 - docker 仍然无法创建新网络。
问题的原因在于安装 Open*** 后留下的网络接口。 (它之前安装在主机上。)我通过运行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
之后问题就消失了。
【讨论】:
在尝试了几个选项后这对我有用 - 停止 open***、重新启动 pc、重新安装 docker、网络修剪等......【参考方案12】:如果你想要很多网络,那么你可以通过default-address-pools
deamon 设置控制 docker 分配给每个网络的 IP 空间,这样你就可以将它添加到你的 /etc/docker/daemon.json
:
"bip": "10.254.1.1/24",
"default-address-pools":["base":"10.254.0.0/16","size":28],
这里我为桥接网络保留了10.254.1.1/24
(254 个 IP 地址)。
对于我创建的任何其他网络,docker 将划分10.254.0.0
空间(65k 主机),一次分配 16 台主机("size":28
指的是CIDR mask,对于 16 台主机)。
如果我创建几个网络然后在它们上运行docker network inspect <name>
,它可能会显示如下内容:
...
"Subnet": "10.254.0.32/28",
"Gateway": "10.254.0.33"
...
10.254.0.32/28
表示此网络可以使用来自10.254.0.32
- 10.254.0.47
的 16 个 IP 地址。
【讨论】:
非常感谢您的回答。修改/etc/docker/daemon.json
后需要重启docker服务。
这应该被标记为答案,而不是 ``` docker network prune ``` 或者在 compose 中重新配置不可扩展的默认网桥。在这种情况下,总是可以添加池。【参考方案13】:
你可以试试
$sudo service network-manager restart
为我工作。
【讨论】:
【参考方案14】:-
检查是否有其他容器正在运行,如果是,请执行:
docker-compose down
如果 *** 已连接,则断开它并再次尝试启动 docker 容器:
docker-compose up -d container_name
【讨论】:
我没有运行 *** 但docker-compose down
为我修复了它【参考方案15】:
我遇到了同样的问题,原因是你达到了网络的最大值:
做一个:docker network ls
选择一个删除使用:docker network rm networkname_default
【讨论】:
【参考方案16】:这发生在我身上是因为我使用的是Open***
。我找到了一种方法,我不需要停止使用 *** 或手动将网络添加到 docker-compose 文件,也不需要运行任何疯狂的脚本。
我切换到WireGuard
,而不是Open***
。更具体地说,当我运行 nord*** 解决方案时,我安装了 WireGuard 并使用了他们的版本 NordLynx。
【讨论】:
Nord*** 从 Open*** 切换到 WireGuard 协议的具体命令是nord*** set technology NordLynx
。它不是一个单独的产品,目前仅适用于 Linux 和 ios。
谢谢你!它运行良好,我不需要额外安装,只需运行 nord*** set technology NordLynx
就可以了。【参考方案17】:
我遇到了同样的问题
使用默认驱动程序创建网络“schemaregistry1_default” 错误:在分配给网络的默认值中找不到可用的非重叠 IPv4 地址池
在我关闭 Cisco *** 之前没有任何帮助。 之后 docker-compose up 工作了
【讨论】:
非常感谢@Вячеслав Калякин!关闭 *** 也解决了我的问题。【参考方案18】:如果你在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
【讨论】:
【参考方案19】:我在没有运行 Open*** 的企业开发虚拟机上遇到了这个问题。查看etc/docker/daemon.json
,我发现
...
"default-address-pools": [
"base": "192.168.11.0/24",
"size": 24
],
...
奇怪的是,删除 default-address-pools
字段,然后使用 sudo systemctl restart docker
重新启动 docker 为我解决了这个问题。我假设这让 docker 选择更合适的默认值,但我不知道选择的默认值有什么问题。
【讨论】:
【参考方案20】:我遇到了同样的错误,但就我而言,这是因为我运行的容器太多(大约 220 个)。
【讨论】:
【参考方案21】:我在我正在使用的一个企业网络中发现了这个问题。具体要求不是使用 docker 172.17.0.0/16 和 172.18.0.0/16 中的默认值。
应该使用我在 docker daemon 中配置的私有 IP4 网络,例如 10.28.160.0/24 和 10.28.161.0/24,这会导致不重叠的问题。将子网掩码更改为 /16 例如 10.28.160.0/16 解决了这个问题。它显然提供了更多数量的主机,因此很容易实现轮询。
【讨论】:
【参考方案22】:我通过步骤解决了这个问题:
关闭您的网络(无线或有线...)。
重启系统。
在PC上打开网络之前,执行命令docker-compose up,它将创建新的网络。
然后你可以打开网络继续...
【讨论】:
确实,reboot
我的电脑在我的情况下工作了,谢谢!以上是关于Docker“错误:在分配给网络的默认值中找不到可用的、非重叠的 IPv4 地址池”的主要内容,如果未能解决你的问题,请参考以下文章
Docker学习__docker命令[docker version 和 docker info]