Эмне үчүн Docker контейнерлери VPN дин DNS чечүүчүсүн эске албайт
Контейнер ишке киргенде хосттун чечүүчүсүн көчүрөт, ошондуктан DNS'ти кийинчерээк кайра жазган VPN анын ичинде көрүнбөй калат. Чечүүчүнү ачык бергиле.
VPN күйүп турат, браузер ички сайттарга жетет, бирок контейнер ошол эле аттарды чече албайт. Пакетти орнотуу EAI_AGAIN сыяктуу ат чечүү катасы менен өлөт, же колдонмо хост машинасы эч кандай даттануусуз чечкен маалымат базасынын хостун таба албайт. Контейнер VPN орноткон чечүүчүнү колдонбойт. Docker контейнер түзүлгөндө хосттун чечүүчү конфигурациясын көчүргөн, ал эми андан кийин эч нерсе аны кайра көчүргөн эмес.
Бир машинадагы чечүүчүнүн эки көрүнүшү
Linux'то Docker түзүү учурунда ар бир контейнерге хосттун чечүүчү конфигурациясынын көчүрмөсүн берет, loopback даректерин чыпкалайт жана 127.0.0.11 дарегинде сурамдарды сыртка өткөрүүчү камтылган DNS серверин иштетет. Контейнер ишке киргенден кийин /etc/resolv.conf файлын кайра жазган VPN кардары анын ичинде эч нерсени өзгөртпөйт. Контейнерди кайра иштетүү ошол учурда хосттун чечүүчүсү кокустан туура болгондо гана жардам берет.
macOS же Windows'тогу Docker Desktop бир катмар кошот, анткени демон виртуалдык машинада жашайт. Хосттун VPN чечүүчүсү ал VM үчүн эч качан көрүнбөшү мүмкүн, ошондуктан кайра иштетүү эч нерсени өзгөртпөйт. Оңдоону тандаардан мурун эки көрүнүштү салыштырыңыз: хосттун чечүүчүлөр тизмесинин жанында docker exec mycontainer cat /etc/resolv.conf.
Хост ички чечүүчүнү тизмелеп жатканда контейнер жалпы чечүүчүнү тизмелесе, ал жалпы аттарды чечип, ичкилерде ийгиликсиз болот. Ушул бөлүнүү бул көйгөйдүн кол тамгасы.
A варианты: туннелдин чечүүчүсүн ар бир контейнерге берүү
Docker ар бир контейнер үчүн DNS жөндөөлөрүн кабыл алат, жана бул иштеген эң кичине өзгөртүү. Адегенде VPN'дин чечүүчү даректерин окуңуз: macOS'то scutil --dns, Linux'то resolvectl status же кардардын өзүнүн статус чыгарылышы. Анан контейнерди ошолор менен иштетиңиз, мисалы docker run --dns 192.168.2.1 --dns 192.168.123.1 myimage. Compose'то ошол эле жөндөө кызматтын астындагы тизме, ал жерде ал кимдир бирөөнүн shell тарыхында эмес, версия көзөмөлүндө турат.
/etc/docker/daemon.json ичиндеги dns массиви ар бир жаңы контейнерге колдонулат, бул тазараак угулат жана андай эмес. Туннель өчүк турганда да колдонулат, жана анда VPN аркылуу гана жеткиликтүү чечүүчү кадимки образ тартууну бузат. Контейнер боюнча жөндөөлөрдү негиздөө да, кайтаруу да оңой.
B варианты: контейнер хосттун тармагын бөлүшсүн
Хосттун тармагы көчүрмөнү толугу менен айланып өтөт, анткени контейнер хосттун чечүүчүсүн жана хосттун туннелин колдонот. Ал ошондой эле сиз күткөн тармактык обочолонууну алып салат, жана Docker Desktop астында бирдей жүрүм-турум көрсөтпөйт. Linux'то бул ички аттарды чечүүгө тийиш болгон бир жолку курал үчүн прагматикалык тандоо.
Build'дер үчүн эки варианттын эч бири колдонулбайт, анткени build кадамдары иштөө убактысынын желекчелерин мураска албайт. Платформа уруксат берген жерде хосттун тармагы менен build жасаңыз, же көз карандылыктарды орнотууну туннел талап кылбаган баскычта кармаңыз.
Эки варианттын эч бири оңдобогон нерселер
Эгер контейнердин ага маршруту жок болсо, DNS дареги пайдасыз. VPN чечүүчүсү адатта туннелдин дарек мейкиндигинде отурат, ошондуктан контейнерге ошол префикске жол керек. Docker'дин демейки көпүрөсү адатта хост аркылуу сыртка маршруттайт, жана хостто туннелдин маршруту болуп, кайра багыттоо күйгүзүлгөндө бул жетиштүү. Өз дарек пулдары бар ыңгайлаштырылган көпүрө тармактары VPN ички тармагы менен кагылышы мүмкүн, жана анда сурамдар таптакыр башка жакка кетет.
Чечүүчүнү өзүн оңдоого киришерден мурун Docker тармагынын ички тармагын VPN ички тармагы менен салыштырыңыз. Катмарлануу так бузулган DNS сервериндей көрүнгөн бузулуу жаратат.
Контейнердин ичинде текшериңиз
Браузер же тил аткаруу чөйрөсүнүн ордуна контейнердин ичинде getent hosts db.internal менен сынаңыз, анткени алар өздөрүнүн DNS саясатын жана өз кэшин колдонушат. Эгер getent атты чечип, колдонмо дагы эле ийгиликсиз болсо, чечүүчү эми туура жана калган көйгөй колдонмо деңгээлинде. Эгер ал чечпесе, DNS кадамы бүтө элек.
DNS жөндөөлөрүн өзгөрткөндөн кийин контейнерди кайра түзүңүз. Иштеп жаткан контейнердин ичинде /etc/resolv.conf оңдоо аны менен кошо жоголот жана конфигурация көйгөйүн кимдир бирөө аны кайра иштеткенге чейин жашырат.