Траблшутинг сетей Docker: bridge, host, macvlan, overlay и устранение конфликтов IP
- Контейнеры не могут взаимодействовать по внутренней сети или пинговать внешний шлюз.
- Конфликт IP-адресов подсети Docker (по умолчанию
172.17.0.0/16) с корпоративной сетью или VPN. - Ошибка
driver failed programming external connectivity on endpoint. - Сбои обнаружения сервисов (Service Discovery) в Swarm/Overlay сетях.
1. Диагностика существующих сетей
docker network ls
docker network inspect bridge2. Устранение пересечений подсетей пула по умолчанию
Задайте неконфликтующие пулы в /etc/docker/daemon.json:
{
"bip": "10.200.0.1/24",
"default-address-pools": [
{"base": "10.201.0.0/16", "size": 24}
]
}systemctl restart docker3. Создание изолированной пользовательской Bridge-сети
docker network create --driver bridge --subnet 10.20.30.0/24 --gateway 10.20.30.1 custom_bridge
docker run -d --name web --network custom_bridge nginx4. Настройка Macvlan для прямого подключения к физической сети
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 direct_lan Частые вопросы (FAQ)
Почему контейнеры в стандартной сети bridge не резолвят друг друга по имени?
Встроенный DNS-сервер Docker (127.0.0.11) работает только в пользовательских (user-defined) сетях bridge. В сети bridge по умолчанию резолвинг имен отключен разработчиками Docker.
Почему хост не может связаться с контейнером в сети macvlan?
Это ограничение безопасности ядра Linux: трафик между родительским интерфейсом хоста и macvlan-подинтерфейсами изолирован. Для связи создается отдельный macvlan bridge на хосте.