network_mode: service:vpn и изгубљено име домаћина db
Дељење простора имена VPN-а је избор топологије. Или db задржава сопствену адресу и vpn се придружује тој мрежи, или све одговара на loopback-у.
Додате network_mode: service:vpn у апликацију, поново покренете стек и апликација умире јер се db више не разрешава. Ништа у датотеци compose није преименовано, па су очигледни осумњичени DNS и база података. Стварна промена је мања и чуднија: апликација је престала да буде члан Compose мреже у којој то име постоји. Док не одлучите из ког простора имена база треба да одговара, свака поправка имена домаћина је нагађање.
Зашто је име домаћина db престало да се разрешава
Услуга која користи network_mode нема сопствену адресу на Compose мрежи; позајмљује простор имена именоване услуге. Тај простор доноси сопствене интерфејсе, руте, простор портова и резолвер, и замењује повезаност апликације са backend мрежом. Име db никада није било апстрактно: живело је на тој мрежи и разрешавало се преко њеног уграђеног DNS-а. Уклоните повезаност и име нема где да се разреши.
Потврдите то из унутрашњости контејнера, а не са хоста. Претрага која не успева у апликацији али успева у контејнеру базе података значи да је име у реду, а чланство није. Тај резултат такође смешта поправку у топологију compose, а не у подешавања резолвера апликације.
Три питања пре уређивања датотеке
Одговорите на њих по реду, јер свако сужава топологију. На чему база треба да одговара: на имену домаћина које користе други контејнери, или само на апликацији на loopback-у? Треба ли апликација да објави порт ка хосту, и која услуга би га поседовала? Треба ли база да буде доступна са хоста или са друге машине, или само изнутра тунела?
Ако бази треба сопствено име, а апликација ништа не објављује, држите их на одвојеним повезаностима. Ако апликација мора да објави порт и све иде кроз тунел, ставите базу у простор имена VPN-а и користите loopback. Мешање обога даје стек који се чисто покреће и пада при повезивању.
Оставите базу тамо где јесте
Мања промена повезује власника простора имена са мрежом која већ садржи базу. Апликација наслеђује ту повезаност јер дели vpn стек, и db се разрешава исто као пре.
services:
vpn:
networks:
- backend
app:
network_mode: service:vpn
db:
networks:
- backend
networks:
backend:Не додајте networks и у апликацију. Compose одбија то својство заједно са network_mode у истој услузи, а грешка указује на датотеку, а не на пар. Ако VPN клијент филтрира одредиште backend унутар свог простора имена, прилагодите и његову подржану политику локалне мреже; заједничка повезаност нуди пут, али не поништава тај филтер.
Преместите базу у простор имена
Већа промена ставља базу у исти простор имена и усмерава апликацију на 127.0.0.1 са стварним портом. Два процеса не могу оба да вежу исту адресу и порт само зато што су покренута у различитим контејнерима, па ће се база која такође слуша на wildcard адреси сударити са свим другим што то чини. Проверите слушаоца пре премештања.
Објављени портови припадају услузи која поседује простор имена. Додавање ports у апликацију се одбија заједно са network_mode, а измишљање одвојене адресе апликације описује интерфејс који не постоји.
Спремност, блокирање и резолвер
depends_on уређује покретање контејнера; то није доказ да је тунел активан и не зауставља саобраћај када тунел падне. Третирајте доступност, спремност тунела и блокирање отказа као три одвојена захтева. Стек који задовољава само прво пролази ручни тест доброг дана и цури лошег. Запишите три одговора поред датотеке compose, тамо где ће следећа особа погледати.
Дељење простора имена такође значи да апликација наслеђује резолвер VPN контејнера, што помаже када тунел намеће DNS сервере и збуњује када то не чини. Проверите шта простор имена заиста садржи уместо да претпостављате да важи резолвер хоста. Референца услуга Compose документује network_mode, ports и понашање зависности на једном месту, укључујући зашто услуга са network_mode нема сопствену адресу.