Afegiu network_mode: service:vpn a l’aplicació, reinicieu la pila i l’aplicació mor perquè db ja no es resol. No s’ha canviat el nom de res al fitxer compose, així que els sospitosos evidents són el DNS i la base de dades. El canvi real és més petit i més estrany: l’aplicació ha deixat de ser membre de la xarxa de Compose on existeix aquest nom. Fins que no decidiu de quin espai de noms ha de respondre la base de dades, cada correcció del nom d’amfitrió és una endevinalla.

Per què el nom d’amfitrió db ha deixat de resoldre’s

Un servei que utilitza network_mode no té cap adreça pròpia en una xarxa de Compose; manlleva l’espai de noms del servei anomenat. Aquest espai de noms aporta les seves interfícies, rutes, espai de ports i resolutor, i substitueix l’adjunció de l’aplicació a la xarxa backend. El nom db mai no va ser abstracte: vivia en aquella xarxa i es resolia mitjançant el seu DNS integrat. Traieu l’adjunció i el nom no té on resoldre’s.

Confirmeu-ho des de dins dels contenidors, no des de l’amfitrió. Una consulta que falla a l’aplicació però té èxit al contenidor de la base de dades vol dir que el nom és correcte i la pertinença no. Aquest resultat també situa la correcció a la topologia de compose en lloc de la configuració del resolutor de l’aplicació.

Tres preguntes abans d’editar el fitxer

Responeu-les per ordre, perquè cadascuna estreta la topologia. A què ha de respondre la base de dades: a un nom d’amfitrió que fan servir altres contenidors, o només a l’aplicació a loopback? Ha de publicar l’aplicació un port a l’amfitrió, i quin servei el posseiria? Ha de ser la base de dades accessible des de l’amfitrió o des d’una altra màquina, o només des de dins del túnel?

Si la base de dades necessita el seu propi nom i l’aplicació no publica res, manteniu-les en adjuncions separades. Si l’aplicació ha de publicar un port i tot passa pel túnel, poseu la base de dades a l’espai de noms de la VPN i feu servir loopback. Barrejar les dues coses produeix una pila que arrenca neta i falla en connectar.

Deixeu la base de dades on és

El canvi més petit adjunta el propietari de l’espai de noms a la xarxa que ja conté la base de dades. L’aplicació n’hereta l’adjunció perquè comparteix la pila vpn, i db es resol exactament com abans.

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

No afegiu networks també a l’aplicació. Compose rebutja aquesta propietat al costat de network_mode al mateix servei, i l’error assenyala el fitxer en lloc de la parella. Si el client VPN filtra la destinació backend dins del seu espai de noms, ajusteu també la seva política de xarxa local admesa; una adjunció compartida ofereix un camí però no anul·la aquest filtre.

Moveu la base de dades a l’espai de noms

El canvi més gran posa la base de dades al mateix espai de noms i apunta l’aplicació a 127.0.0.1 amb el port real. Dos processos no poden tots dos lligar la mateixa adreça i el mateix port només perquè s’han iniciat en contenidors diferents, així que una base de dades que també escolta a l’adreça wildcard xocarà amb qualsevol altra cosa que ho faci. Comproveu l’oient abans de moure’l.

Els ports publicats pertanyen al servei propietari de l’espai de noms. Afegir ports a l’aplicació es rebutja al costat de network_mode, i inventar una adreça separada per a l’aplicació descriu una interfície que no existeix.

Disponibilitat, bloqueig i el resolutor

depends_on ordena l’arrencada dels contenidors; no és prova que el túnel estigui actiu i no atura el trànsit quan el túnel cau. Tracteu l’abastabilitat, la disponibilitat del túnel i el bloqueig de fallades com tres requisits separats. Una pila que només compleix el primer passa una prova manual en un bon dia i filtra en un mal dia. Escriviu les tres respostes al costat del fitxer compose, on mirarà la persona següent.

Compartir l’espai de noms també vol dir que l’aplicació hereta el resolutor del contenidor VPN, cosa que ajuda quan el túnel imposa servidors DNS i confon quan no ho fa. Comproveu què conté realment l’espai de noms en lloc de suposar que el resolutor de l’amfitrió s’aplica. La referència dels serveis de Compose documenta network_mode, ports i el comportament de les dependències en un sol lloc, incloent-hi per què un servei amb network_mode no té cap adreça pròpia.

Articles relacionats