Дељење мреже VPN контејнера: шта се дешава са DNS-ом
Заједнички простор имена даје вашој апликацији интерфејсе тунела, а не обједињени резолвер. Тестирајте изнутра апликације и користите DNS распоред који runtime подржава.
Дељење мрежног простора имена VPN контејнера даје вашој апликацији интерфејсе и руте тунела. Оно јој не даје резолвер тунела, ни обједињену копију било чега другог на хосту. Тај јаз производи веома специфичну грешку: јавна имена се разрешавају, интерна не, а апликација која падне изгледа као да користи погрешан DNS сервер, јер и користи. Поправка је обично мања него што дијагноза сугерише.
Корак 1: Тестирајте из апликације, не са хоста
Покрените претрагу унутар контејнера који има проблем, не на хосту и не у прегледачу. docker exec app-container getent hosts db.internal одговара на једино важно питање: шта резолвер овог процеса враћа.
Ако хост разрешава име а контејнер не, пронашли сте квар. Све после овога је избор подржаног начина да га поправите.
Корак 2: Прочитајте подржани модел runtime-а
Docker документација о мрежама бележи ограничења DNS заставица за контејнере који деле мрежни режим другог контејнера. У Compose-у network_mode: service:vpn везује апликацију за простор имена VPN контејнера, а по услузи dns подешавања се не понашају као код обичне услуге. Решење које добијете је оно које има заједнички простор имена.
Кориснички дефинисане мостовне мреже такође користе Docker-ов уграђени DNS другачије од подразумеваног моста. Зато dns ставка копирана из радног примера моста не може учинити баш ништа у заједничком стеку. Проверите распоред пре копирања ставке.
Адреса повратне петље увек се односи на релевантни мрежни контекст. Унутар заједничког простора имена 127.0.0.1 није резолвер хоста.
Корак 3: Пратите упит до његовог примаоца
Прочитајте конфигурацију резолвера апликације, затим сваки апликацијски специфичан шифровани DNS који апликација доноси, јер апликација која покреће сопствени резолвер игнорише датотеку коју сте уредили. Затим проверите да ли је изабрани резолвер доступан под VPN рутама и политиком заштитног зида. Адреса резолвера са друге стране тунела бескорисна је ако простор имена нема руту до ње. Потврдите примаоца пре него што уредите било коју датотеку.
Страница за проверу IP-а у прегледачу не може вам рећи куда су отишли упити за именима. Она каже куда је отишла једна HTTP веза.
Корак 4: Поправите две класе кварова различито
Ако имена услуга падају док јавна имена раде, проблем је откривање услуга унутар мреже контејнера, а не листа јавних резолвера. Промена сваке јавне DNS адресе неће створити записе које механизам за откривање мреже никада није био замољен да створи.
Ако обе класе падају, почните са доступношћу резолвера. Ако пада само једна, почните са механизмом за откривање. Њих две имају различите власнике, зато једна поправка никада не покрива обе.
Корак 5: Поново тестирајте након поновног стварања
Промените конфигурацију кроз подржани механизам runtime-а, затим поново створите контејнере уместо уређивања датотека унутар покренутог. Тестирајте свеже приватно име, свеже јавно име и апликацијски захтев који следи претрагу. Уређивање датотеке /etc/resolv.conf унутар контејнера нестаје при поновном стварању и увериће вас да је поправка радила кад није.
Забележите власника резолвера и очекивани простор имена уз дефиницију дељене мреже. Следећој особи ће требати обоје.