Docker"错误:无法在默认值中找到可用的,不重叠的IPv4地址池以分配给网络"

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)

Dockerfilescraper

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"解决了"这个问题.

  • OpenVPN服务对我来说是个问题. (25认同)
  • `docker network prune`就像一个魅力 (10认同)
  • 如果您需要在vpn旁边运行docker,可以使用以下解决方案:/sf/ask/3198457881/. (6认同)
  • 想象一下我们的工具为我们提供有用的调试信息的生活。 (3认同)
  • 要添加到上述答案中,如果您遇到任何类似修剪问题的问题,系统确实可以提供帮助。`Docker system prune` 也可以是一个修复,但请小心,这会删除你的数据库,只有在你不关心你的数据库时才使用它,或者如果你的数据库容器正在运行,那么这个命令是安全的,因为它只是修剪至少一个容器没有使用的东西。 (2认同)

DrD*_*nit 110

我遇到了这个问题,因为我运行了OpenVPN.一旦我杀死了OpenVPN,docker-compose up就向右射击,错误就消失了.

  • 与此另一个VPN提供商(expressvpn)相同. (6认同)
  • 所以我有同样的问题,我想知道为什么会这样.为什么Docker网络在连接到VPN时会感到困惑. (4认同)
  • 运行 OpenVPN 的同样问题 (2认同)
  • 私有互联网访问我遇到了同样的问题 (2认同)
  • 同样的问题,因为我运行着来自 paloaltonetworks 的名为“globalprotect”的 VPN。一旦我断开 VPN,错误就消失了。创建 Docker 网络后,您可以再次启用 VPN。 (2认同)

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)

与线NAMEDRIVER作为都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会产生错误).

  • 在最近的docker版本中不起作用 - 他们不允许删除内置网络(例如`default`) (8认同)
  • 如果我运行`docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')`我得到`来自守护进程的错误响应:网桥是一个预定义的网络,无法删除` Ubuntu 20.04 `Docker 版本 19.03.9,构建 9d988398e7` `docker-compose 版本 1.25.0,构建未知` (6认同)

mad*_*rdi 31

我也有同样的问题.我跑了docker system prune -a --volumes,docker network prune但两个都没有帮助我.
我使用VPN,我关闭VPN,然后,docker开始正常,他可以创建一个网络.毕竟,您可以再次启用VPN

  • 我的VPN连接与一个docker尝试使用的子网位于同一子网中。断开连接为我解决了这个问题。:) (3认同)
  • 小心“docker system prune -a --volumes”,下次启动 Docker Compose 时,它​​将必须重新下载所有卷 (2认同)

Ste*_*ker 29

TL; 博士

添加

version: '3.7'
services:
  web:
    ...
    network_mode: bridge
Run Code Online (Sandbox Code Playgroud)

network_mode在文档中阅读

长版

免责声明:我对 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.8docker-composeversion1.24.1和 compose 文件格式上测试的3.7

  • 更多内容:我在 Docker 网络领域的冒险经历以及我如何偶然发现一些卡住的东西。 (3认同)
  • 这是一个问题还是一个答案? (2认同)

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.*子网的任何内容,您就可以了。

  • 这应该是公认的答案,因为简单地杀死VPN是愚蠢的 (4认同)
  • 是的,这里有一个小故障。最好使用“172.16.*.*”子网中的一个 (3认同)
  • 这很棒!如果没有OpenVPN,我的服务器将无法承受,因此(即使是暂时的)禁用VPN的建议对我也毫无意义。 (2认同)
  • 172.177.57.0/24 不是路由的 newtork 吗?如果是这样,可能会导致联系互联网上有限数量的主机出现问题。 (2认同)

Car*_*rra 17

就像其他答案提到的那样,Docker的默认本地bridge网络仅支持30个不同的网络(每个网络都可以通过其名称唯一标识)。如果您不使用它们,那就docker network prune可以了。

但是,您可能有兴趣建立30多个容器,每个容器都有自己的网络。如果您有兴趣这样做,则需要定义一个overlay网络。这有点棘手,但这里记录得非常好。


小智 16

运行 VPN 连接时发生同样的错误。尝试使用 docker-compose 创建 docker 镜像。对我有用,可以暂时停止 VPN 连接并执行命令。

  • 此处确认。你让我免于开始运行未知命令。 (5认同)

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

  • 非常感谢您的回答。更改`/etc/docker/daemon.json`后需要重新启动docker服务。 (2认同)

小智 11

答案是:docker network prune


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 服务器上运行良好。


小智 9

当我的系统上运行 VPN 时,我遇到了此错误。我一断开 VPN,docker 就启动并运行了。


Nan*_*iya 8

  1. 检查是否有其他容器正在运行,如果是,请执行: docker-compose down
  2. 如果已连接VPN,则断开连接并再次尝试启动docker容器:

    docker-compose up -d container_name
    
    Run Code Online (Sandbox Code Playgroud)


小智 8

这发生在我身上,因为我正在使用OpenVPN. 我找到了一种方法,我不需要停止使用 VPN 或手动将网络添加到 docker-compose 文件,也不需要运行任何疯狂的脚本。

我切换到WireGuard而不是OpenVPN. 更具体地说,当我运行 nordvpn 解决方案时,我安装了 WireGuard 并使用了他们的版本 NordLynx。


PRI*_*LOP 8

此链接对此问题有很好的解释。

之所以出现这个问题,是因为默认的 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)


小智 6

你可以试试

$sudo service network-manager restart
Run Code Online (Sandbox Code Playgroud)

为我工作.


kar*_*ser 6

如果您有很多网络,则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 工作后