Docker: usmerite jedan kontejner kroz VPN, a drugi ostavite izravnim
Dajte tunelu vlastiti kontejner, dopustite samo uslugama kojima je potreban da dijele taj imenski prostor, pa uzmite u obzir što slijedi vlasnika: portove, localhost, DNS.
Jedan host, dva radna opterećenja i zahtjev koji ih razdvaja: klijent za preuzimanje koji mora izlaziti kroz komercijalni VPN i upravljačko sučelje koje mora nastaviti koristiti vezu hosta. Instaliranje VPN klijenta na host odmah ruši zahtjev, jer tada oba opterećenja dijele jedan izlaz. Uzorak koji doista radi jest premjestiti tunel u vlastiti kontejner i dopustiti samo onim opterećenjima kojima je potreban da se pridruže mrežnom imenskom prostoru tog kontejnera. Sve ostalo zadržava uobičajeni Docker put, a pojedinosti koje slijede posljedica su toga kome pripada imenski prostor.
Zašto zajednički imenski prostor mijenja pravila
Kontejner koji se pridruži imenskom prostoru drugoga ne dobiva vlastiti mrežni stog. Vidi ista sučelja, istu tablicu usmjeravanja i isti loopback kao kontejner kojem se pridružio, i upravo zato je uzorak koristan: opterećenje normalno razrješava i povezuje se, a tunel ispod hvata promet bez znanja aplikacije. Cijena je da svaka mrežna postavka sada ima jednog vlasnika, a kontejner koji se pridružio nije taj vlasnik.
To pravilo vlasništva odgovara na većinu pitanja o konfiguraciji prije nego što se postave. Ako postavka živi u mrežnom stogu, pripada pomoćnom kontejneru. Ako opisuje proces, ostaje uz opterećenje.
Loopback je dio koji iznenadi ljude. Unutar kontejnera koji se pridružio, localhost razrješava se na loopback pomoćnog kontejnera, a ne na vlastiti privatni, pa usluga koja se veže na 127.0.0.1 očekujući izolaciju sada dijeli tu adresu s kontejnerom tunela.
Objavite portove na kontejneru koji posjeduje imenski prostor
Preslikavanje portova pripada vlasniku imenskog prostora čak i kada proces koji sluša radi u drugom kontejneru. Deklarirajte preslikavanje na pomoćnom kontejneru, a opterećenje neka zadrži vlastitu konfiguraciju procesa netaknutom. Preslikavanje na usluzi koja se pridružila ne može stupiti na snagu, bilo da ga motor odbije ili tiho zanemari ovisno o tome kako je kontejner pokrenut, i zato sučelje koje je prije trenutak bilo dostupno nestaje čim se uzorak primijeni.
services:
gluetun:
image: qmcgaw/gluetun
cap_add: [NET_ADMIN]
ports: ["8080:8080"]
client-vpn:
image: example/client
network_mode: "service:gluetun"
client-direct:
image: example/client
ports: ["8081:8080"]Čitajte taj blok kao tri odluke, a ne tri usluge. Pomoćni kontejner posjeduje tunel i objavljeni port; klijent koji se pridružio ne deklarira nikakvu mrežu; izravni klijent zadržava vlastito preslikavanje na zadanoj mreži. Sposobnost NET_ADMIN jest ono što pomoćnom kontejneru omogućuje stvaranje sučelja i mijenjanje ruta, i to je razlog zašto ovaj kontejner treba više privilegija od opterećenja kojima služi.
Usluga koja ostaje izravna zadržava vlastitu mrežu
Opterećenje koje ne smije ići kroz tunel zadržava zadani most ili vlastitu mrežu koju je definirao korisnik, s vlastitim objavljenim portom i vlastitim izlazom. Primamljivo je priključiti ga na mrežu pomoćnog kontejnera kako bi dva kontejnera mogla razgovarati po imenu, ali taj jedan korak tiho premješta njegov promet u tunel. Ako se trebaju dosegnuti, izgradite zasebnu mrežu koju je definirao korisnik, priključite oba na nju i ostavite pomoćni kontejner jedinim izlaznim putem.
Držite dva pitanja odvojeno: koji kontejneri mogu dosegnuti jedni druge i koji odakle izlazi. Njihovo spajanje najčešći je način na koji se ovaj dizajn vraća u VPN na razini cijelog hosta.
Matrica kvarova za prvi sat
Većina prvih pokušaja ne uspije na jedan od četiri načina i svaki ima drukčiji uzrok. Provjeravajte ih tim redom, jer prva dva objašnjavaju gotovo svako izvješće.
| Symptom | Likely cause |
|---|---|
| Web UI unreachable after the change | Port mapping declared on the joining container instead of the sidecar |
| Both containers show the provider's exit address | The direct service was attached to the sidecar network |
| Internal names stop resolving | Resolver settings live on the host, not in the shared namespace |
| Health check fails but the app works | The check probes localhost, which now means the sidecar |
Četvrti redak je onaj koji ljudi pogrešno dijagnosticiraju kao grešku aplikacije. Sonda napisana prema vlastitom loopbacku opterećenja sada testira kontejner tunela, pa ili ne uspije ili prijavi posve pogrešnu uslugu.
Kada jednom imenu hosta treba tunel
Ponekad je puni tunel previše: jedno interno ime mora ići kroz korporativni VPN dok lokalni socket ili veza za zaslon nastavlja raditi. Puni tunel unutar kontejnera lomi taj put i sve što je adresirano na host, pa usmjerite samo prefiks kojemu je to potrebno. Omotač za podijeljeno usmjeravanje oko klijenta to čini, šaljući imenovani host kroz tunel i ostavljajući prethodnu rutu netaknutom za sve ostalo.
Odaberite to kada trebate dosegnuti samo jednu uslugu i ne pokušavate premjestiti sav promet kontejnera. To je drukčiji alat od pomoćnog kontejnera i odgovara na drukčije pitanje.
Provjerite, pa neka preživi ponovno pokretanje
Pitajte svaki kontejner s koje adrese izgleda da dolazi. Onaj u tunelu trebao bi ispisati adresu pružatelja, a izravni izlaz hosta. Identični odgovori znače da je izravna usluga naslijedila pogrešan imenski prostor ili da VPN na razini hosta još hvata sve, a ta dva popravka su različita. Pokrenite provjeru ponovno nakon svake izmjene composea, jer je jedan kopirani blok usluge dovoljan da vrati problem.
Tri stvari obično puknu kasnije. DNS slijedi vlasnika imenskog prostora, pa postavke razrješivača i domene pretraživanja pripadaju pomoćnom kontejneru, a ne hostu. VPN s prosljeđivanjem portova mijenja svoj port za slušanje pri ponovnom povezivanju, pa se pružateljev proslijeđeni port i port za slušanje na strani kontejnera moraju upisati natrag u konfiguraciju klijenta ili u preslikavanje portova, obično malim ažuriračem koji čita pružateljev API. I svaka sonda napisana prema localhost sada pita kontejner tunela, a ne opterećenje.
Zapišite uzorak, uključujući koji kontejner posjeduje imenski prostor i koji portovi mu pripadaju. Sljedeća osoba dodat će uslugu, kopirati pogrešan blok i ponovno proizvesti prvi kvar iz ovog članka.