Docker "ERROR: no se pudo encontrar un grupo de direcciones IPv4 no superpuesto disponible entre los valores predeterminados para asignar a la red"

154

Tengo un directorio apkmirror-scraper-composecon la siguiente estructura:

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

Estoy tratando de ejecutar lo siguiente 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

donde el Dockerfilede tores

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"]

eso para privoxyes

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

donde configconsiste en las dos líneas

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

y el Dockerfilepara scraperes

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

donde requirements.txtcontiene la única línea requests. Finalmente, el programa newnym.pyestá diseñado para simplemente probar si está funcionando el cambio de la dirección IP usando Tor:

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

Las docker-compose buildcompilaciones se docker-compose uprealizan correctamente, pero si lo intento , aparece el siguiente mensaje de error:

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

Intenté buscar ayuda para este mensaje de error, pero no pude encontrar ninguna. Que esta causando este error?

Kurt Peek
fuente
1
No, docker psno muestra ningún contenedor en ejecución.
Kurt Peek
77
¿Tienes una VPN conectada? Además, ¿ha intentado reiniciar su computadora? (Estoy buscando en
Robert
3
¿Puede intentar docker network lsconfirmar si las redes ya se crearon en su host?
Peter Hauge
1
Gracias @Robert Tenía VPN PIA ejecutándose, una vez que me desconecté y salí, funcionó.
xx1xx
15
docker network prune. Esto resolverá su problema
Jinna Balu

Respuestas:

275

He visto que sugiere que Docker puede estar en su máximo de redes creadas. El comando docker network prunese puede usar para eliminar todas las redes no utilizadas por al menos un contenedor.

Mi problema terminó siendo, como Robert comentó: un problema con openvpn service openvpn stop'resolvió' el problema.

bbeecher
fuente
10
Si necesita ejecutar docker junto con vpn, aquí hay una posible solución: stackoverflow.com/q/45692255/7918 .
jb.
45
El servicio OpenVPN fue el problema para mí.
Liviu Ilea
Para agregar a la respuesta anterior, si tiene algún problema como esta poda, el sistema realmente puede ayudar. Docker system prunetambién puede ser una solución, pero tenga cuidado, esto puede eliminar su base de datos, solo use esto si no le importa su base de datos, o si su contenedor de base de datos se está ejecutando, este comando es seguro ya que solo elimina las cosas que no se usan por al menos un contenedor.
Sweet Chilly Philly
Gracias. Confirmo que para detener el cliente openvpn funcionará. Lo comencé hace unos días, luego ejecuté el docker-compose hoy y obtuve ese error.
Dat TT
1
Imagine una vida en la que nuestras herramientas nos brinden información útil para la depuración.
Damien Roche
157

Me encontré con este problema porque tenía OpenVPN ejecutándose. Tan pronto como maté a OpenVPN, docker-compose updisparé de inmediato y el error desapareció.

DrDamnit
fuente
9
Lo mismo aquí con otro proveedor de VPN (expressvpn).
Berkes
1
El mismo problema con la ejecución de OpenVPN
Nicolai
66
Entonces tuve el mismo problema y me pregunto por qué sucede esto. ¿Por qué las redes de Docker se confunden cuando se conecta a una VPN?
David Ficociello
2
Tuve el mismo problema con el acceso privado a Internet
Nicolas
1
He agregado rutas en lugar de redirect-gateway def1evitar el problema sin matar mi servicio openvpn.
Douglas Liu
59

Me encontré con este problema con OpenVPN funcionando también y encontré una solución donde NO debería detener / iniciar el servidor OpenVPN.

Idea de que debe especificar exactamente qué subred desea usar. En docker-compose.ymlescritura:

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

Eso es. Ahora, defaultse utilizará la red y si su VPN no le asignó algo de la 172.16.57.*subred, está bien.

Arenim
fuente
2
¡Esto es genial! Mi caja del servidor no puede sostenerse sin OpenVPN, por lo que los consejos para deshabilitar (incluso temporalmente) la VPN no tienen sentido.
iBug
44
esta debería ser la respuesta aceptada, ya que simplemente matar a VPN es estúpido
michnovka
¿No es 172.177.57.0/24 un newtork enrutado? Si es así, podría causar problemas para contactar un número limitado de hosts en Internet.
dstromberg
1
Sí, una falla aquí. Sería mejor usar uno de la 172.16.*.*subred
Arenim
No creo que usar 172.177.57.*sea ​​una buena idea, porque no está en en.wikipedia.org/wiki/Private_network#Private_IPv4_addresses . Use direcciones dentro de este rango.
lucidyan
53

Siguiendo el comentario de Peter Hauge , al correr vi (entre otras líneas) lo siguiente:docker network ls

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

La línea con NAMEy DRIVERcomo ambos hostparece ser a lo que se refiere con "redes ya creadas en su host". Entonces, siguiendo https://gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b430 , ejecuté el comando

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

Ahora docker-compose upfunciona (aunque newnym.pyproduce un error).

Kurt Peek
fuente
8
No funciona en las versiones más recientes de Docker: no han permitido eliminar las redes integradas (como default)
pospi
Si está utilizando Traefik, asegúrese de cerrar ese contenedor antes de ejecutar este comando. De lo contrario, pensará que todas sus redes están activas.
Allure Web Solutions
si corro docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')me meto Error response from daemon: bridge is a pre-defined network and cannot be removeden Ubuntu 20.04Docker version 19.03.9, build 9d988398e7 docker-compose version 1.25.0, build unknown
therobyouknow
47

Tengo el mismo problema. Corrí docker system prune -a --volumes, docker network prunepero ninguno me ayudó.

Utilizo una VPN, apagué la VPN y, después de que la ventana acoplable comenzó a funcionar normalmente, pude crear una red. Después de eso, puede habilitar VPN nuevamente.

madjardi
fuente
3
Mi conexión VPN estaba en la misma subred que el acoplador que intentaba usar. Desconectar me resolvió el problema. :)
XtraSimplicity
1
ahhhVPN se estaba ejecutando.
Adiii
25

