Während Container kurzlebig sind, müssen Benutzerdaten bestehen bleiben. Ein klassisches Beispiel davon ist, wenn wir versuchen, Datenbankcontainerbilder auszuführen. Wenn Sie den Datenbankcontainer zerstören, gehen auch die Daten verloren. Was wir wollen, ist eine Situation, in der das Containerbild von postgresql Version 9 durch ein Bild von Version 10 ersetzt werden kann, ohne dass wir Daten verlieren müssen. Dies ist die Docker -Methode zum Upgrade von Software. Sie fielen nicht in den Container und aktualisieren Sie Pakete mit einem Paketmanager. Sie ersetzen das gesamte Containerbild.
Lassen Sie uns ein paar Fallstricke sehen, denen Sie dabei begegnen, und wie wir den Prozess aus operativen Gesichtspunkten viel glatter und sauberer machen können.
Docker -Volumes und PostgreSQL Standardverhalten
Docker -Bände sind die empfohlene Möglichkeit, Daten zu bestehen. Dies sind Dateisysteme, die vom Docker -Daemon verwaltet werden, und von Ihnen wird erwartet. Das offizielle Bild des Postgres wird jedoch mit einem in seiner Bildbeschreibung vordefinierten Volumen geliefert.
Dies bedeutet, dass beim Ausführen eines PostgreSQL -Bildes als Container ein Volumen für sich selbst erstellt wird und Daten dort gespeichert werden.
$ docker run -d -name mydb postgresSie können die vorhandenen Volumes mit dem Befehl Docker Volume LS auflisten und den Docker -Container -MyDB inspizieren, um festzustellen, welches dieser Volumes im Datenbankcontainer montiert ist.
$ Docker Volume LSSie werden feststellen, dass der Band einen ziemlich unfreundlichen Namen hat und bei montiert ist /var/lib/postgresql/Daten.
Entfernen wir diesen Behälter und das zugehörige Volumen vorerst:
$ docker rm -f mydbGleiches gilt für Sie, wenn Sie einen Container mit einer einfachen Docker-Compose-Datei erstellen. Das Folgende ist ein Docker-Compose.YML -Datei in einem Verzeichnis namens Postgres platziert.
Version: '3'Sie können es an Docker-compose ernähren, indem Sie ein Terminal in demselben Verzeichnis öffnen, in dem sich diese Datei befindet, und ausführen:
$ docker -compose up -dDies erstellt einen Container und einen Band, der dem Befehl Docker Run, den wir zuvor gesehen haben. Beide Methoden, eine mit Docker-Compose und einem anderen Docker CLI, haben jedoch ein tödliches Problem, und das wird ins Spiel, wenn Sie das alte Postgres-Bild durch ein neues ersetzen müssen.
Jedes Mal neue Bände
Wenn Sie die obige Bereitstellung durch Ausführen entfernen:
$ docker-compose downDer Container und das Netzwerk werden entfernt, aber die Lautstärke bleibt herum und Ihre Daten sind darin sicher. Wenn Sie jedoch das nächste Mal laufen:
$ docker -compose up -dCOMSE erstellt ein neues Volumen und eine neue Mount, die anstatt das zuvor erstellte Volumen zu verwenden. Und wie kann es sich erinnern, dass das vorherige Band für diesen bestimmten PostgreSQL -Container sowieso bestimmt war? Aber der arme Benutzer, der möglicherweise nicht einmal das Konzept der Bände bewusst ist.
Benutzer definiertes Volumen
Um dieses Problem zu umgehen, können wir die zuvor gesammelten Informationen verwenden /var/lib/postgresql/Daten. In diesem Verzeichnis im Container speichert Postgres alle relevanten Tabellen und Datenbanken.
Wir müssen nun ein Volumen innerhalb der Kompose -Datei definieren und an diesem Mountspunkt montieren. So die Docker-Compose.YML würde so aussehen.
Version: '3'Die letzte Zeile „Treiber: Local“ ist völlig optional und wird hier nur erwähnt, um zu zeigen, dass die „Taste der obersten Ebene Bände “ kann mehrere Volumina darunter definiert haben. DB-Data ist ein solches Volumen, der wiederum Einzelheiten hat, wie Treiber, die als eingerechter Block darunter enthalten sind.
Im Rahmen des MyDB -Dienstes haben wir die Taste der Volumes noch einmal. Das "Service Level Volumesschlüssel “ Es handelt sich nur um eine Liste von Volumina
Wenn Sie den Befehl docer-compose up -d zum ersten Mal mit der obigen YML-Definition ausführen. Anschließend jedes Mal, wenn Sie die Anwendung abbringen (Docker-Compose) und dann den Docker-Compose-Up-Compose erneut ausführen, versucht ein Volumen namens DB-Daten zu erstellen, aber dann würde es bemerken, dass ein Volumen mit diesem Namen bereits existiert. Dann wird es das gleiche Volumen wieder hilfreich montieren. Lassen Sie uns die Anwendung vorerst abbauen:
$ docker-compose downVerwenden von PostgreSQL
Das offizielle Postgres -Bild enthüllt den Port 5432 viel zu unserem Vorteil. Streng genommen ist dies nicht notwendig. Datenbanken sind nur einer der vielen Dienste, die in einem Docker -Netzwerk ausgeführt werden. Die anderen Dienste wie Webserver können mit der Datenbank sprechen, ohne dass ein explizite Port veröffentlicht wird. Dies liegt darauf. Wenn sich der Webserver und die Datenbank im selben Brückennetzwerk befinden, können sie miteinander sprechen, auch wenn die Ports explizit geöffnet werden.
Datenbanken sind oft nicht der Außenwelt ausgesetzt, sondern von anderen anderen Diensten zugegriffen. Daher ist es nicht etwas, das Sie in der Produktion oft sehen würden, um den Portgres -Port zu veröffentlichen.
Wir werden jedoch mit der Container -Anwendung experimentieren, um festzustellen, ob die Daten tatsächlich bestehen, damit wir die Ports vorerst aufdecken und veröffentlichen können. Ändern Sie den Docker-Compose.YML -Datei mit zusätzlichen Ports Option.
Version: '3'Jetzt sind wir bereit, mit der Postgres -Instanz mit dem PGADMIN -Client -Programm mitzuarbeiten. Sie können diesen Client auf Ihrem lokalen Computer mit Ihrer bevorzugten Methode installieren, wenn Sie diesem Link folgen. Nachdem der Client installiert wurde, können Sie eine Verbindung zum Datenbankserver herstellen. Starten wir jedoch zunächst den Datenbankserver.
$ docker -compose up -dDiesmal wird eingehende Anfragen bei Docker Host Port 5432 an den Port 5432 des Datenbankcontainers weitergeleitet, in dem Postgres -Server es verarbeiten kann.
Verbinde mit dem Server
Starten Sie den Pgadmin -Client und Sie können über Ihren Webbrowser darauf zugreifen. Im Dashboard finden Sie die Option aufgerufen Neuen Server hinzufügen.
Gib ihm einen vernünftigen Namen, wir gehen mit “Meine Datenbank “:
Und geben Sie unter der Registerkarte Verbindungen die Adresse ein, in der die Datenbank ausgeführt wird:
Die Adresse kann lokal sein, wenn Sie sowohl Pgadmin als auch der Postgres -Container auf demselben Computer ausführen. Wenn Sie beispielsweise den Postgres -Container auf einem Remote -VPS ausführen, wird hier die IP -Adresse dieses VPS benötigt. Im Allgemeinen nennen wir es die Adresse des Docker -Hosts, da Docker dort ausgeführt wird.
Wir lassen das Kennwortfeld leer und die Standardportnummer 5432 ist ebenfalls in Ordnung. Speichern Sie die Servereinstellungen und erstellen Sie dort eine Datenbank.
Bei erfolgreicher Verbindung sehen Sie alle internen Aktivitäten:
Im Browsermenü können wir schnell auswählen Meine Datenbank Server und darunter klicken Sie mit der rechten Maustaste auf die Datenbank und Erstellen Sie eine Datenbank.
Erstellen wir schnell eine Datenbank mit dem Namen Beispieldatenbank.
Sie müssen hier nichts anderes erstellen. Jetzt können wir das Fenster schließen und zurück zu dem Terminal zurückkehren, das im selben Verzeichnis geöffnet ist, in dem unser Docker-Compose.YML lebt.
$ docker-compose downDer alte Behälter ist jetzt weg und ein neuer hat seinen Platz eingenommen. Sie können Pgadmin wieder öffnen und müssen sich wieder mit dieser Datenbank verbinden (ein leeres Passwort würde es tun) und darin werden Sie feststellen, dass alles so ist, wie Sie es verlassen haben, um es zu sein. Es gibt sogar eine Beispieldatenbank da drin.
Wir wollten eine Docker-Compose-Datei schreiben, die Postgres aktualisierbar machte. Wenn ein neues Bild von Postgres ausführt, das Postgres 11 läuft, können Sie jetzt das neue Bild sicher einziehen und ein Upgrade durchführen.
Das Standardverhalten von Postgres -Bild, das darin besteht, jedes Mal ein neues Volumen zu erstellen, wenn ein Container erstellt wird. Es wird mit den besten Interessen im Herzen implementiert.
Aber es bringt einfach einen neuen Benutzer ab, der sich an seinem Kopf kratzt und sich fragt. Hoffentlich wird das für die Leser kein Problem mehr sein.