Вопрос или проблема
Я пытаюсь подключить контейнер Docker к нескольким сетям моста, что работало годами, но больше не работает, предположительно после того, как я применил последние обновления (используя Debian testing).
Выполнение команды docker network connect
возвращает ошибку, так как это, по-видимому, конфликтует с существующим маршрутом в форме {Ifindex: 5 Dst: 0.0.0.0/0 Src: <nil> Gw: 172.17.0.1 Flags: [] Table: 254 Realm: 0}
.
Шаги воспроизведения
Создайте новый контейнер, подключенный к сети по умолчанию:
# docker run --rm -it --network=bridge --name=my-container debian:testing-slim
Создайте вторую сеть моста и попробуйте подключить к ней контейнер:
# docker network create my-net
# docker network connect my-net my-container
Error response from daemon: failed to add interface veth487637c to sandbox: error setting interface "veth487637c" IP to 172.18.0.2/16: cannot program address 172.18.0.2/16 in sandbox interface because it conflicts with existing route {Ifindex: 5 Dst: 0.0.0.0/0 Src: <nil> Gw: 172.17.0.1 Flags: [] Table: 254 Realm: 0}
Указанный адрес шлюза в существующем маршруте находится в подсети 172.17.0.0/16
сети по умолчанию, в то время как новый адрес 172.18.0.2/16
находится в пользовательской сети моста, поэтому я не понимаю, почему возникает конфликт в первую очередь.
# docker network ls
NETWORK ID NAME DRIVER SCOPE
bd87d73eabe7 bridge bridge local
a2d9388b4d06 host host local
3b46a388c9c1 my-net bridge local
142d1733427c none null local
$ ip route
default via 192.168.1.1 dev wlp61s0 proto dhcp src 192.168.1.21 metric 600
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 dev br-3b46a388c9c1 proto kernel scope link src 172.18.0.1 linkdown
192.168.1.0/24 dev wlp61s0 proto kernel scope link src 192.168.1.21 metric 600
Ответ или решение
Подключение Docker-контейнера к нескольким мостовым сетям может столкнуться с рядом проблем, особенно если обновления системы или Docker изменили их поведение. Рассмотрим шаги по решению проблемы подключения Docker-контейнера к пользовательской мостовой сети, используя описание ошибки и конфликта маршрутов, представленных в вашем вопросе.
F: Факты
- Природа проблемы: Возникает ошибка при попытке подключения контейнера к новой мостовой сети, хотя это ранее работало.
- Текст ошибки:
Error response from daemon: failed to add interface veth487637c to sandbox: error setting interface "veth487637c" IP to 172.18.0.2/16: cannot program address 172.18.0.2/16 in sandbox interface because it conflicts with existing route {Ifindex: 5 Dst: 0.0.0.0/0 Src: nil Gw: 172.17.0.1 Flags: [] Table: 254 Realm: 0}
- Вывод команд: Команды
docker network ls
иip route
указывают на существование сетей172.17.0.0/16
и172.18.0.0/16
без заметных конфликтов IP-адресаций.
O: Возможности
- Обновления Docker или ядра: Возможны изменения в правилах маршрутизации внутри Docker или ядра ОС после обновления.
- Конфигурация сети: Сетевые конфигурации ОС могли измениться, вызывая конфликты при попытке программирования IP-адресов.
R: Рекомендации
-
Проверка обновлений:
- Проверьте, не изменились ли настройки маршрутизации в последних версиях Docker или системы.
- Обратитесь к документации или журналам изменений для выявления возможных изменений поведения.
-
Проверка конфликтов IP:
- Убедитесь, что
Docker
не конфликтует с системными IP-адресами. - Используйте команду
docker inspect my-net
для анализа текущих IP-адресов и сравните с системным маршрутизацией черезip route
.
- Убедитесь, что
-
Очистка маршрутизации:
- Попробуйте отключить и снова подключить сети, или пересоздать пользовательскую сеть, чтобы устранить возможные ошибки конфигурации.
- Используйте команду
docker network prune
для очистки неиспользуемых сетей.
E: Экспертиза
-
Измените интерфейсные конфигурации:
- Это может быть случай, когда маршрутизатор контейнера
veth
неправильно связывается. Проведите диагностику сетевого интерфейса с помощьюip link
.
- Это может быть случай, когда маршрутизатор контейнера
-
Следите за логами Docker:
- Проверьте логи Docker daemon с помощью
journalctl -u docker.service
, чтобы получить больше информации о проблеме.
- Проверьте логи Docker daemon с помощью
S: Стратегии
Если ни одна из предоставленных рекомендаций не решает проблему, можно попробовать другие способы, например, откатить последние обновления системы или Docker, чтобы вернуть известную рабочую конфигурацию. Также рекомендуется следить за обсуждениями на форумах Docker и отчетами об ошибках для получения более целенаправленных решений.
Такое комплексное рассмотрение проблемы гарантирует, что вы сможете идентифицировать и устранить источник конфликта при подключении контейнера к пользовательской сетевой мостовой конфигурации в Docker.