Il-kontenitur ma jasalx għall-API li jinsab biss fuq il-VPN? Ipproxiha fuq il-host
It-tunnell jgħix fuq il-host, għalhekk il-kontenitur m’għandux rotta għall-indirizz privat. Ippubblika proxy invers dejjaq u sejjaħlu bħala host.docker.internal.
Is-servizz Compose tiegħek jispiċċa fi żmien skadut ma’ API li l-browser fuq l-istess magna jiftaħ mingħajr l-ebda ilment. Din id-differenza hija l-ħjiel: it-talba li taħdem toħroġ minn host b’tunnell VPN, u t-talba li tiddendel toħroġ minn kontenitur bil-pila tan-netwerk tiegħu stess. Xejn ġewwa l-kontenitur ma jaf ir-rotot tat-tunnell, għalhekk id-destinazzjoni privata tibqa’ mhux aċċessibbli kif jinkiteb l-isem. Is-soluzzjoni hija qabża maħsuba minn ġol-host, mhux tabella tar-rotot aktar għaqlija.
Ibda b’għaliex iż-żewġ toroq huma differenti, imbagħad iddeċiedi fejn għandu jgħix it-tunnell.
Għaliex il-host jaħdem u l-kontenitur le
It-tqajjim tat-tunnell jagħti lill-host interface, sett ta’ rotot u, normalment, entrata tar-resolver li tipprovdi l-VPN. Il-kontenitur ma jiret xejn minn dan: jibda b’interface waħda fuq il-pont tal-magna u rotta default li tipponta lejn dan il-pont. Ir-rotot installati fuq il-host ma jidhrux għal kull ma jaħdem ġewwa dan l-ispazju tal-ismijiet.
Għalhekk is-sintomi jidhru inkonsistenti u mhux sempliċement imħassra. Il-host jsolvi l-isem privat u jgħaqqad, għax hemmhekk teżisti kemm l-isem kif ukoll ir-rotta. Il-kontenitur jibgħat il-pakkett tiegħu lejn indirizz privat li xejn fil-mogħdija tal-pont ma jista’ jasal għalih, u t-talba tispiċċa fi żmien skadut. Iż-żieda tal-isem fil-fajl hosts tal-kontenitur ma tbiddel xejn, għax l-indirizz innifsu mhux aċċessibbli minn fejn jinsab il-kontenitur.
Ilħaq il-host minn ġewwa l-kontenitur
Proċess fil-kontenitur li jċempel localhost qed iċempel il-kontenitur. Docker Desktop jippubblika host.docker.internal bħala isem li jipponta lura lejn il-magna li taħdem il-magna; il-magni Linux iħalluh mhux definit sakemm is-servizz jitolbu, u dan huwa eżattament dak li tagħmel il-mapping hawn taħt. B’hekk l-applikazzjoni timmira lejn isem u port minflok l-indirizz privat.
services:
app:
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
INTERNAL_API_HOST: "host.docker.internal:8666"It-tunnell jibqa’ fuq in-naħa tal-host tal-qabża, u l-port f’dik il-varjabbli huwa dak li l-proxy se jisma’ fuqu. Kontenitur li jitlef it-tunnell issa jonqos f’qabża waħda magħrufa minflok ma jipprova rotta li qatt ma kellu.
Agħżel fejn jgħix it-tunnell
Tliet forom huma possibbli għal servizz Compose li jeħtieġ API privat, u dawn jiddifferixxu f’liema proċess jippossjedi t-tunnell. Klijent VPN jista’ jaħdem ġewwa l-immaġni tal-kontenitur, li teħtieġ li jintwera apparat tat-tunnell u li tingħata l-kapaċità tal-amministrazzjoni tan-netwerk li tmur miegħu. L-applikazzjoni tista’ taqsam l-ispazju tal-ismijiet tan-netwerk ta’ kontenitur tat-tunnell separat, hekk li ż-żewġ proċessi jaraw pila waħda u tabella tar-rotot waħda. Jew it-tunnell jista’ jibqa’ fuq il-host, b’dejjaq li jgħaddi mill-host fil-kontenitur.
L-ewwel tnejn iġibu fajls tal-profil, imġiba ta’ qbil mill-ġdid u politika tar-resolver fil-proġett, u jagħmlu kull servizz fil-fajl dipendenti fuq is-saħħa tat-tunnell. Dan huwa wisq tgħaqqid għal sejħa waħda tal-API. Għal pila tal-iżvilupp li taqra punt ta’ tmiem intern wieħed, id-dejjaq fuq in-naħa tal-host huwa l-iżgħar bidla li xorta żżomm il-kredenzjali fejn timmaniġġahom it-tim tal-pjattaforma.
Ippubblika triq dejqa waħda fuq il-host
Ibda minn dak li jiret id-dejjaq: ħaddmu taħt il-kont li jippossjedi t-tunnell u s-sokits tiegħu li joħorġu se jieħdu r-rotot tal-host u r-resolver tal-host. Blokk location wieħed ta’ nginx ikopri triq waħda.
server {
listen 8666;
location /search/ {
proxy_pass http://10.20.30.40:8090/;
proxy_set_header Host internal-api.example;
proxy_read_timeout 60s;
}
}Ittratta l-indirizz u l-port bħala sostituti u daħħal il-par li l-API tassew jisma’ fuqu. Kull upstream addizzjonali jistħoqqlu l-blokk location tiegħu, u kull blokk għandu jammetti biss it-toroq li jsejjaħ dan is-servizz, sabiex il-proxy ma jsirx bieb ġenerali fin-netwerk privat. Orbot lis-semmiegħ mal-indirizz tal-pont għall-klijenti li jaslu permezz ta’ host-gateway, mal-loopback biss meta l-klijent jaqsam l-ispazju tal-ismijiet tan-netwerk tal-host, u qatt ma’ 0.0.0.0. Agħżel ukoll port li għadu ħieles: numru diġà meħud iħalli lill-proxy ma jismax waqt li l-kontenitur ikompli jispiċċa fi żmien skadut, li ma jistax jiġi distinzjonat mill-ħsara tan-netwerk li bdejt biha.
Portijiet, ismijiet u d-deċiżjoni dwar it-TLS
Is-soluzzjoni tal-ismijiet tinqasam bl-istess mod bħar-rotot. It-tiftixiet pubbliċi tal-kontenitur jgħaddu mir-resolver tal-magna, għalhekk isem privat li jiġi solvut fuq il-host mhux se jiġi solvut ġewwa l-kontenitur. Il-proxy huwa l-komponent li jsolvi l-isem privat, għax jiret ir-resolver tal-host.
It-TLS hija d-deċiżjoni li tiġi posposta u mbagħad tispjega l-falliment li jmiss. Jekk il-proxy jgħaddi l-bytes bla mittiefes, il-kontenitur jara ċ-ċertifikat tal-API stess u jeħtieġ is-CA interna fil-maħżen tal-fiduċja tiegħu. Jekk il-proxy jtemm it-TLS, dik il-fiduċja tmur fuq il-host u l-applikazzjoni tibda tibni links mill-header host li tireċievi. Agħżel arranġament wieħed u applikah għal kull riżors, għax ridirezzjoni maħruġa mill-ieħor tipponta lejn isem tal-host li l-kontenitur ma jistax isolvi.
Ivverifika minn ġewwa s-servizz
Ibgħat it-talba mill-kontenitur, mhux mill-host: curl sempliċi fuq it-triq tal-proxy, imbagħad il-verifika tas-saħħa tal-applikazzjoni stess. Meta l-proxy jwieġeb imma l-applikazzjoni għadha tonqos, qabbel tliet affarijiet: l-URL bażi li tibni, kull varjabbli tal-proxy fl-ambjent tagħha, u s-CA li tafda. Kollha jinsabu fl-ambjent u fil-logs tal-kontenitur, u t-tiswija ta’ waħda minnhom tħalli l-VPN kwiet.
Ikteb l-arranġament magħżul fil-README tal-proġett sakemm għadu frisk. Inkella l-persuna li jmiss li taqbadha ma’ dan iż-żmien skadut se tqatta’ l-istess wara nofsinhar terġa’ tiskopri li t-tunnell jgħix fuq il-host.