Nær gámurinn ekki API-inu sem aðeins er aðgengilegt í gegnum VPN? Proxy á hýsilnum
Göngin lifa á hýsilnum, svo gámurinn hefur enga leið að einkaaðsetrinu. Birtu þrönga öfuga proxy og kallaðu á hana sem host.docker.internal.
Compose-þjónustan þín rennur út á tíma gagnvart API sem vafrinn á sömu vél opnar án kvartana. Sá munur er vísbendingin: beiðnin sem virkar fer frá hýsli með VPN-göngum, og beiðnin sem hangir fer frá gámi með eigin netstöflum. Ekkert inni í gámnum þekkir leiðir ganganna, svo einkaaðstæðan verður óaðgengileg hvernig sem nafnið er skrifað. Lausnin er viljandi stökk í gegnum hýsilinn, ekki sniðugri leiðatafla.
Byrjaðu á því hvers vegna leiðirnar tvær eru ólíkar og ákveddu svo hvar göngin eiga að lifa.
Hvers vegna hýsillinn virkar en gámurinn ekki
Að reisa göngin gefur hýsilnum viðmót, sett af leiðum og yfirleitt resolver-færslu sem VPN-ið útvegar. Gámur er ekki erfingi neins af þessu: hann byrjar með eitt viðmót á brú vélarinnar og sjálfgefna leið sem bendir á þá brú. Leiðir sem settar eru upp á hýsilnum eru ósýnilegar öllu sem keyrir inni í því nafnrými.
Þess vegna virðast einkennin ósamkvæm frekar en bara biluð. Hýsillinn leysir einkanaðið og tengist, því bæði nafnið og leiðin eru þar. Gámurinn sendir pakkann á einkaaðsetur sem ekkert á brúarleiðinni kemst að, og beiðnin rennur út á tíma. Að bæta nafninu í hosts-skrá gámsins breytir engu, því aðsetrið sjálft er óaðgengilegt frá því þar sem gámurinn situr.
Náðu í hýsilinn innan úr gámnum
Ferli í gámnum sem hringir í localhost er að hringja í gámnum. Docker Desktop birtir host.docker.internal sem nafn sem bendir til baka á vélina sem keyrir vélina; Linux-vélar láta það vera óskilgreint nema þjónustan biðji um það, og það er einmitt það sem vörpunin hér fyrir neðan gerir. Með því miðar forritið á nafn og port í stað einkaaðsetsins.
services:
app:
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
INTERNAL_API_HOST: "host.docker.internal:8666"Göngin vera á hýsilshlið stökksins, og portið í þeirri breytu er það sem proxy-in mun hlusta á. Gámur sem missir göngin mistekst nú á einu þekktu stökki í stað þess að reyna leið sem hann hafði aldrei.
Veldu hvar göngin lifa
Þrjú form eru möguleg fyrir Compose-þjónustu sem þarf einkaaðskilið API, og þau greinast eftir því hvaða ferli á göngin. VPN-biðlari getur keyrt inni í gámmyndinni, sem krefst þess að gangatæki sé opnað og netstjórnunarheimildin sem fylgir því veitt. Forritið getur deilt netnafnrými sérstaks gangagáms, svo bæði ferlin sjá eina stöflu og eina leiðatöflu. Eða göngin geta verið áfram á hýsilnum, með þröngum framsendingaraðila frá hýsilnum inn í gámminn.
Fyrstu tvö draga prófíla, endurtengingarhegðun og resolver-stefnu inn í verkefnið, og gera hverja þjónustu í skránni háða heilsu ganganna. Það er of mikil tenging fyrir eitt API-kall. Fyrir þróunarstöflu sem les eitt innra endapunkt heldur framsendingaraðilinn á hýsilshlið vera minnsta breytingin sem samt heldur skírteinunum þar sem vettvangsteymið stýrir þeim.
Birtu eina þrönga leið á hýsilnum
Byrjaðu á því sem framsendingaraðilinn erfir: keyrðu hann undir því reikningsfyrirkomulagi sem á göngin, og útstreymisinnstungur hans taka leiðir hýsilsins og resolver hýsilsins. Einn nginx location-blokk nær yfir eina leið.
server {
listen 8666;
location /search/ {
proxy_pass http://10.20.30.40:8090/;
proxy_set_header Host internal-api.example;
proxy_read_timeout 60s;
}
}Meðhöndlaðu aðsetrið og portið sem staðgengla og settu inn parið sem API-ið hlustar raunverulega á. Hver frekari upstream á skilið sinn eigin location-blokk, og hver blokk ætti aðeins að hleypa leiðunum sem þessi þjónusta kallar á, svo proxy-in verði ekki almenn hurð inn í einkanetið. Bindu hlustandann við brúnaðsetrið fyrir biðlara sem koma í gegnum host-gateway, við loopback aðeins þegar biðlarinn deilir netnafnrými hýsilsins, og aldrei við 0.0.0.0. Veldu líka port sem er enn laust: númer sem þegar er tekið lætur proxy-ina ekki hlusta á meðan gámurinn heldur áfram að renna út á tíma, sem ekki er hægt að greina frá netbiluninni sem þú byrjaðir með.
Port, nöfn og TLS-ákvörðunin
Nafnaleysing skiptist á sama hátt og leiðsögn. Opinberar uppflettingar gámsins fara í gegnum resolver vélarinnar, svo einkanað sem leysist á hýsilnum mun ekki leysast inni í gámnum. Proxy-in er hlutinn sem leysir einkanaðið, því hún erfir resolver hýsilsins.
TLS er ákvörðunin sem er frestað og útskýrir svo næstu bilun. Ef proxy-in sendir bætin ósnortin sér gámurinn eigið skírteini API-sins og þarf innra CA í traustgeymslu sína. Ef proxy-in lýkur TLS færist það traust yfir á hýsilinn og forritið byrjar að byggja tengla úr host-hausnum sem það tekur við. Veldu eitt fyrirkomulag og beittu því á hverja auðlind, því endurbeining frá hinu bendir á hýsilnafn sem gámurinn getur ekki leyst.
Sannreyndu innan úr þjónustunni
Sendu beiðnina úr gámnum, ekki af hýsilnum: venjulegt curl á proxy-leiðina, svo heilsupróf forritsins sjálfs. Þegar proxy-in svarar en forritið mistekst samt, berðu saman þrennt: grunnslóðina sem það byggir, hvaða proxy-breytu sem er í umhverfi þess, og CA-ið sem það treystir. Allt er það í umhverfi og skrám gámsins, og að laga eitt þeirra lætur VPN-ið í friði.
Skrifaðu valda fyrirkomulagið í README verkefnisins á meðan það er ferskt. Annars eyðir næsta manneskja sem lendir í þessari tímamörk sömu síðdegi í að enduruppgötva að göngin lifa á hýsilnum.