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

torDockerfile 在哪里

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 .

Dockerfilescraper

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

NAMEDRIVER 作为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 removedDocker version 19.03.9, build 9d988398e7docker-compose version 1.25.0, build unknown【参考方案5】:

我也有同样的问题。我跑了docker system prune -a --volumesdocker 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.ymlroot(所以不在我的 services,但在根缩进处)。

我现在收到以下错误:

错误:对于您的容器网络范围别名仅支持 用户定义网络中的容器

这导致遇到this Docker Github issue,明确说明 我应该将network_mode 对象添加到我的docker-compose

version: '3.7'
services:
  web:
    ...
    network_mode: bridge

这是在 Docker 版本 18.09.8docker-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教程-1-学习及安装Docker

Docker教程-1-学习及安装Docker

Docker03 Docker基础知识Docker实战

Docker学习__docker命令[docker version 和 docker info]

[转帖]Docker里运行Docker docker in docker(dind)

docker 定时清理docker容器日志