network_mode: service:vpn und der fehlende db-Hostname
Den VPN-Namensraum zu teilen ist eine Topologieentscheidung. Entweder behält db seine eigene Adresse und vpn tritt diesem Netzwerk bei, oder alles antwortet auf loopback.
Sie fügen network_mode: service:vpn zur App hinzu, starten den Stack neu, und die App stirbt, weil db nicht mehr aufgelöst wird. In der Compose-Datei wurde nichts umbenannt, also sind die naheliegenden Verdächtigen DNS und die Datenbank. Die eigentliche Änderung ist kleiner und seltsamer: Die App ist kein Mitglied des Compose-Netzwerks mehr, in dem dieser Name existiert. Bis Sie entscheiden, aus welchem Namensraum die Datenbank antworten soll, ist jede Hostname-Korrektur ein Ratespiel.
Warum der db-Hostname nicht mehr aufgelöst wird
Ein Dienst, der network_mode verwendet, hat keine eigene Adresse in einem Compose-Netzwerk; er leiht sich den Namensraum des benannten Dienstes. Dieser Namensraum bringt eigene Schnittstellen, Routen, Portbereich und Resolver mit und ersetzt die Anbindung der App an das Backend-Netzwerk. Der Name db war nie abstrakt: Er lebte in diesem Netzwerk und wurde über dessen eingebettetes DNS aufgelöst. Entfernen Sie die Anbindung, und der Name hat keinen Ort mehr zum Auflösen.
Bestätigen Sie das aus den Containern heraus statt vom Host. Eine Abfrage, die in der App scheitert, im Datenbank-Container aber gelingt, bedeutet, dass der Name in Ordnung ist und die Mitgliedschaft nicht. Dieses Ergebnis legt die Korrektur außerdem in die Compose-Topologie statt in die Resolver-Einstellungen der App.
Drei Fragen, bevor Sie die Datei bearbeiten
Beantworten Sie sie der Reihe nach, denn jede verengt die Topologie. Worauf muss die Datenbank antworten: auf einen Hostnamen, den andere Container verwenden, oder nur auf die App auf loopback? Muss die App einen Port zum Host veröffentlichen, und welcher Dienst würde ihn besitzen? Muss die Datenbank vom Host oder von einer anderen Maschine erreichbar sein, oder nur von innerhalb des Tunnels?
Wenn die Datenbank ihren eigenen Namen braucht und die App nichts veröffentlicht, halten Sie sie auf getrennten Anbindungen. Wenn die App einen Port veröffentlichen muss und alles durch den Tunnel läuft, legen Sie die Datenbank in den VPN-Namensraum und verwenden Sie loopback. Beides zu mischen erzeugt einen Stack, der sauber startet und beim Verbinden scheitert.
Lassen Sie die Datenbank, wo sie ist
Die kleinere Änderung bindet den Eigentümer des Namensraums an das Netzwerk an, das die Datenbank bereits enthält. Die App erbt diese Anbindung, weil sie den vpn-Stack teilt, und db wird genau wie zuvor aufgelöst.
services:
vpn:
networks:
- backend
app:
network_mode: service:vpn
db:
networks:
- backend
networks:
backend:Fügen Sie networks nicht ebenfalls zur App hinzu. Compose lehnt diese Eigenschaft zusammen mit network_mode im selben Dienst ab, und der Fehler zeigt auf die Datei statt auf das Paar. Wenn der VPN-Client das Backend-Ziel innerhalb seines Namensraums filtert, passen Sie auch seine unterstützte Lokalnetz-Richtlinie an; eine geteilte Anbindung bietet einen Weg, hebt diesen Filter aber nicht auf.
Verschieben Sie die Datenbank in den Namensraum
Die größere Änderung setzt die Datenbank in denselben Namensraum und richtet die App auf 127.0.0.1 mit dem echten Port. Zwei Prozesse können nicht beide dieselbe Adresse und denselben Port binden, nur weil sie in verschiedenen Containern gestartet sind, also kollidiert eine Datenbank, die auch auf der Wildcard-Adresse lauscht, mit allem anderen, das dies tut. Prüfen Sie den Listener, bevor Sie ihn verschieben.
Veröffentlichte Ports gehören zum Dienst, dem der Namensraum gehört. ports zur App hinzuzufügen wird zusammen mit network_mode abgelehnt, und eine separate App-Adresse zu erfinden beschreibt eine Schnittstelle, die es nicht gibt.
Bereitschaft, Blockierung und der Resolver
depends_on ordnet den Containerstart; es ist kein Beweis, dass der Tunnel steht, und es stoppt keinen Verkehr, wenn der Tunnel ausfällt. Behandeln Sie Erreichbarkeit, Tunnelbereitschaft und Fehlerblockierung als drei getrennte Anforderungen. Ein Stack, der nur die erste erfüllt, besteht einen manuellen Test an einem guten Tag und leckt an einem schlechten. Schreiben Sie die drei Antworten neben die Compose-Datei, wo die nächste Person nachsehen wird.
Namensraum-Teilen bedeutet auch, dass die App den Resolver des VPN-Containers erbt, was hilft, wenn der Tunnel DNS-Server durchdrückt, und verwirrt, wenn nicht. Prüfen Sie, was der Namensraum tatsächlich enthält, statt anzunehmen, dass der Resolver des Hosts gilt. Die Compose-Dienstreferenz dokumentiert network_mode, ports und das Verhalten von Abhängigkeiten an einer Stelle, einschließlich der Frage, warum ein network_mode-Dienst keine eigene Adresse hat.