Wie stelle ich sicher, dass ein Docker-Netzwerk (Schnittstelle) vorhanden ist, auch wenn es nicht ausgeführt wird?

Wie stelle ich sicher, dass ein Docker-Netzwerk (Schnittstelle) vorhanden ist, auch wenn es nicht ausgeführt wird?

Ich habe einen Containerstapel (angegeben durch docker-compose.yml). Der Stapel erfordert eine PostgreSQL-Datenbank, aber ich verwende eine lokal ausgeführte native Instanz, anstatt sie Teil des Stapels zu machen (um beispielsweise Backups zu vereinfachen und Ressourcen zu sparen). Die PostgreSQL-Instanz ist so eingestellt, dass sie bindet und auf lauscht 172.17.0.1, die IP, unter der der Host von Docker-Containern aus erreichbar ist.

Beim Systemstart bindet sich PostgreSQL jedoch nicht an diese Adresse und die Container können anschließend nicht initialisiert werden. Wenn ich PostgreSQL danach neu starte, kann ich sehen, dass es gebunden ist (über ss), und die Container werden problemlos initialisiert. Dies ist bei jedem Start zu 100 % reproduzierbar.

Ich denke, das liegt daran, dass die Schnittstelle noch nicht existiert und es daher nichts gibt, woran man binden kann. Gibt es eine Möglichkeit, das Netzwerk (oder die Schnittstelle) „beizubehalten“, sodass daran gebunden werden kann, auch wenn Docker noch nicht initialisiert wurde?

(Ich habe auch versucht, dies After=docker.servicein der systemd-Servicedatei für PostgreSQL anzugeben, aber ohne Erfolg. Ich denke, es liegt daran, dass Docker zwar bereits initialisiert wurde, die Container-Stacks jedoch nicht und die Netzwerke daher auch noch nicht erstellt wurden. Soweit ich weiß, ist es nicht möglich, in systemd „Warten, bis ein Docker-Container gestartet wurde“ anzugeben.)

Antwort1

Ich habe mich mit demselben Problem befasst. Ich habe eine Lösung gefunden, aber sie gefällt Ihnen vielleicht nicht. Wenn Sie listen_addressesin Ihrem Postgresql auf setzen '*', wird es stattdessen an die Adresse gebunden 0.0.0.0, die Datenverkehr von allen Schnittstellen empfängt. Ich habe bestätigt, dass dies auf mehreren Servern problemlos funktioniert.

Ja, es ist eine Sünde, Ihren DB-Server an Ihre öffentliche Adresse binden zu lassen. Sie sollten jedoch bereits UFW haben, das externen Datenverkehr blockiert, plus eine strenge Konfiguration, die pg_hbanur Verbindungen zu den entsprechenden DBs aus dem Docker-Subnetz zulässt, plus nur lokale Unix-Authentifizierung für das postgresSuperuser-Konto und sichere Passwörter für alle anderen Konten, also nehme ich an, dass es sicher genug ist. Es funktioniert zumindest, und ich konnte keine andere Möglichkeit finden, es zum Laufen zu bringen.

verwandte Informationen