Docker “ERRO: não foi possível encontrar um pool de endereços IPv4 não sobrepostos disponível entre os padrões a serem atribuídos à rede”

154

Eu tenho um diretório apkmirror-scraper-composecom a seguinte estrutura:

.
├── docker-compose.yml
├── privoxy
   ├── config
   └── Dockerfile
├── scraper
   ├── Dockerfile
   ├── newnym.py
   └── requirements.txt
└── tor
    └── Dockerfile

Estou tentando executar o seguinte 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

onde o Dockerfilepara 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"]

isso para privoxyé

FROM alpine:latest
EXPOSE 8118
RUN apk --update add privoxy
COPY config /etc/privoxy/config
CMD ["privoxy", "--no-daemon"]

onde configconsiste nas duas linhas

listen-address 0.0.0.0:8118
forward-socks5 / tor:9050 .

e o Dockerfilefor scraperé

FROM python:2.7-alpine
ADD . /scraper
WORKDIR /scraper
RUN pip install -r requirements.txt
CMD ["python", "newnym.py"]

onde requirements.txtcontém a única linha requests. Finalmente, o programa newnym.pyfoi projetado para simplesmente testar se a alteração do endereço IP usando o Tor está funcionando:

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

As docker-compose buildcompilações foram bem-sucedidas, mas se eu tentar docker-compose up, recebo a seguinte mensagem de erro:

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

Tentei procurar ajuda nessa mensagem de erro, mas não consegui encontrar nenhuma. O que está causando esse erro?

Kurt Peek
fonte
1
Não, docker psnão mostra nenhum contêiner em execução.
Kurt Peek #
77
Você tem uma VPN conectada? Além disso, você já tentou reiniciar o computador? (Estou pesquisando no Google) github.com/moby/moby/issues/30295
Robert
3
Você pode tentar docker network lsconfirmar se as redes já foram criadas no seu host.
Peter Hauge
1
Obrigado @Robert, eu tinha o PIA VPN em execução, depois que eu desconectei e saí, funcionou.
Xx1xx 3/07
15
docker network prune. Isso resolverá o seu problema
Jinna Balu

Respostas:

275

Vi que o docker sugerido pode estar no máximo de redes criadas. O comando docker network prunepode ser usado para remover todas as redes não usadas por pelo menos um contêiner.

Meu problema acabou sendo, como Robert comentou sobre: ​​um problema com o openvpn service openvpn stop'resolveu' o problema.

bbeecher
fonte
10
Se você precisar executar o docker ao lado do vpn, aqui é possível a solução: stackoverflow.com/q/45692255/7918 .
jb.
45
O serviço OpenVPN foi o problema para mim.
Liviu Ilea
Para adicionar à resposta acima, se você tiver qualquer problema como esse, o sistema pode realmente ajudar. Docker system prunetambém pode ser uma correção, mas tenha cuidado, isso pode remover seu banco de dados, use-o apenas se você não se importar com ele, ou se seu contêiner de banco de dados estiver em execução, esse comando é seguro, pois remove as coisas que não estão sendo usadas por pelo menos um recipiente.
Sweet Chilly Philly
Obrigado. Confirmo que para interromper o cliente openvpn funcionará. Eu o havia iniciado alguns dias atrás, então executei o docker-compose hoje e recebi esse erro.
Dat TT
1
Imagine uma vida em que nossas ferramentas nos fornecem informações úteis sobre depuração.
Damien Roche
157

Eu encontrei esse problema porque tinha o OpenVPN em execução. Assim que eu matei o OpenVPN, liguei docker-compose upe o erro desapareceu.

DrDamnit
fonte
9
O mesmo aqui com outro provedor de VPN (expressvpn).
18718 berkes
1
O mesmo problema ao executar o OpenVPN
Nicolai
6
Então, eu tive o mesmo problema e estou me perguntando por que isso está acontecendo. Por que a rede Docker fica confusa quando conectado a uma VPN.
David Ficociello 21/03/19
2
Eu tive o mesmo problema com acesso à Internet e privado
Nicolas
1
Eu adicionei rotas ao invés redirect-gateway def1de contornar o problema sem matar meu serviço openvpn.
Douglas Liu
59

Corri neste problema com o OpenVPN funcionando também e encontrei uma solução em que você NÃO deve parar / iniciar o servidor OpenVPN.

Idéia de que você deve especificar exatamente qual sub-rede deseja usar. Na docker-compose.ymlgravação:

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

É isso aí. Agora, a defaultrede será usada e, se sua VPN não lhe atribuir algo da 172.16.57.*sub - rede, você estará bem.

