Докер «ОШИБКА: не удалось найти доступный, непересекающийся пул адресов IPv4 среди значений по умолчанию для назначения сети»

155

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

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
Нет, docker psпоказывает, что контейнеры не запущены.
Курт Пик
78
У вас есть VPN подключен? Кроме того, вы пытались перезагрузить компьютер? (Я гуглю) github.com/moby/moby/issues/30295
Роберт,
3
Можете ли вы попробовать docker network lsи подтвердить, если сети уже созданы на вашем хосте.
Питер Хауге
1
Благодаря @Robert, у меня была запущена PIA VPN, когда я отключился и вышел, все заработало.
xx1xx
15
docker network prune, Это решит вашу проблему
Джинна Балу

Ответы:

276

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

Моя проблема закончилась тем, что, как прокомментировал Роберт, проблема с openvpn service openvpn stop«решила» проблему.

bbeecher
источник
10
Если вам нужно запустить Docker вместе с vpn, здесь возможно решение: stackoverflow.com/q/45692255/7918 .
JB.
45
Сервис OpenVPN был проблемой для меня.
Ливиу Илеа
Чтобы добавить к ответу выше, если вы получаете любую проблему, как это сокращение, система может действительно помочь. Docker system pruneЭто также может быть исправлением, но, пожалуйста, будьте осторожны, это может удалить вашу БД, используйте ее, только если вы не заботитесь о вашей БД, или если ваш контейнер БД работает, тогда эта команда безопасна, поскольку она только удаляет ненужные вещи по крайней мере, на один контейнер.
Сладкая чили Филли
Спасибо. Я подтверждаю, что до остановки openvpn клиент будет работать. Я запустил его несколько дней назад, а затем запустил docker-compose сегодня и получил эту ошибку.
Дата TT
1
Представьте себе жизнь, в которой наши инструменты дают нам полезную информацию для отладки.
Дэмиен Рош
157

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

DrDamnit
источник
9
То же самое здесь с другим провайдером VPN (expressvpn).
Берк
1
Та же проблема с запуском OpenVPN
Nicolai
6
У меня была такая же проблема, и мне интересно, почему это происходит. Почему сеть Docker запутывается при подключении к VPN.
Дэвид Фикосиелло
2
У меня была такая же проблема с частным доступом в Интернет
Николас
1
Я добавил маршруты вместо того, redirect-gateway def1чтобы обойти проблему, не убивая мой сервис openvpn.
Дуглас Лю
59

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

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

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

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

Arenim
источник
2
Это круто! Мой серверный ящик не может работать без OpenVPN, поэтому советы по (даже временному) отключению VPN для меня - чепуха.
iBug
4
это должен быть принятый ответ, так как просто убивать VPN глупо
мичновка
Разве 172.177.57.0/24 не является маршрутизируемым newtork? Если это так, это может вызвать проблемы с подключением ограниченного числа хостов в Интернете.
Дстромберг
1
да, глюк здесь. Было бы лучше использовать один из 172.16.*.*подсети
Arenim
Я не думаю, что использование 172.177.57.*это хорошая идея, потому что это не в en.wikipedia.org/wiki/Private_network#Private_IPv4_addresses . Используйте адреса в этом диапазоне.
Луцидян
53

После Питера Hauge «сек комментарий , после запуска 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выдает ошибку).

Курт Пик
источник
8
Не работает в более поздних версиях default
докеров
Если вы используете Traefik, не забудьте закрыть этот контейнер перед выполнением этой команды. В противном случае он будет думать, что все ваши сети активны.
Allure Web Solutions
если я бегу, docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')я получаю Error response from daemon: bridge is a pre-defined network and cannot be removedUbuntu 20.04Docker version 19.03.9, build 9d988398e7 docker-compose version 1.25.0, build unknown
therobyouknow
47

У меня та же проблема. Я побежал docker system prune -a --volumes, docker network pruneно ни один не помог мне.

