De Container erreecht d’API net, déi nëmmen iwwer VPN accessibel ass? Proxy se um Host
Den Tunnel lieft um Host, dofir huet de Container keng Route op déi privat Adress. Verëffentlech ee schmuelen ëmgedréinte Proxy a ruff en als host.docker.internal un.
Ären Compose-Service leeft an eng Zäitlimite géint eng API, déi de Browser op der selwechter Maschinn ouni Beschwéierde opmécht. Deeën Ënnerscheed ass den Hiwäis: d’Ufro, déi funktionéiert, verlooss en Host mat engem VPN-Tunnel, an d’Ufro, déi hänkt, verlooss e Container mat sengem eegene Netzwierkstapel. Nichts am Container kennt d’Routen vum Tunnel, dofir bleift d’privat Destinatioun onerreechbar, wéi den Numm och ëmmer geschriwwe gëtt. D’Léisung ass e bewosste Sprong iwwer den Host, net eng méi gescheit Routingtabell.
Fänk domat un, firwat déi zwou Weeër ënnerschiddlech sinn, an entscheet dann, wou den Tunnel soll liewen.
Firwat den Host funktionéiert an de Container net
Den Tunnel opzebauen gëtt dem Host eng Interface, eng Rei Routen an normalerweis en Resolver-Andrag, deen de VPN liwwert. E Container ierft dovunner näischt: hie fänkt mat enger Interface op der Bréck vum Motor an enger Standardroute un, déi op déi Bréck weist. Routen, déi um Host installéiert sinn, si fir alles onsichtbar, wat bannent dësem Nummraum leeft.
Dofir wirken d’Symptomer inkonsistent an net einfach futti. Den Host léist den Numm privat a verbënnt, well Numm a Route allebéid do existéieren. De Container schéckt säi Paket op eng privat Adress, déi näischt um Bréckwee erreeche kann, an d’Ufro leeft an d’Zäitlimite. Den Numm an d’hosts-Datei vum Container ze setzen ännert näischt, well d’Adress selwer vun do, wou de Container sëtzt, onerreechbar ass.
Erreech den Host vun bannen am Container
En Prozess am Container, deen localhost uwielt, wielt de Container un. Docker Desktop verëffentlecht host.docker.internal als Numm, deen zréck op d’Maschinn weist, déi de Motor lafe léisst; Linux-Motore loossen en ondefinéiert, bis de Service en ufrot, an dat ass wat d’Mapping hei drënner mécht. Domat zilt d’Applikatioun en Numm an e Port amplaz vun der privater Adress.
services:
app:
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
INTERNAL_API_HOST: "host.docker.internal:8666"Den Tunnel bleift op der Hostsäit vum Sprong, an de Port an där Variabel ass deen, op deem de Proxy lauschtere wäert. E Container, deen den Tunnel verléiert, feelt elo op engem eenzegen bekannte Sprong, amplaz eng Route ze versichen, déi en ni hat.
Wielt, wou den Tunnel lieft
Dräi Forme si méiglech fir e Compose-Service, deen eng privat API brauch, an se ënnerscheede sech doran, wéi ee Prozess den Tunnel besëtzt. E VPN-Client kann am Container-Image lafen, wat verlaangt, en Tunnelgerät ze weisen an déi Netzwierkadministratiounsfähegkeet, déi dobäi kënnt, ze ginn. D’Applikatioun ka sech den Netzwierk-Nummraum vun engem separate Tunnel-Container deelen, sou datt béid Prozesser ee Stack an eng Routingtabell gesinn. Oder den Tunnel kann um Host bleiwen, mat engem schmuelen Weiderleeder vum Host an de Container.
Déi zwou éischt zéien Profilsdateien, Reconnect-Verhalen a Resolver-Politik an de Projet an a maachen all Service an der Datei vun der Gesondheet vum Tunnel ofhängeg. Dat ass vill Kopplung fir een eenzegen API-Call. Fir ee Entwicklungsstack, deen een eenzegen internen Endpunkt liest, ass de Weiderleeder op der Hostsäit déi klengst Ännerung, déi d’Zougangsdaten awer do léisst, wou d’Plattformsteam se verwalt.
Verëffentlech een eenzegen schmuelen Wee um Host
Fänk domat un, wat de Weiderleeder ierft: laaf en ënner dem Kont, deen den Tunnel besëtzt, an seng erausgehend Sockets huelen d’Routen vum Host an de Resolver vum Host. Een nginx location-Block deckt een Wee.
server {
listen 8666;
location /search/ {
proxy_pass http://10.20.30.40:8090/;
proxy_set_header Host internal-api.example;
proxy_read_timeout 60s;
}
}Behandel d’Adress an de Port als Ersatz an setz d’Paar an, op deem d’API wierklech lauschtert. All weideren upstream verdéngt säin eegene location-Block, an all Block soll nëmmen déi Weeër zouloossen, déi dëse Service oprufft, sou datt de Proxy keng allgemeng Dier an d’privat Netzwierk gëtt. Bind den Nolauschterer un d’Bréckadress fir Cliente, déi iwwer host-gateway kommen, u loopback nëmmen, wann de Client den Netzwierk-Nummraum vum Host deelt, an ni u 0.0.0.0. Wielt och e Port, deen nach fräi ass: eng Nummer, déi schonn geholl ass, léisst de Proxy net lauschteren, während de Container weider an d’Zäitlimite leeft, wat net vun der Netzwierkstéierung ze ënnerscheeden ass, mat där Dir ugefaangen hutt.
Porten, Nimm an d’TLS-Entscheedung
D’Nimm-Opléisung deelt sech esou wéi d’Routing. D’ëffentlech Sich vum Container geet iwwer de Resolver vum Motor, dofir wäert en Numm privat, deen um Host opgeléist gëtt, am Container net opgeléist ginn. De Proxy ass de Bestanddeel, deen den Numm privat opléist, well en de Resolver vum Host ierft.
TLS ass d’Entscheedung, déi verréckelt gëtt an duerno de nächste Feeler erkläert. Wann de Proxy d’Byten onberéiert weiderschéckt, gesäit de Container dem API säin eegene Certificat a brauch déi intern CA a sengem Vertrauensspäicher. Wann de Proxy TLS ofschléisst, geet dat Vertrauen op den Host iwwer an d’Applikatioun fänkt un, Linken aus dem host-Header ze bauen, deen se kritt. Wielt eng Usuerdnung a wend se op all Ressource un, well eng Ëmleedung vun der anerer weist op en Hostnumm, deen de Container net kann opléisen.
Verifizéier vun bannen am Service
Schéck d’Ufro aus dem Container, net vum Host: en einfachen curl op de Proxy-Wee, dann d’Gesondheetspréifung vun der Applikatioun selwer. Wann de Proxy äntwert, d’Applikatioun awer weider feelt, vergläich dräi Saachen: d’Basis-URL, déi se baut, all Proxy-Variabel an hirem Ëmfeld an d’CA, déi se vertraut. All si se am Ëmfeld an an de Logge vum Container, an et eng vun hinnen ze reparéieren, léisst de VPN a Rou.
Schreif déi gewielt Usuerdnung an d’README vum Projet, soulaang se frësch ass. Soss wäert déi nächst Persoun, déi op dës Zäitlimite stéisst, deen selwechten Nomëtteg domat verbréngen, erëm z’entdecken, datt den Tunnel um Host lieft.