Arenim
fonte
2
Isso é ótimo! Minha caixa do servidor não suporta o OpenVPN, portanto, conselhos sobre (até mesmo temporariamente) a desativação da VPN não fazem sentido.
iBug 23/06/19
4
esta deve ser a resposta aceita, como simplesmente matando VPN é estúpido
michnovka
172.177.57.0/24 não é um newtork roteado? Nesse caso, pode causar problemas ao entrar em contato com um número limitado de hosts na Internet.
Dstromberg 05/12/19
1
sim, uma falha aqui. Seria melhor usar um da 172.16.*.*sub
Arenim
Eu não acho que usar 172.177.57.*é uma boa ideia, porque não está nos en.wikipedia.org/wiki/Private_network#Private_IPv4_addresses . Use endereços dentro desse intervalo.
lucidyan 10/02
53

Após Peter Hauge 's comentário , após correr docker network lsEu vi (entre outras linhas) o seguinte:

NETWORK ID          NAME                                    DRIVER              SCOPE
dc6a83d13f44        bridge                                  bridge              local
ea98225c7754        docker_gwbridge                         bridge              local
107dcd8aa889        host                                    host                local

A linha com NAMEe DRIVERcomo ambos hostparece ser o que ele está se referindo com "redes já criadas em seu host". Portanto, seguindo https://gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b430 , executei o comando

docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')

Agora docker-compose upfunciona (embora newnym.pyproduza um erro).

Kurt Peek
fonte
8
Não funciona em mais recente janela de encaixe versions- eles rejeitaram a remoção built-in de redes (como default)
pospi
Se você estiver usando o Traefik, desligue o contêiner antes de executar este comando. Caso contrário, ele pensará que todas as suas redes estão ativas.
Allure Web Solutions
se eu executar docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')eu entro Error response from daemon: bridge is a pre-defined network and cannot be removedno Ubuntu Docker version 19.03.9, build 9d988398e7 docker-compose version 1.25.0, build unknown
20.04
47

Eu tenho o mesmo problema. Eu corri docker system prune -a --volumes, docker network prunemas nem me ajudou.

Eu uso uma VPN, desliguei a VPN e, depois que o docker começou normal e foi possível criar uma rede. Depois disso, você pode ativar a VPN novamente.

madjardi
fonte
3
Minha conexão VPN estava na mesma sub-rede que a janela de encaixe estava tentando usar. Desconectar resolveu o problema para mim. :)
XtraSimplicity
1
ahhhVPN estava em execução.
Adiii 13/04/19
25

Como outras respostas mencionadas, a bridgerede local padrão do Docker suporta apenas 30 redes diferentes (cada uma delas identificável exclusivamente pelo nome). Se você não os estiver usando, então docker network prunefará o truque.

No entanto, você pode estar interessado em estabelecer mais de 30 contêineres, cada um com sua própria rede. Você estava interessado em fazer isso e precisaria definir uma overlayrede. Isso é um pouco mais complicado, mas extremamente bem documentado aqui .

EDIT (maio de 2020): o link ficou indisponível, passando pelos documentos que não há uma substituição exata, mas eu recomendo começar a partir daqui .

Carlos Segarra
fonte
Seu
link
@chovy obrigado por me informar, eles reorganizaram seus documentos. Atualizando agora.
Carlos Segarra
13

Eu tive um problema idêntico com a mesma mensagem de erro, mas a solução com a remoção de redes docker não utilizadas não me ajudou. Excluí todas as redes docker não padrão (e todas as imagens e contêineres), mas isso não ajudou - o docker ainda não conseguiu criar uma nova rede.

A causa do problema estava nas interfaces de rede que foram deixadas após a instalação do OpenVpn. (Ele foi instalado no host anteriormente.) Encontrei-os executando o ifconfigcomando:

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

Descobri que posso removê-los com alguns comandos:

ip link delete tun0
ip link delete tun1

Depois disso, o problema desapareceu.

Rara
fonte
Isso funcionou para mim depois de tentar várias opções - openvpn parou, pc reiniciado, Estivador reinstalado, ameixa rede, etc ...
Matt
10
  1. Verifique se algum outro contêiner está em execução. Se sim, faça: docker-compose down
  2. Se a VPN estiver conectada, desconecte-a e tente novamente o container docker:

    docker-compose up -d container_name
Nandini Chaurasiya
fonte
Não tenho VPN em execução, mas a docker-compose downcorrigi para mim
IMB
8

Podes tentar

$sudo service network-manager restart

Trabalhou para mim.

Ivan Mishur
fonte
Trabalhou para mim também!
mmrs151
8

Eu encontrei o mesmo problema, o motivo é que você atingiu o máximo de redes:

