Pse kontejnerët e Docker injorojnë zgjidhësin DNS të VPN-së
Një kontejner kopjon zgjidhësin e hostit kur niset, kështu që një VPN që rishkruan DNS më vonë mbetet i padukshëm brenda tij. Kalo zgjidhësin në mënyrë eksplicite.
VPN-ja është aktive, shfletuesi arrin sajtet e brendshme, dhe kontejneri ende nuk i zgjidh dot të njëjtat emra. Instalimi i një pakete vdes me një gabim zgjidhjeje emrash si EAI_AGAIN, ose një aplikacion nuk gjen një host baze të dhënash që makina host e zgjidh pa asnjë ankesë. Kontejneri nuk përdor zgjidhësin që instaloi VPN-ja. Docker kopjoi konfigurimin e zgjidhësit të hostit kur u krijua kontejneri, dhe asgjë nuk e kopjoi përsëri pas kësaj.
Dy pamje të zgjidhësit në të njëjtën makinë
Në Linux, Docker i jep çdo kontejneri një kopje të konfigurimit të zgjidhësit të hostit në momentin e krijimit, filtron adresat loopback dhe ekzekuton një server DNS të integruar në 127.0.0.11 që i përcjell kërkesat nga jashtë. Një klient VPN që rishkruan /etc/resolv.conf pasi kontejneri është nisur nuk ndryshon asgjë brenda tij. Rinisja e kontejnerit ndihmon vetëm nëse zgjidhësi i hostit është rastësisht i saktë në atë moment.
Docker Desktop në macOS ose Windows shton një shtresë, sepse daemoni jeton në një makinë virtuale. Zgjidhësi VPN i hostit mund të mos jetë kurrë i dukshëm për atë VM, kështu që rinisja nuk ndryshon absolutisht asgjë. Krahasoni dy pamjet përpara se të zgjidhni një zgjidhje: docker exec mycontainer cat /etc/resolv.conf pranë listës së zgjidhësve të hostit.
Një kontejner që liston një zgjidhës publik, ndërsa hosti liston një të brendshëm, do të zgjidhë emrat publikë dhe do të dështojë në ata të brendshëm. Kjo ndarje është nënshkrimi i këtij problemi.
Opsioni A: kalo zgjidhësin e tunelit për çdo kontejner
Docker pranon cilësime DNS për çdo kontejner, dhe ky është ndryshimi më i vogël që funksionon. Së pari lexoni adresat e zgjidhësit të VPN-së: scutil --dns në macOS, resolvectl status ose dalja e statusit të vetë klientit në Linux. Më pas nisni kontejnerin me ato, për shembull docker run --dns 192.168.2.1 --dns 192.168.123.1 myimage. Në Compose i njëjti cilësim është një listë nën shërbimin, ku jeton në kontrollin e versioneve në vend të historisë së shellit të dikujt.
Një varg dns në /etc/docker/daemon.json zbatohet për çdo kontejner të ri, gjë që tingëllon më e rregullt dhe nuk është. Zbatohet edhe kur tuneli është jashtë funksionit, dhe atëherë një zgjidhës i arritshëm vetëm përmes VPN-së prish shkarkimet e zakonshme të imazheve. Cilësimet për çdo kontejner janë më të lehta për t'u justifikuar dhe më të lehta për t'u anuluar.
Opsioni B: lejo kontejnerin të ndajë rrjetin e hostit
Rrjeti i hostit e anashkalon kopjen plotësisht, sepse kontejneri përdor zgjidhësin e hostit dhe tunelin e hostit. Ai gjithashtu heq izolimin e rrjetit që ndoshta e dëshironit, dhe nuk sillet njësoj nën Docker Desktop. Në Linux është zgjedhja pragmatike për një mjet një-herësh që duhet të zgjidhë emra të brendshëm.
Për ndërtimet nuk zbatohet asnjëri opsion, sepse hapat e ndërtimit nuk trashëgojnë flamuj të kohës së ekzekutimit. Ndërto me rrjetin e hostit aty ku platforma e lejon, ose mbaj instalimin e varësive në një fazë që nuk ka nevojë për tunelin.
Çfarë nuk rregullon asnjëri opsion
Një adresë DNS është e pavlefshme nëse kontejneri nuk ka rrugë drejt saj. Zgjidhësi i VPN-së zakonisht ndodhet brenda hapësirës së adresave të tunelit, kështu që kontejneri ka nevojë për një shteg drejt atij prefiksi. Ura e paracaktuar e Docker zakonisht drejton nga jashtë përmes hostit, dhe kjo mjafton kur hosti ka rrugën e tunelit dhe përcjellja është e aktivizuar. Rrjetet e urave të personalizuara me pishinat e tyre të adresave mund të përplasen me nërrjetin e VPN-së, dhe atëherë kërkesat shkojnë diku krejt tjetër.
Kontrollo nërrjetin e rrjetit Docker kundrejt nërrjetit të VPN-së përpara se të korrigjosh vetë zgjidhësin. Mbivendosja prodhon një dështim që duket saktësisht si një server DNS i prishur.
Verifiko brenda kontejnerit
Testo me getent hosts db.internal brenda kontejnerit në vend të një shfletuesi ose një mjedisi ekzekutimi gjuhësor, sepse ato zbatojnë politikën e tyre DNS dhe memorjen e tyre të përkohshme. Nëse getent e zgjidh emrin dhe aplikacioni ende dështon, zgjidhësi tani është i saktë dhe problemi i mbetur është në nivel aplikacioni. Nëse nuk e zgjidh, hapi DNS nuk ka përfunduar.
Rikrijo kontejnerin pasi të kesh ndryshuar cilësimet e tij DNS. Redaktimi i /etc/resolv.conf brenda një kontejneri që punon zhduket bashkë me të dhe fsheh problemin e konfigurimit saktësisht aq kohë sa i duhet dikujt për ta rinisur.