Nagdadagdag ka ng network_mode: service:vpn sa app, ini-restart mo ang stack, at namamatay ang app dahil hindi na nireresolba ang db. Wala namang pinangalanang muli sa compose file, kaya ang halatang pinaghihinalaan ay ang DNS at ang database. Ang tunay na pagbabago ay mas maliit at mas kakaiba: tumigil ang app sa pagiging miyembro ng Compose network kung saan umiiral ang pangalang iyon. Hanggang hindi mo pinagpapasyahan kung saang namespace dapat sumagot ang database, bawat pagwawasto ng hostname ay hulaan.

Bakit tumigil sa pagresolba ang db hostname

Ang serbisyong gumagamit ng network_mode ay walang sariling address sa isang Compose network; hinihiram nito ang namespace ng pinangalanang serbisyo. Dala ng namespace na iyon ang sarili nitong mga interface, ruta, espasyo ng port at resolver, at pinapalitan nito ang pagkakabit ng app sa network na backend. Ang pangalang db ay hindi kailanman abstract: nabubuhay ito sa network na iyon at nireresolba sa pamamagitan ng built-in nitong DNS. Alisin ang pagkakabit at wala nang mapagreresolbahan ang pangalan.

Tiyakin ito mula sa loob ng mga container at hindi mula sa host. Ang paghahanap na nabigo sa app ngunit nagtagumpay sa container ng database ay nangangahulugang maayos ang pangalan at hindi ang pagiging miyembro. Inilalagay din ng resultang iyon ang pagwawasto sa topolohiya ng compose at hindi sa mga setting ng resolver ng app.

Tatlong tanong bago i-edit ang file

Sagutin ang mga ito nang sunud-sunod, dahil pinapaliit ng bawat isa ang topolohiya. Ano ang dapat sagutin ng database: isang hostname na ginagamit ng iba pang container, o ang app lamang sa loopback? Dapat bang maglathala ang app ng port sa host, at aling serbisyo ang magmamay-ari nito? Dapat bang maabot ang database mula sa host o sa ibang makina, o mula lamang sa loob ng tunnel?

Kung kailangan ng database ang sarili nitong pangalan at wala namang inilalathala ang app, panatilihin sila sa magkahiwalay na pagkakabit. Kung kailangang maglathala ng port ang app at dumadaan ang lahat sa tunnel, ilagay ang database sa namespace ng VPN at gamitin ang loopback. Ang paghahalo ng dalawa ay gumagawa ng stack na malinis na nagsisimula at nabibigo sa oras ng pagkonekta.

Iwanan ang database kung nasaan ito

Ang mas maliit na pagbabago ay nagkakabit sa may-ari ng namespace sa network na naglalaman na ng database. Minamana ng app ang pagkakabit na iyon dahil ibinabahagi nito ang vpn stack, at nireresolba ang db nang eksakto tulad ng dati.

services:
  vpn:
    networks:
      - backend
  app:
    network_mode: service:vpn
  db:
    networks:
      - backend
networks:
  backend:

Huwag ding idagdag ang networks sa app. Tinatanggihan ng Compose ang property na iyon kasama ng network_mode sa parehong serbisyo, at ang error ay tumuturo sa file at hindi sa pares. Kung sinasala ng VPN client ang patutunguhang backend sa loob ng namespace nito, ayusin din ang sinusuportahang patakaran nito sa lokal na network; ang ibinahaging pagkakabit ay nag-aalok ng daan ngunit hindi binabalewala ang salang iyon.

Ilipat ang database sa namespace

Ang mas malaking pagbabago ay naglalagay ng database sa parehong namespace at itinuturo ang app sa 127.0.0.1 kasama ang tunay na port. Hindi maaaring kapwa i-bind ng dalawang proseso ang parehong address at port dahil lang nagsimula sila sa magkaibang container, kaya ang database na nakikinig din sa wildcard address ay babangga sa anumang iba pang gumagawa nito. Suriin ang nakikinig bago ito ilipat.

Ang mga nailathalang port ay pag-aari ng serbisyong may-ari ng namespace. Ang pagdaragdag ng ports sa app ay tinatanggihan kasama ng network_mode, at ang pag-imbento ng hiwalay na address ng app ay naglalarawan ng interface na wala.

Kahandaan, pagharang at ang resolver

Inaayos ng depends_on ang pagsisimula ng container; hindi ito patunay na buhay ang tunnel at hindi nito pinipigilan ang trapiko kapag bumagsak ang tunnel. Ituring ang maabot, kahandaan ng tunnel at pagharang ng kabiguan bilang tatlong magkakahiwalay na pangangailangan. Ang stack na tumutugon lamang sa una ay pumapasa sa manu-manong pagsubok sa magandang araw at tumatagas sa masamang araw. Isulat ang tatlong sagot sa tabi ng compose file, kung saan titingin ang susunod na tao.

Ang pagbabahagi ng namespace ay nangangahulugan ding minamana ng app ang resolver ng VPN container, na tumutulong kapag itinutulak ng tunnel ang mga DNS server at nakakalito kapag hindi. Suriin kung ano talaga ang laman ng namespace sa halip na ipagpalagay na nalalapat ang resolver ng host. Ang sanggunian sa mga serbisyo ng Compose ay nagtatala ng network_mode, ports at pag-uugali ng mga dependency sa isang lugar, kasama na kung bakit walang sariling address ang serbisyong network_mode.

Kaugnay na mga artikulo