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

时间:2017-05-01 13:59:29

标签: python docker docker-compose

我有一个目录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的{​​{1}}为

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

listen-address 0.0.0.0:8118 forward-socks5 / tor:9050 . 的{​​{1}}是

Dockerfile

其中scraper包含单行FROM python:2.7-alpine ADD . /scraper WORKDIR /scraper RUN pip install -r requirements.txt CMD ["python", "newnym.py"] 。最后,程序requirements.txt旨在简单地测试使用Tor更改IP地址是否有效:

requests

newnym.py已成功构建,但如果我尝试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

我尝试在此错误消息上搜索帮助,但无法找到。导致此错误的原因是什么?

21 个答案:

答案 0 :(得分:128)

我已经看到它建议docker可能处于创建网络的最大数量。命令docker network prune可用于删除至少一个容器未使用的所有网络。

我的问题最终正如Robert评论的那样:openvpn问题service openvpn stop已解决'问题。

答案 1 :(得分:94)

我遇到了这个问题因为我运行了OpenVPN。一旦我杀死了OpenVPN,docker-compose up立即向上发射,错误就消失了。

答案 2 :(得分:40)

关注Peter Haugecomment,在运行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会产生错误)。

答案 3 :(得分:19)

我有同样的问题。我跑了docker system prune -a --volumesdocker network prune,但都没有帮助我。
我使用VPN,我关闭了VPN,之后,docker正常启动,他可以创建网络。毕竟,您可以再次启用VPN

答案 4 :(得分:8)

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

    docker-compose up -d container_name
    

答案 5 :(得分:8)

无需杀死VPN。

另外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文件一起重新使用。

答案 6 :(得分:7)

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

但是,您可能有兴趣建立30多个容器,每个容器都有自己的网络。如果您对此感兴趣,则需要定义一个overlay网络。这有点棘手,但here的文献记录非常丰富。

答案 7 :(得分:6)

我遇到了相同的错误消息,但删除未使用的docker网络的解决方案对我没有帮助。我删除了所有非默认的docker网络(以及所有图像和容器),但它没有帮助 - docker仍然无法创建新网络。

问题的原因是在OpenVpn安装后留下的网络接口。 (它之前安装在主机上。)我通过运行GoogleCredentials命令找到它们:

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)
...

此后问题就消失了。

答案 8 :(得分:6)

你可以尝试

$sudo service network-manager restart

为我工作。

答案 9 :(得分:6)

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

答案 10 :(得分:5)

如果您需要大量网络,则可以通过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}],
}

在这里,我为网桥网络保留了10.254.1.1/24(254个IP地址)。

对于我创建的任何其他网络,docker将划分10.254.0.0空间(65k主机),一次分配16台主机("size":28CIDR 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地址。

答案 11 :(得分:4)

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

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

答案 12 :(得分:3)

答案是:docker network prune

答案 13 :(得分:3)

我遇到了同样的问题

使用默认驱动程序创建网络“ schemaregistry1_default”
错误:在分配给网络的默认设置中找不到可用的,不重叠的IPv4地址池

,在关闭Cisco VPN之前,没有任何帮助。 在docker-compose up工作之后

答案 14 :(得分:3)

我遇到了同样的问题,原因是您达到了网络的最大数量:

执行以下操作:docker network ls 选择以下一项删除:docker network rm networkname_default

答案 15 :(得分:1)

我在OpenVPN也能正常工作的情况下遇到了这个问题,并且找到了不应该停止/启动OpenVPN服务器的解决方案。

想法,您应该指定要使用的确切子网。在docker-compose.yml中写:

networks:
  default:
    driver: bridge
    ipam:
      config:
        - subnet: 172.177.57.0/24

就是这样。现在,将使用default网络,并且如果您的VPN没有从172.177.57.*子网中分配您某些东西,您就可以了。

答案 16 :(得分:0)

我在未运行OpenVPN的企业开发VM上遇到了此问题。检出etc/docker/daemon.json,发现了

...
"default-address-pools": [
  {
    "base": "192.168.11.0/24",
    "size": 24
  }
],
...

奇怪的是,删除default-address-pools字段,然后用sudo systemctl restart docker重新启动docker为我解决了这个问题。我假设这会让docker选择一个更合适的默认值,但是我不知道所选默认值有什么问题。

答案 17 :(得分:0)

如果您在 as.Date(paste0(df_Month$yearmonth, "-01"), format = "%Y-%m-%d") 中有很多网络,则需要运行 docker network ls

将此行添加到您的 crontab:

docker system prune -f

答案 18 :(得分:0)

我有同样的错误,但就我而言,那是因为我运行的容器太多(大约220个)。

答案 19 :(得分:0)

TL; DR

添加

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

Read about network_mode in the documentation

长版

免责声明:我对Docker网络不是很了解,所以 对我有用的“解决方案”就像是魔咒和YMMV。

当我运行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(所以不在我的一个 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

答案 20 :(得分:0)

我通过步骤解决了此问题:

  1. 关闭您的网络(无线或有线...)。

  2. 重新启动系统。

  3. 在PC上打开网络之前,执行命令docker-compose up,它将创建新的网络。

  4. 然后您可以打开网络并继续...