Докер "ПОМИЛКА: не вдалося знайти доступний пул адрес IPv4, що не перекривається, серед за замовчуванням для призначення мережі"


154

У мене каталог 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
Ні, docker psне показано, що контейнери не працюють.
Курт Пік

77
У вас підключений VPN? Крім того, ви спробували перезапустити комп'ютер? (Я гугла
Роберт

3
Чи можете ви спробувати docker network lsпідтвердити, чи вже у вашому хості були створені мережі.
Пітер Хедж

1
Дякую @Robert У мене була запущена PIA VPN, як тільки я відключився і вийшов, він спрацював.
xx1xx

15
docker network prune. Це вирішить вашу проблему
Jinna Balu

Відповіді:


276

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

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


10
Якщо вам потрібно запустити докер поряд із vpn, тут можливе рішення: stackoverflow.com/q/45692255/7918 .
jb.

45
Сервіс OpenVPN був проблемою для мене.
Лівіу Ілеа

Щоб додати до вищезгаданої відповіді, якщо у вас виникнуть такі проблеми, як обрізка, система справді може допомогти. Docker system pruneтакож може бути виправленням, але будь ласка, будьте обережні, це може видалити вашу БД, використовуйте це лише якщо ви не піклуєтесь про вашу БД, або якщо ваш контейнер БД працює, тоді ця команда безпечна, оскільки вона лише обрізає речі, які не використовуються принаймні одним контейнером.
Sweet Chilly Philly

Дякую. Я підтверджую, що зупинити клієнт openvpn буде працювати. Я розпочав це кілька днів тому, тоді я запустив докер-композицію сьогодні і отримав цю помилку.
Дат ТТ

1
Уявіть собі життя, коли наші інструменти дають нам корисну інформацію про налагодження.
Дамієн Рош

157

Я зіткнувся з цією проблемою, тому що у мене був OpenVPN. Щойно я вбив OpenVPN, docker-compose upвистрілив прямо, і помилка зникла.


9
Те саме тут з іншим постачальником VPN (expressvpn).
беркес

1
Та сама проблема із запуском OpenVPN
Nicolai

6
Тож у мене було те саме питання, і мені цікаво, чому це відбувається. Чому мережа Docker плутається при підключенні до VPN.
David Ficociello

2
У мене була така ж проблема з приватним доступом до Інтернету
Nicolas

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.*підмережі, ви все в порядку.


2
Це чудово! Мій серверний ящик не може стояти без OpenVPN, тому поради щодо (навіть тимчасового) відключення VPN - це для мене нісенітниця.
iBug

4
це має бути прийнятою відповіддю, оскільки просто вбити VPN
дурно

Хіба 172.177.57.0/24 не є маршрутованим ногою? Якщо це так, це може спричинити проблеми з контактом з обмеженою кількістю хостів в Інтернеті.
дстромберг

1
так, тут глюк. Краще скористатися 172.16.*.*
мережею

Я не думаю, що використовувати 172.177.57.*це гарна ідея, оскільки це не в адресах en.wikipedia.org/wiki/Private_network#Private_IPv4_adress . Використовуйте адреси в цьому діапазоні.
lucidyan

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 removedDocker version 19.03.9, build 9d988398e7 docker-compose version 1.25.0, build unknown
забігаю,

47

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

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


3
Моє VPN-з'єднання знаходилося в тій самій підмережі, що і намагався використовувати один докер. Відключення вирішило проблему для мене. :)
XtraSimplicity

1
ahhhVPN бігав.
Adiii

25

Як було зазначено в інших відповідях, локальна bridgeмережа Docker за замовчуванням підтримує лише 30 різних мереж (кожну з них можна однозначно ідентифікувати за своїм ім'ям). Якщо ви їх не використовуєте, то docker network pruneзробите свою справу.

Однак, можливо, вам буде цікаво створити більше 30 контейнерів, кожен з яких має власну мережу. Якби ви були зацікавлені в цьому, вам потрібно було б визначити overlayмережу. Це трохи складніше, але надзвичайно добре задокументовано тут .

EDIT (травень 2020 р.): Посилання стало недоступним, переглядаючи документи, точна заміна не є, але я б рекомендував почати звідси .


Ваш зв'язаний номер 404
chovy

@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

Після цього проблема зникла.


Це спрацювало для мене після спробу декількох варіантів - зупинив openvpn, перезапустив ПК, перевстановив докер, мережевий чорнослив тощо ...
Метт,

10
  1. Перевірте, чи працює інший контейнер. Якщо так, зробіть: docker-compose down
  2. Якщо VPN підключено, відключіть його та спробуйте знову підняти контейнер докера:

    docker-compose up -d container_name

У мене немає VPN, але docker-compose downвиправили це для мене
IMB


8

Я зіткнувся з тією самою проблемою, і тому, що ви досягли максимальної кількості мереж:

виконайте: 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файл, я отримав таку ж помилку, що і ОП.

Я прочитав відповідь Ареніма та деякі інші речі в Інтернеті, які запропонували повторно використовувати існуючу мережу.

Ви можете знайти існуючі такі мережі:

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

Я використовував версію 18.09.8, docker-composeверсію 1.24.1та формат композиційного файлу Докера 3.7.


1
це питання чи відповідь?
chovy

Більше: мої пригоди в мережі Докер і те, як я натрапив на щось, що застрягло.
Стефан ван ден Аккер

6

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

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


Конкретна команда для переходу з OpenVPN на протокол WireGuard для NordVPN є nordvpn set technology NordLynx. Це не окремий продукт, і наразі він доступний лише на Linux та iOS.
тефір

6

Убивати vpn не потрібно.

Цей інший коментар щодо використання нової мережі досить близький до рішення для мене , і він працював деякий час, але я знайшов кращий спосіб завдяки деяким розмовам в іншому питанні

Створіть мережу за допомогою:

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

Потім внизу docker-compose.yaml поставте наступне:

networks:
  default:
    external: 
      name: your-network

Зроблено. Не потрібно додавати мережі до всіх визначень контейнерів і т. Д., І ви можете повторно використовувати мережу з іншими файлами, що додають докер, також, якщо хочете.


4

Якщо ви хочете безліч мереж, то ви можете контролювати, скільки докерів ІР-простору передається кожній мережі за допомогою параметра default-address-poolsdeamon, щоб ви могли додати це до свого /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 адреси) для мостової мережі.

Для будь-якої іншої мережі, яку я створюю, докер розділить 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 серед за замовчуванням для призначення в мережу

і нічого не допомогло, поки я не вимкнув VPN Cisco. після цього докер-композиція працювала


-3

Я вирішив цю проблему кроками:

  1. вимкніть вашу мережу (бездротову чи провідну ...).

  2. перезавантажте систему.

  3. перш ніж увімкнути вашу мережу на ПК, виконайте команду docker-compose, вона створить нову мережу.

  4. тоді ви можете ввімкнути мережу і продовжити ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.