Lisäät network_mode: service:vpn sovellukseen, käynnistät pinon uudelleen, ja sovellus kuolee, koska db ei enää ratkea. Compose-tiedostossa ei nimetty mitään uudelleen, joten ilmeiset epäillyt ovat DNS ja tietokanta. Todellinen muutos on pienempi ja oudompi: sovellus lakkasi olemasta sen Compose-verkon jäsen, jossa nimi on olemassa. Kunnes päätät, mistä nimiavaruudesta tietokannan pitää vastata, jokainen isäntänimen korjaus on arvailua.

Miksi db-isäntänimi lakkasi ratkeamasta

network_mode käyttävällä palvelulla ei ole omaa osoitetta Compose-verkossa; se lainaa nimetyn palvelun nimiavaruuden. Tämä nimiavaruus tuo mukanaan omat rajapintansa, reittinsä, porttialueensa ja ratkaisijansa, ja se korvaa sovelluksen kiinnityksen backend-verkkoon. Nimi db ei ollut koskaan abstrakti: se eli siinä verkossa ja ratkesi sen sisäänrakennetun DNS:n kautta. Poista kiinnitys, niin nimellä ei ole missään ratketa.

Vahvista tämä konttien sisältä, älä isännästä. Haku, joka epäonnistuu sovelluksessa mutta onnistuu tietokannan kontissa, tarkoittaa, että nimi on kunnossa ja jäsenyys ei. Tämä tulos sijoittaa korjauksen myös compose-topologiaan eikä sovelluksen ratkaisijan asetuksiin.

Kolme kysymystä ennen tiedoston muokkaamista

Vastaa niihin järjestyksessä, koska jokainen kaventaa topologiaa. Mihin tietokannan pitää vastata: isäntänimeen, jota muut kontit käyttävät, vai vain sovellukseen loopbackissa? Pitääkö sovelluksen julkaista portti isännälle, ja mikä palvelu omistaisi sen? Pitääkö tietokannan olla saavutettavissa isännästä tai toisesta koneesta, vai vain tunnelin sisältä?

Jos tietokanta tarvitsee oman nimensä eikä sovellus julkaise mitään, pidä ne erillisillä kiinnityksillä. Jos sovelluksen on julkaistava portti ja kaikki kulkee tunnelin kautta, laita tietokanta VPN-nimiavaruuteen ja käytä loopbackia. Näiden sekoittaminen tuottaa pinon, joka käynnistyy puhtaasti ja epäonnistuu yhdistettäessä.

Jätä tietokanta sinne, missä se on

Pienempi muutos kiinnittää nimiavaruuden omistajan verkkoon, jossa tietokanta jo on. Sovellus perii tämän kiinnityksen, koska se jakaa vpn-pinon, ja db ratkeaa täsmälleen kuten ennen.

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

Älä lisää networks myöskään sovellukseen. Compose hylkää kyseisen ominaisuuden yhdessä network_mode:n kanssa samassa palvelussa, ja virhe osoittaa tiedostoon eikä pariin. Jos VPN-asiakas suodattaa backend-kohteen nimiavaruutensa sisällä, säädä myös sen tuettua lähiverkkokäytäntöä; jaettu kiinnitys tarjoaa polun mutta ei ohita sitä suodatinta.

Siirrä tietokanta nimiavaruuteen

Suurempi muutos sijoittaa tietokannan samaan nimiavaruuteen ja osoittaa sovelluksen 127.0.0.1:aan todellisella portilla. Kaksi prosessia ei voi molemmat varata samaa osoitetta ja porttia vain siksi, että ne käynnistyivät eri konteissa, joten tietokanta, joka kuuntelee myös wildcard-osoitteessa, törmää kaikkeen muuhun niin tekevään. Tarkista kuuntelija ennen siirtoa.

Julkaistut portit kuuluvat palvelulle, joka omistaa nimiavaruuden. ports:n lisääminen sovellukseen hylätään yhdessä network_mode:n kanssa, ja erillisen sovellusosoitteen keksiminen kuvaa rajapintaa, jota ei ole olemassa.

Valmius, estäminen ja ratkaisija

depends_on järjestää konttien käynnistyksen; se ei ole todiste siitä, että tunneli on pystyssä, eikä se pysäytä liikennettä, kun tunneli putoaa. Käsittele saavutettavuus, tunnelin valmius ja virheiden estäminen kolmena erillisenä vaatimuksena. Pino, joka täyttää vain ensimmäisen, läpäisee käsitestin hyvänä päivänä ja vuotaa huonona. Kirjoita kolme vastausta compose-tiedoston viereen, minne seuraava ihminen katsoo.

Nimiavaruuden jakaminen tarkoittaa myös, että sovellus perii VPN-kontin ratkaisijan, mikä auttaa, kun tunneli työntää DNS-palvelimia, ja hämmentää, kun se ei tee niin. Tarkista, mitä nimiavaruus todella sisältää, sen sijaan että olettaisit isännän ratkaisijan pätevän. Compose-palveluviite dokumentoi network_mode, ports ja riippuvuuksien käyttäytymisen yhdessä paikassa, mukaan lukien sen, miksi network_mode-palvelulla ei ole omaa osoitetta.

Aiheeseen liittyvät artikkelit