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.

Хост дотоод шийдэгчийг жагсааж байхад контейнер нийтэд нээлттэй шийдэгчийг жагсаавал нийтэд нээлттэй нэрсийг шийдэж, дотоод нэрс дээр бүтэлгүйтнэ. Энэ хуваагдал нь энэ асуудлын гарын үсэг юм.

А хувилбар: туннелийн шийдэгчийг контейнер бүрт дамжуулах

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-ээр хүрэх боломжтой шийдэгч энгийн образ татахыг эвддэг. Контейнер бүрийн тохиргоог тайлбарлахад ч, буцаахад ч хялбар.

Б хувилбар: контейнер хостын сүлжээг хуваалцах

Хостын сүлжээ хуулбарыг бүрэн тойрч гардаг, учир нь контейнер хостын шийдэгч болон хостын туннелийг ашигладаг. Энэ нь таны хүссэн сүлжээний тусгаарлалтыг ч арилгаж, Docker Desktop дор ижилхэн ажиллахгүй. Linux дээр дотоод нэрсийг шийдэх ёстой нэг удаагийн хэрэгсэлд энэ нь прагматик сонголт юм.

Бүтээцэд хоёр хувилбарын аль нь ч хамаарахгүй, учир нь бүтээцийн алхмууд ажиллах үеийн флагуудыг өвлөдөггүй. Платформ зөвшөөрсөн газарт хостын сүлжээгээр бүтээх, эсвэл хамаарлын суулгалтыг туннель шаарддаггүй үе шатанд байлгана уу.

Аль ч хувилбар засдаггүй зүйл

Хэрэв контейнерт түүн рүү маршрут байхгүй бол DNS хаяг хэрэггүй. VPN шийдэгч ихэвчлэн туннелийн хаягийн орон зайд суудаг тул контейнерт тэр префикс рүү зам хэрэгтэй. Docker-ийн өгөгдмөл гүүр ихэвчлэн хостоор дамжуулан гадагш чиглүүлдэг бөгөөд хост туннелийн маршруттай, дамжуулалт асаалттай үед энэ хангалттай. Өөрийн хаягийн сантай өөрчлөн тохируулсан гүүрэн сүлжээнүүд VPN-ийн дэд сүлжээтэй мөргөлдөж болох бөгөөд тэгвэл асуулгууд огт өөр тийш явна.

Шийдэгчийг өөрөө дибаг хийхээс өмнө Docker сүлжээний дэд сүлжээг VPN-ийн дэд сүлжээтэй харьцуулна уу. Давхцал нь эвдэрсэн DNS сервертэй яг адил харагдах эвдрэл үүсгэдэг.

Контейнер дотор шалгана уу

Хөтөч эсвэл хэлний ажиллах орчны оронд контейнер дотор getent hosts db.internal ашиглан туршина уу, учир нь тэд өөрийн DNS бодлого, өөрийн кэшийг хэрэглэдэг. Хэрэв getent нэрийг шийдэж, програм буруу байвал шийдэгч одоо зөв бөгөөд үлдсэн асуудал програмын түвшинд байна. Хэрэв шийдэхгүй бол DNS алхам дуусаагүй.

DNS тохиргоог өөрчилсний дараа контейнерийг дахин үүсгэнэ үү. Ажиллаж байгаа контейнер дотор /etc/resolv.conf засах нь түүнтэй хамт алга болж, тохиргооны асуудлыг хэн нэгэн түүнийг дахин эхлүүлэх хүртэл яг тэр хугацаанд нуудаг.

Холбоотой нийтлэлүүд