Como se mencionó en otras respuestas, la bridgered local predeterminada de Docker solo admite 30 redes diferentes (cada una de ellas identificable de forma única por su nombre). Si no los está utilizando, entonces docker network prunehará el truco.

Sin embargo, puede estar interesado en establecer más de 30 contenedores, cada uno con su propia red. Si estaba interesado en hacerlo, necesitaría definir una overlayred. Esto es un poco más complicado pero extremadamente bien documentado aquí .

EDITAR (mayo de 2020): el enlace no está disponible, revisando los documentos no hay un reemplazo exacto, pero recomendaría comenzar desde aquí .

Carlos Segarra
fuente
Su enlace es un 404
chovy
@chovy gracias por avisarme, han reorganizado sus documentos. Actualizando ahora.
Carlos Segarra
13

Tuve un problema idéntico con el mismo mensaje de error, pero la solución con la eliminación de redes de acopladores no utilizadas no me ayudó. Eliminé todas las redes de acopladores no predeterminadas (y también todas las imágenes y contenedores), pero no sirvió de nada; el acoplador aún no pudo crear una nueva red.

La causa del problema estaba en las interfaces de red que quedaron después de la instalación de OpenVpn. (Se instaló en el host anteriormente). Los encontré ejecutando el 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)
...

Descubrí que puedo eliminarlos con un par de comandos:

ip link delete tun0
ip link delete tun1

Después de esto, el problema ha desaparecido.

Rara
fuente
Esto funcionó para mí después de probar varias opciones: detuve openvpn, reiniciaba la PC, reinstalaba la ventana acoplable, la poda de red, etc ...
Matt
10
  1. Verifique si algún otro contenedor está funcionando. En caso afirmativo, haga: docker-compose down
  2. Si la VPN está conectada, desconéctela e intente nuevamente subir el contenedor acoplable:

    docker-compose up -d container_name
Nandini Chaurasiya
fuente
No tengo VPN en funcionamiento, pero lo docker-compose downarreglé para mí
IMB
8

Puedes probar

$sudo service network-manager restart

Trabajó para mi.

Ivan Mishur
fuente
¡Trabajó para mí también!
mmrs151
8

