Docker "ERROR: не удалось найти доступный, неперекрывающийся пул адресов IPv4 среди значений по умолчанию для назначения сети"

У меня есть каталог 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 для 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 .

а Dockerfile для scraper -

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

где requirements.txt содержит единственную строку requests. Наконец, программа newnym.py предназначена для простого тестирования того, работает ли изменение IP-адреса с помощью 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)))

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

Я попытался найти помощь по этому сообщению об ошибке, но не смог найти. Что вызывает эту ошибку?

Ответ 1

Следуя Peter Hauge comment, при запуске docker network ls я увидел (среди прочих строк) следующее:

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

Линия с NAME и DRIVER как и host кажется тем, что он имеет в виду с "сетями, уже созданными на вашем хосте". Итак, следуя https://gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b430, я выполнил команду

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

Теперь docker-compose up работает (хотя newnym.py создает ошибку).

Ответ 2

Я видел, что он предположил, что докер может быть в максимуме созданных сетей. Команда docker network prune может использоваться для удаления всех сетей, не используемых хотя бы одним контейнером.

Моя проблема закончилась тем, что Robert прокомментировал: проблема с openvpn service openvpn stop "решена".

Ответ 3

Я столкнулся с этой проблемой, потому что работал OpenVPN. Как только я убил OpenVPN, docker-compose up выстрелил прямо вверх, и ошибка исчезла.

Ответ 4

У меня та же проблема. Я побежал docker system prune -a --volumes, docker network prune, но и как не помог мне.
Я использую VPN, я отключаю VPN, и после этого докер запускается нормально, и он может создать сеть. В конце концов, вы можете снова включить VPN

Ответ 5

Как уже упоминалось в других ответах, локальная bridge сеть Docker по умолчанию поддерживает только 30 различных сетей (каждая из которых уникально идентифицируется по имени). Если вы их не используете, то docker network prune сделает это.

Тем не менее, вы можете быть заинтересованы в создании более 30 контейнеров, каждый со своей сетью. Если вы заинтересованы в этом, вам нужно будет определить overlay сеть. Это немного сложнее, но очень хорошо задокументировано здесь.

Ответ 6

Я столкнулся с этой проблемой, когда OpenVPN работал, и я нашел решение, в котором вы НЕ должны останавливать/запускать сервер OpenVPN.

Идея в том, что Вы должны указать, какую именно подсеть вы хотите использовать. В docker-compose.yml напишите:

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

Это. Теперь будет использоваться сеть по default, и если ваш VPN не назначил вам что-то из 172.177.57.* Подсети, то все в порядке.

Ответ 7

У меня была идентичная проблема с тем же сообщением об ошибке, но решение по удалению неиспользуемых сетей докеров мне не помогло. Я удалил все докерские сети не по умолчанию (а также все изображения и контейнеры), но это не помогло - докер все еще не смог создать новую сеть.

Причиной проблемы были сетевые интерфейсы, которые остались после установки 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)
...

Я обнаружил, что могу удалить их с помощью нескольких команд:

ip link delete tun0
ip link delete tun1

После этого проблема исчезла.

Ответ 8

  1. Проверьте, работает ли какой-либо другой контейнер. Если да, выполните: docker-compose down
  2. Если VPN-соединение подключено, отключите его и попробуйте снова подключить Docker-контейнер:

    docker-compose up -d container_name
    

Ответ 9

Вы можете попробовать

$sudo service network-manager restart

Работал для меня.

Ответ 10

Я столкнулся с той же проблемой, причина в том, что вы достигли максимума сетей:

do: docker network ls Выберите один из них, чтобы удалить, используя: docker network rm networkname_default

Ответ 11

Есть ли способ, которым мы можем игнорировать этот предел сетей? Или изменить лимит на 50 или более?

Ответ 12

TL; DR

добавлять

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

Читайте о network_mode в документации.

Длинная версия

Отказ от ответственности: я не очень хорошо разбираюсь в сетях Docker, поэтому "решение", которое сработало для меня, похоже на магическое заклинание и YMMV.

Когда я запустил 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

Я хотел использовать bridge сеть по умолчанию, поэтому добавил

services:
  web:
    ...

networks:
  default:
    external:
      name: bridge

в корень моего docker-compose.yml (так что не внутри одного из моих services, а в корне отступа).

Теперь я получил следующую ошибку:

ОШИБКА: для псевдонима области вашего контейнера поддерживается только для контейнеров в пользовательских сетях

Это привело к возникновению проблемы с Docker Github, в которой прямо указывалось, что я должен добавить объект network_mode в мой docker-compose:

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

Я использовал Docker версии 18.09.8, docker-compose версии 1.24.1 и формат файла композиции 3.7.

Ответ 13

Это случилось со мной, потому что я использовал OpenVPN. Я нашел способ, при котором мне не нужно прекращать использование VPN, вручную добавлять сеть в файл docker-compose и не запускать какие-либо сумасшедшие сценарии.

Я переключился на WireGuard вместо OpenVPN. Более конкретно, поскольку я использую решение nordvpn, я установил WireGuard и использовал их версию NordLynx.

Ответ 14

Я исправил эту проблему по шагам:

  1. выключите вашу сеть (беспроводную или проводную...).

  2. перезагрузите вашу систему.

  3. перед включением сети на ПК выполните команду docker-compose, она собирается создать новую сеть.

  4. тогда вы можете включить сеть и продолжить...