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
- Проверьте, работает ли какой-либо другой контейнер. Если да, выполните:
docker-compose down
-
Если 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
Я исправил эту проблему по шагам:
-
выключите вашу сеть (беспроводную или проводную...).
-
перезагрузите вашу систему.
-
перед включением сети на ПК выполните команду docker-compose, она собирается создать новую сеть.
-
тогда вы можете включить сеть и продолжить...