Me encontré con el mismo problema, la razón es que llegaste al máximo de redes:

hacer un: docker network ls Elija uno para eliminar usando:docker network rm networkname_default

Amine Benkeroum
fuente
7

TL; DR

Añadir

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

Lea sobre network_modeen la documentación .

Versión larga

Descargo de responsabilidad : no estoy muy bien informado sobre las redes de Docker, pero esto fue el truco para mí. YMMV.

Cuando ejecuté docker run my-imagela red, no tuve problemas, pero cuando convertí este comando en un docker-compose.ymlarchivo, recibí el mismo error que el OP.

Leí la respuesta de Arenim y algunas otras cosas en Internet que sugerían reutilizar una red existente.

Puede 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

Quería reutilizar la bridgered predeterminada , así que agregué

services:
  web:
    ...

networks:
  default:
    external:
      name: bridge

a la raíz de mi docker-compose.yml(así que no dentro de una de mi services, sino en la sangría de la raíz).

Ahora recibí el siguiente error:

ERROR: para el alias con alcance de red de su contenedor solo se admite para contenedores en redes definidas por el usuario

Esto llevó a este problema de Docker Github , que decía claramente que debería agregar el network_modeobjeto a mi docker-compose:

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

Estaba usando la versión Docker 18.09.8, la docker-composeversión 1.24.1y el formato de archivo de composición 3.7.

Stefan van den Akker
fuente
1
¿Es esta una pregunta o una respuesta?
chovy
Más a: mis aventuras en la tierra de la red Docker y cómo me topé con algo que se quedó.
Stefan van den Akker
6

Esto me sucedió porque estaba usando OpenVPN. Encontré una forma en que no necesito dejar de usar la VPN o agregar manualmente una red al archivo docker-compose ni ejecutar ningún script loco.

Me cambié a en WireGuardlugar de OpenVPN. Más específicamente, como estoy ejecutando la solución nordvpn, instalé WireGuard y usé su versión, NordLynx.

ehzicamesmo
fuente
El comando específico para cambiar de OpenVPN al protocolo WireGuard para NordVPN es nordvpn set technology NordLynx. No es un producto separado, y actualmente solo está disponible en Linux e iOS.
Tephyr
6

No es necesario matar el VPN.

Este otro comentario sobre el uso de una nueva red se acerca bastante a la solución para mí y estuvo funcionando durante un tiempo, pero encontré una mejor manera gracias a algunas conversaciones en otra pregunta.

Crea una red con:

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

Luego, en la parte inferior de docker-compose.yaml, ponga esto:

networks:
  default:
    external: 
      name: your-network

Hecho. No es necesario agregar redes a todas las definiciones de contenedor, etc. y también puede reutilizar la red con otros archivos compuestos por docker si lo desea.

Loto
fuente
4

Si desea muchas redes, puede controlar la cantidad de espacio IP que la default-address-poolsventana acoplable distribuye a cada red a través de la configuración de deamon, para que pueda agregar esto a su /etc/docker/daemon.json:

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

Aquí he reservado 10.254.1.1/24(254 direcciones IP) para la red del puente.

Para cualquier otra red que creo, Docker dividirá el 10.254.0.0espacio (65k hosts), dando 16 hosts a la vez (se "size":28refiere a la máscara CIDR , para 16 hosts).

Si creo algunas redes y luego las ejecuto docker network inspect <name>, podría mostrar algo como esto:

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

Esto 10.254.0.32/28significa que esta red puede usar 16 direcciones IP de 10.254.0.32- 10.254.0.47.

Mateo
fuente
1

Tuve el mismo problema

Crear la red "schemaregistry1_default" con el controlador predeterminado
ERROR: no se pudo encontrar un grupo de direcciones IPv4 no superpuesto disponible entre los valores predeterminados para asignar a la red

y nada ayudó hasta que apagué la VPN de Cisco. después de que Docker-componer funcionó

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

Solucioné este problema por pasos:

  1. apague su red (inalámbrica o por cable ...).

  2. reinicie su sistema.

  3. antes de encender su red en la PC, ejecute el comando docker-compose, creará una nueva red.

  4. entonces puede encender la red y continuar ...

salim
fuente