Очень много интересных особенностей с сетями docker, которые доставляют множество интересных проблем уважаемым разработчикам, для которых сети... да нет у них даже сетевого интерфейса на их макбуках :)
Но в этой заметке мы посмотрим на одну из тысячи возможных проблем)
Исходные данные - дев-окружение в сервисах docker compose "вдруг" в окружении VPN в платформу заказчика перестает отправлять даже HTTP/HTTPS запросы на удаленные системы, при этом симптомы - неуспешные SSL - соединения (с последующим бесконечным SSL - handshake-ом ), при всей видимости работающей "сетевой доступности" ресурса - icmp, устанавливающиеся сетевые соединения и тп.
Диагностика, на первый взгляд неочевидная, сводится к простому - "данные" запросов просто теряются при отправке и виной тому фрагментация в рамках несоразмерных mtu бриджа docker который по умолчанию (ни смотря ни на что и без попыток проверки конфигурации хоста) устанавливается в "дефолтные" 1500 и интерфейса VPN (в данном случае WireGuard- базирующийся wt адаптер без возможности (пока) конфигурации на стороне оркестрации VPN - решения (Netbird)) c "дефолтным" mtu 1280.
Как определить, что это ваш случай -
$ ip a |grep -e wt -e docker
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
87: wt0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1280 qdisc noqueue state UNKNOWN group default qlen 1000
inet 100.100.100.100/16 brd 100.100.255.255 scope global wt0
Как исправить (варианты) :
1. compose файл (вместо default может быть и именнованный bridge для конкретного окружения сервисов)
networks:
default:
driver: bridge
driver_opts:
com.docker.network.driver.mtu: 1280
2. dockerd systemd-сервис ( /lib/systemd/system/docker.service, глобальная настройка)
ExecStart=/usr/bin/dockerd --mtu 1280 -H fd:// --containerd=/run/containerd/containerd.sock
3. /etc/docker/daemon.json
{
"mtu": 1280
}
...
Незабываем перечитать unit файлы и рестарт dockerd или сервиса :
1.
$ docker compose down && docker-compose up
2.
# systemctl daemon-reload && systemctl restart docker.service
3.
# systemctl restart docker.service