faça um: docker network ls Escolha um para remover usando:docker network rm networkname_default

Amine Benkeroum
fonte
7

TL; DR

Adicionar

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

Leia sobre network_modena documentação .

Versão longa

aviso Legal : não tenho muito conhecimento sobre a rede do Docker, mas isso fez o truque para mim. YMMV.

Quando executei docker run my-imagea rede, não tive problemas, mas quando converti esse comando em um docker-compose.ymlarquivo, recebi o mesmo erro do OP.

Li a resposta de Arenim e algumas outras coisas na internet que sugeriam reutilizar uma rede existente.

Você pode encontrar redes existentes como esta:

# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
ca0415dfa442        bridge              bridge              local
78cbbda034dd        host                host                local
709f13f4ce2d        none                null                local

Eu queria reutilizar a bridgerede padrão , então adicionei

services:
  web:
    ...

networks:
  default:
    external:
      name: bridge

para a raiz do meu docker-compose.yml(então não dentro de um dos meus services, mas no recuo da raiz).

Agora recebi o seguinte erro:

ERRO: para o alias do escopo da rede do seu contêiner é suportado apenas para contêineres em redes definidas pelo usuário

Isso levou a esse problema do Docker Github , que dizia claramente que eu deveria adicionar o network_modeobjeto ao meu docker-compose:

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

Eu estava usando a versão do Docker 18.09.8, a docker-composeversão 1.24.1e o formato do arquivo de composição 3.7.

Stefan van den Akker
fonte
1
isso é uma pergunta ou resposta?
chovy 29/04
Mais: minhas aventuras na terra da rede Docker e como me deparei com algo que ficou preso.
Stefan van den Akker
6

Isso aconteceu comigo porque eu estava usando OpenVPN. Encontrei uma maneira de não precisar parar de usar a VPN ou adicionar manualmente uma rede ao arquivo de composição do docker nem executar nenhum script maluco.

Eu mudei para em WireGuardvez de OpenVPN. Mais especificamente, como estou executando a solução nordvpn, instalei o WireGuard e usei sua versão, NordLynx.

ehzicamesmo
fonte
O comando específico para alternar do OpenVPN para o protocolo WireGuard para NordVPN é nordvpn set technology NordLynx. Não é um produto separado e atualmente está disponível apenas no Linux e iOS.
tephyr 16/02
6

Matar o vpn não é necessário.

Esse outro comentário sobre o uso de uma nova rede chega bem perto da solução para mim e estava funcionando por um tempo, mas achei uma maneira melhor graças a algumas conversas em outra pergunta

Crie uma rede com:

docker network create your-network --subnet 172.24.24.0/24

Em seguida, na parte inferior do docker-compose.yaml, coloque o seguinte:

networks:
  default:
    external: 
      name: your-network

Feito. Não há necessidade de adicionar redes a todas as definições de contêineres etc., e você pode reutilizar a rede com outros arquivos de composição do docker, se desejar.

Lótus
fonte
4

Se você deseja muitas redes, pode controlar a quantidade de docker de espaço IP distribuída para cada rede por meio da default-address-poolsconfiguração do deamon, para poder adicionar isso ao seu /etc/docker/daemon.json:

{
  "bip": "10.254.1.1/24",
  "default-address-pools":[{"base":"10.254.0.0/16","size":28}],
}

Aqui eu reservei 10.254.1.1/24(254 endereços IP) para a rede da ponte.

Para qualquer outra rede que eu criar, o docker particionará o 10.254.0.0espaço (65k hosts), distribuindo 16 hosts por vez ( "size":28refere-se à máscara CIDR , para 16 hosts).

Se eu criar algumas redes e depois executá docker network inspect <name>-las, pode ser algo como isto:

        ...
        "Subnet": "10.254.0.32/28",
        "Gateway": "10.254.0.33"
        ...

Os 10.254.0.32/28meios que esta rede pode usar 16 endereços IP de 10.254.0.32- 10.254.0.47.

Mateus
fonte
1

Eu tive o mesmo problema

Criando "schemaregistry1_default" da rede com o driver padrão
ERRO: não foi possível encontrar um pool de endereços IPv4 disponível e não sobreposto entre os padrões a serem atribuídos à rede

e nada ajudou até eu desligar a VPN da Cisco. depois que docker-compor funcionou

Вячеслав Калякин
fonte
-3

Corrigi esse problema por etapas:

  1. desligue sua rede (sem fio ou com fio ...).

  2. reinicie o seu sistema.

  3. antes de ligar sua rede no PC, execute o comando docker-compondo, ele criará uma nova rede.

  4. então você pode ativar a rede e continuar ...

Salim
fonte