Wie gehen die Leute mit der dauerhaften Speicherung Ihrer Docker-Container um?
Ich verwende derzeit diesen Ansatz: Erstellen Sie das Image, z. B. für PostgreSQL, und starten Sie den Container mit
docker run --volumes-from c0dbc34fd631 -d app_name/postgres
IMHO, das hat den Nachteil, dass ich niemals (aus Versehen) den Container "c0dbc34fd631" löschen darf.
Eine andere Idee wäre, Host-Volumes "-v" in den Container zu mounten. Die Benutzer-ID im Container stimmt jedoch nicht unbedingt mit der Benutzer-ID des Hosts überein , und dann können die Berechtigungen durcheinander gebracht werden.
Hinweis: Statt --volumes-from 'cryptic_id'
Sie kann auch verwendet werden, --volumes-from my-data-container
wo my-data-container
ein Name , den Sie einen Nur - Daten-Container zugeordnet ist, zum Beispiel docker run --name my-data-container ...
(siehe akzeptierte Antwort)
quelle
--name
. Sie haben-name
Antworten:
Docker 1.9.0 und höher
Verwenden Sie die Volume-API
Dies bedeutet, dass das Nur-Daten-Containermuster zugunsten der neuen Volumes aufgegeben werden muss.
Tatsächlich ist die Volumen-API nur ein besserer Weg, um das Datencontainer-Muster zu erreichen.
Wenn Sie einen Container mit einem
-v volume_name:/container/fs/path
Docker erstellen, wird automatisch ein benanntes Volume für Sie erstellt, das:docker volume ls
docker volume inspect volume_name
--volumes-from
Verbindung gesichertDie neue Volume-API fügt einen nützlichen Befehl hinzu, mit dem Sie baumelnde Volumes identifizieren können:
Und dann entfernen Sie es durch seinen Namen:
Wie @mpugach in den Kommentaren unterstreicht, können Sie alle baumelnden Bände mit einem schönen Einzeiler entfernen:
Docker 1.8.x und darunter
Der Ansatz, der für die Produktion am besten zu funktionieren scheint, ist die Verwendung eines Nur-Daten-Containers .
Der Nur-Daten-Container wird auf einem Barebone-Image ausgeführt und führt nur ein Datenvolumen aus.
Anschließend können Sie einen beliebigen anderen Container ausführen, um Zugriff auf die Datencontainervolumes zu erhalten:
In diesem Blog-Beitrag gibt es eine gute Beschreibung des sogenannten Containers als Volumenmuster, die den Hauptpunkt verdeutlicht, dass nur Datencontainer vorhanden sind .
Die Docker-Dokumentation enthält jetzt die DEFINITIVE Beschreibung des Containers als Volume / s- Muster.
Im Folgenden wird das Sicherungs- / Wiederherstellungsverfahren für Docker 1.8.x und niedriger beschrieben.
SICHERUNG:
WIEDERHERSTELLEN:
Hier ist ein schöner Artikel von Brian Goff, der erklärt, warum es gut ist, dasselbe Bild für einen Container und einen Datencontainer zu verwenden.
quelle
--volumes-from
Mit dem Speicherplatz können--link
Sie Dienste gemeinsam nutzen.docker volume create --name mydata
) einem Datenvolumen-Container vorgezogen. Die Mitarbeiter von Docker selbst schlagen vor, dass Datenvolumen- Container „ nicht mehr als empfohlenes Muster angesehen werden“, „ benannte Datenträger sollten in den meisten (wenn nicht allen) Fällen nur Daten-Datenträger ersetzen können “ und „ kein Grund, den ich verwenden kann Nur-Daten-Container . “In Docker Release v1.0 kann das Binden eines Mount einer Datei oder eines Verzeichnisses auf dem Hostcomputer mit dem folgenden Befehl erfolgen:
Das oben genannte Volume kann als dauerhafter Speicher auf dem Host verwendet werden, auf dem Docker ausgeführt wird.
quelle
Ab Docker Compose 1.6 wird die Unterstützung für Datenmengen in Docker Compose jetzt verbessert. Die folgende Erstellungsdatei erstellt ein Datenbild, das zwischen dem Neustart (oder sogar dem Entfernen) der übergeordneten Container erhalten bleibt:
Hier ist die Blog-Ankündigung: Compose 1.6: Neue Compose-Datei zum Definieren von Netzwerken und Volumes
Hier ist ein Beispiel für eine Erstellungsdatei:
Soweit ich verstehen kann: Dadurch wird ein Datenvolumencontainer (
db_data
) erstellt, der zwischen den Neustarts bestehen bleibt.Wenn Sie ausführen:
docker volume ls
Ihr Volume sollte aufgelistet sein:Weitere Informationen zum Datenvolumen erhalten Sie:
Einige Tests:
Anmerkungen:
Sie können auch verschiedene Treiber im
volumes
Block angeben . Sie können beispielsweise den Flocker-Treiber für db_data angeben:Haftungsausschluss: Dieser Ansatz ist vielversprechend und ich verwende ihn erfolgreich in einer Entwicklungsumgebung. Ich wäre besorgt, dies noch in der Produktion zu verwenden!
quelle
Falls aus Update 5 der ausgewählten Antwort ab Docker 1.9 nicht ersichtlich ist, können Sie Volumes erstellen, die existieren können, ohne einem bestimmten Container zugeordnet zu sein, wodurch das Muster "Nur-Daten-Container" veraltet ist.
Siehe Nur-Daten-Container, die mit Docker 1.9.0 veraltet sind. # 17798 .
Ich denke, die Docker-Betreuer haben erkannt, dass das Nur-Daten-Containermuster ein wenig nach Design riecht, und beschlossen, Volumes zu einer separaten Entität zu machen, die ohne zugehörigen Container existieren kann.
quelle
Während dies immer noch ein Teil von Docker ist , der einige Arbeit benötigt , sollten Sie das Volume mit der Anweisung VOLUME in die Docker-Datei einfügen, damit Sie die Volumes nicht aus einem anderen Container kopieren müssen.
Dadurch werden Ihre Container weniger voneinander abhängig und Sie müssen sich keine Sorgen mehr machen, dass ein Container einen anderen beeinflusst.
quelle
docker rm
Fügen Sie bei Verwendung von Docker Compose einfach ein benanntes Volume hinzu, zum Beispiel:
quelle
Die Antwort von @ tommasop ist gut und erklärt einige der Mechanismen der Verwendung von Nur-Daten-Containern. Aber als jemand, der anfangs dachte, dass Datencontainer dumm waren, wenn man nur ein Volume an den Host binden konnte (wie in mehreren anderen Antworten vorgeschlagen), aber jetzt erkennt, dass reine Datencontainer tatsächlich ziemlich ordentlich sind, kann ich mein eigenes vorschlagen Blogbeitrag zu diesem Thema: Warum Docker-Datencontainer (Volumes!) gut sind
Siehe auch: Meine Antwort auf die Frage " Wie lassen sich Berechtigungen für gemeinsam genutzte Docker-Volumes (am besten) verwalten? " Ein Beispiel für die Verwendung von Datencontainern, um Probleme wie Berechtigungen und UID / GID-Zuordnung mit dem Host zu vermeiden.
Um eines der ursprünglichen Bedenken des OP auszuräumen: Der Datencontainer darf nicht gelöscht werden. Selbst wenn der Datencontainer gelöscht wird, gehen die Daten selbst nicht verloren, solange ein Container auf dieses Volume verweist, dh auf einen Container, über den das Volume bereitgestellt wurde
--volumes-from
. Wenn also nicht alle zugehörigen Container gestoppt und gelöscht werden (man könnte dies als das Äquivalent eines Unfalls betrachtenrm -fr /
), sind die Daten sicher. Sie können den Datencontainer jederzeit neu erstellen, indem Sie einen--volumes-from
beliebigen Container ausführen, der auf dieses Volume verweist.Machen Sie aber wie immer Backups!
UPDATE: Docker verfügt jetzt über Volumes, die unabhängig von Containern verwaltet werden können, was die Verwaltung weiter vereinfacht.
quelle
Abhängig von Ihren Anforderungen gibt es verschiedene Ebenen für die Verwaltung persistenter Daten:
-v host-path:container-path
um Containerverzeichnisdaten in einem Hostverzeichnis zu speichern.--volumes-from
und hängen Sie diese Daten in Ihren Anwendungscontainer ein.quelle
Wenn Sie Ihre Volumes verschieben möchten, sollten Sie sich auch Flocker ansehen .
Aus der README:
quelle
Dies hängt von Ihrem Szenario ab (dies ist für eine Produktionsumgebung nicht wirklich geeignet), aber hier ist eine Möglichkeit:
Erstellen eines MySQL Docker-Containers
Das Wesentliche dabei ist, ein Verzeichnis auf Ihrem Host für die Datenpersistenz zu verwenden.
quelle
Ich habe kürzlich über eine mögliche Lösung und eine Anwendung geschrieben, die die Technik demonstriert. Ich finde es während der Entwicklung und in der Produktion ziemlich effizient. Hoffe, es hilft oder löst einige Ideen aus.
Repo: https://github.com/LevInteractive/docker-nodejs-example
Artikel: http://lev-interactive.com/2015/03/30/docker-load-balanced-mongodb-persistence/
quelle
Ich verwende nur ein vordefiniertes Verzeichnis auf dem Host, um Daten für PostgreSQL beizubehalten. Auf diese Weise ist es auch möglich, vorhandene PostgreSQL-Installationen einfach in Docker-Container zu migrieren: https://crondev.com/persistent-postgresql-inside-docker/
quelle
Meine Lösung besteht darin, das neue zu verwenden
docker cp
, mit dem jetzt Daten aus Containern kopiert werden können, unabhängig davon, ob sie ausgeführt werden oder nicht, und ein Host-Volume an genau demselben Speicherort freigegeben wird, an dem die Datenbankanwendung ihre Datenbankdateien im Container erstellt . Diese Doppellösung funktioniert ohne Nur-Daten-Container direkt aus dem ursprünglichen Datenbankcontainer.Mein systemd init-Skript übernimmt also die Sicherung der Datenbank in einem Archiv auf dem Host. Ich habe einen Zeitstempel in den Dateinamen eingefügt, um eine Datei nie neu zu schreiben.
Es macht es auf dem ExecStartPre:
Und das Gleiche gilt auch für ExecStopPost:
Außerdem habe ich einen Ordner vom Host als Volume genau an derselben Stelle verfügbar gemacht, an der die Datenbank gespeichert ist:
Es funktioniert hervorragend auf meiner VM (ich erstelle einen LEMP-Stack für mich selbst): https://github.com/DJviolin/LEMP
Aber ich weiß nur nicht, ob es sich um eine "kugelsichere" Lösung handelt, wenn Ihr Leben tatsächlich davon abhängt (z. B. Webshop mit Transaktionen in möglichen Millisekunden).
20 Minuten und 20 Sekunden nach diesem offiziellen Docker-Keynote-Video macht der Moderator dasselbe mit der Datenbank:
Erste Schritte mit Docker
quelle
Verwenden Sie Persistent Volume Claim (PVC) von Kubernetes, einem Tool zur Verwaltung und Planung von Docker-Containern:
Dauerhafte Volumes
Die Verwendung von Kubernetes für diesen Zweck bietet folgende Vorteile:
quelle