Я использую VPN, я отключил VPN и, после того, как Docker запустился нормально и смог создать сеть. После этого вы можете снова включить VPN.

madjardi
источник
3
Мое VPN-соединение было в той же подсети, что и один докер, который пытался использовать. Отключение решило проблему для меня. :)
XtraSimplicity
1
аааааааааааааааааааааааааааааааааааляла
Adiii
25

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

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

РЕДАКТИРОВАТЬ (май 2020 г.): ссылка стала недоступной, просматривая документы, нет точной замены, но я бы рекомендовал начать отсюда .

Карлос Сегарра
источник
Ваша ссылка 404
Чови
@chovy спасибо, что сообщили мне, они реорганизовали свои документы. Обновление сейчас.
Карлос Сегарра
13

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

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

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

Rara
источник
Это сработало для меня после того, как я попробовал несколько вариантов - остановил openvpn, перезапустил компьютер, переустановил докер,
Мэтт
10
  1. Проверьте, работает ли какой-либо другой контейнер. Если да, выполните: docker-compose down
  2. Если VPN-соединение подключено, отключите его и попробуйте снова подключить Docker-контейнер:

    docker-compose up -d container_name
Нандини Чаурасия
источник
У меня не работает VPN, но я docker-compose downисправил это
IMB
8

Можешь попробовать

$sudo service network-manager restart

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

Иван Мишур
источник
У меня тоже сработало!
mmrs151
8

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

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

Амин Бенкерум
источник
7

TL; DR

Добавить

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

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

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

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

Когда я запускал docker run my-imageсеть, у меня не было проблем, но когда я преобразовал эту команду в docker-compose.ymlфайл, я получил ту же ошибку, что и OP.

Я прочитал ответ Аренима и некоторые другие материалы в Интернете, которые предлагали повторно использовать существующую сеть.

Вы можете найти существующие сети как это:

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

Стефан ван ден Аккер
источник
1
это вопрос или ответ?
Чови
Более того: мои приключения на земле Docker-сети и как я наткнулся на что-то, что застряло.
Стефан ван ден Аккер
6

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

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

ehzicamesmo
источник
Конкретной командой для переключения с OpenVPN на протокол WireGuard для NordVPN является nordvpn set technology NordLynx. Это не отдельный продукт, и в настоящее время доступен только для Linux и iOS.
tephyr
6

Убийство впн не нужно.

Этот другой комментарий об использовании новой сети довольно близок к решению для меня , и работал некоторое время, но я нашел лучший путь благодаря некоторому разговору в другом вопросе

Создайте сеть с:

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

Затем в нижней части docker-compose.yaml поместите это:

networks:
  default:
    external: 
      name: your-network

Готово. Нет необходимости добавлять сети ко всем определениям контейнеров и т. Д., При желании вы можете повторно использовать сеть с другими файлами docker-compose.

лотос
источник
4

Если вам нужно много сетей, то вы можете контролировать, сколько Docker пространства IP-адресов раздает каждой сети через default-address-poolsнастройку deamon, так что вы можете добавить это в ваш /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пространство (65 тыс. Хостов), выдавая 16 хостов одновременно ( "size":28относится к маске CIDR , для 16 хостов).

Если я создаю несколько сетей и затем запускаю docker network inspect <name>их, это может отобразить что-то вроде этого:

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

Это 10.254.0.32/28означает, что эта сеть может использовать 16 IP-адресов от 10.254.0.32- 10.254.0.47.

Мэтью
источник
1

Я столкнулся с той же проблемой

При создании сети "schemaregistry1_default" с драйвером по умолчанию
ОШИБКА: не удалось найти доступный неперекрывающийся пул адресов IPv4 среди значений по умолчанию, назначаемых сети

и ничего не помогало, пока я не выключил Cisco VPN. после этого работал docker-compose

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

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

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

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

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

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

Салим
источник