network_mode: service:vpn ir dingęs db hosto vardas
Dalytis VPN vardų erdve yra topologijos pasirinkimas. Arba db išlaiko savo adresą ir vpn prisijungia prie to tinklo, arba viskas atsako per loopback.
Pridedate network_mode: service:vpn prie programos, paleidžiate steką iš naujo, ir programa miršta, nes db nebeišsprendžiamas. compose faile niekas nebuvo pervadinta, todėl akivaizdūs įtariamieji yra DNS ir duomenų bazė. Tikrasis pokytis mažesnis ir keistesnis: programa nustojo būti Compose tinklo, kuriame egzistuoja tas vardas, nare. Kol nenuspręsite, iš kokios vardų erdvės duomenų bazė turi atsakyti, kiekvienas hosto vardo taisymas yra spėjimas.
Kodėl db hosto vardas nustojo būti sprendžiamas
Paslauga, naudojanti network_mode, neturi savo adreso Compose tinkle; ji skolinasi nurodytos paslaugos vardų erdvę. Ta erdvė atsineša savo sąsajas, maršrutus, prievadų erdvę ir sprendiklį, ir ji pakeičia programos prisijungimą prie backend tinklo. Vardas db niekada nebuvo abstraktus: jis gyveno tame tinkle ir buvo sprendžiamas per jo įtaisytą DNS. Pašalinkite prisijungimą ir vardas neturi kur išsispręsti.
Patvirtinkite tai iš konteinerių vidaus, o ne iš prieglobos. Paieška, kuri nepavyksta programoje, bet pavyksta duomenų bazės konteineryje, reiškia, kad vardas tvarkingas, o narystė ne. Šis rezultatas taip pat nukreipia taisymą į compose topologiją, o ne į programos sprendiklio nustatymus.
Trys klausimai prieš redaguojant failą
Atsakykite iš eilės, nes kiekvienas susiaurina topologiją. Į ką duomenų bazė turi atsakyti: į hosto vardą, kurį naudoja kiti konteineriai, ar tik į programą loopback adresu? Ar programa turi skelbti prievadą prieglobai, ir kuri paslauga jį valdytų? Ar duomenų bazė turi būti pasiekiama iš prieglobos ar iš kitos mašinos, ar tik iš tunelio vidaus?
Jei duomenų bazei reikia savo vardo, o programa nieko neskelbia, laikykite juos atskiruose prisijungimuose. Jei programa turi skelbti prievadą ir viskas eina per tunelį, įdėkite duomenų bazę į VPN vardų erdvę ir naudokite loopback. Sumaišius abu, gaunamas stekas, kuris paleidžiamas švariai ir sugenda jungiantis.
Palikite duomenų bazę ten, kur ji yra
Mažesnis pokytis prijungia vardų erdvės savininką prie tinklo, kuriame jau yra duomenų bazė. Programa paveldi tą prisijungimą, nes dalijasi vpn steku, ir db išsprendžiamas lygiai taip pat kaip anksčiau.
services:
vpn:
networks:
- backend
app:
network_mode: service:vpn
db:
networks:
- backend
networks:
backend:Nepridėkite networks ir prie programos. Compose atmeta tą savybę kartu su network_mode toje pačioje paslaugoje, ir klaida rodo į failą, o ne į porą. Jei VPN klientas filtruoja backend paskirties vietą savo vardų erdvėje, sureguliuokite ir jo palaikomą vietinio tinklo politiką; bendras prisijungimas siūlo kelią, bet nepanaikina to filtro.
Perkelkite duomenų bazę į vardų erdvę
Didesnis pokytis įdeda duomenų bazę į tą pačią vardų erdvę ir nukreipia programą į 127.0.0.1 su tikruoju prievadu. Du procesai negali abu susieti to paties adreso ir prievado vien todėl, kad buvo paleisti skirtinguose konteineriuose, todėl duomenų bazė, kuri taip pat klausosi wildcard adreso, susidurs su viskuo kitu, kas tai daro. Patikrinkite klausytoją prieš perkeldami.
Paskelbti prievadai priklauso paslaugai, kuriai priklauso vardų erdvė. ports pridėjimas prie programos atmetamas kartu su network_mode, o atskiro programos adreso išradimas aprašo sąsają, kurios nėra.
Pasirengimas, blokavimas ir sprendiklis
depends_on tvarko konteinerių paleidimą; tai nėra įrodymas, kad tunelis veikia, ir jis nesustabdo srauto, kai tunelis krinta. Traktuokite pasiekiamumą, tunelio pasirengimą ir gedimų blokavimą kaip tris atskirus reikalavimus. Stekas, tenkinantis tik pirmąjį, praeina rankinį testą gerą dieną ir nuteka blogą. Užrašykite tris atsakymus šalia compose failo, ten, kur žiūrės kitas žmogus.
Vardų erdvės dalijimasis taip pat reiškia, kad programa paveldi VPN konteinerio sprendiklį, o tai padeda, kai tunelis stumia DNS serverius, ir klaidina, kai to nedaro. Patikrinkite, ką vardų erdvė iš tikrųjų turi, o ne manykite, kad galioja prieglobos sprendiklis. Compose paslaugų žinynas vienoje vietoje dokumentuoja network_mode, ports ir priklausomybių elgseną, įskaitant tai, kodėl network_mode paslauga neturi savo adreso.