1066 Stimmen

Wie man mit persistentem Speicher (z. B. Datenbanken) in Docker umgeht

Wie gehen Menschen mit persistentem Speicher für ihre Docker-Container um?

Derzeit verwende ich diesen Ansatz: Das Image erstellen, z.B. für PostgreSQL, und dann den Container starten mit

docker run --volumes-from c0dbc34fd631 -d app_name/postgres

Meiner Meinung nach hat das den Nachteil, dass ich niemals (aus Versehen) den Container "c0dbc34fd631" löschen darf.

Eine weitere Idee wäre, Host-Volumes "-v" in den Container einzuhängen, jedoch stimmt die Benutzer-ID im Container nicht unbedingt mit der Benutzer-ID des Hosts überein, und dann könnten die Berechtigungen durcheinander geraten.

Anmerkung: Anstelle von --volumes-from 'kryptische_id' können Sie auch --volumes-from my-data-container verwenden, wobei my-data-container ein Name ist, den Sie einem reinen Datencontainer zugewiesen haben, z.B. docker run --name my-data-container ... (siehe die akzeptierte Antwort)

15voto

Tim Dorr Punkte 4691

Obwohl dies noch ein Teil von Docker ist, der einige Arbeit erfordert, sollten Sie das Volume im Dockerfile mit der VOLUME-Anweisung platzieren, sodass Sie die Volumes nicht von einem anderen Container kopieren müssen.

Dadurch werden Ihre Container weniger voneinander abhängig und Sie müssen sich keine Sorgen darüber machen, dass das Löschen eines Containers einen anderen betrifft.

10voto

Raman Punkte 14828

Die Antwort von @tommasop ist gut und erklärt einige Mechanismen zur Verwendung von nur-Daten-Containern. Aber als jemand, der zunächst dachte, dass Datencontainer albern waren, wenn man einfach ein Volume an den Host anbinden konnte (wie von mehreren anderen Antworten vorgeschlagen), aber jetzt erkennt, dass Datencontainer tatsächlich ziemlich toll sind, kann ich meinen eigenen Blogbeitrag zu diesem Thema vorschlagen: Warum Docker-Datencontainer (Volumes!) gut sind

Siehe auch: meine Antwort auf die Frage "Was ist der (beste) Weg, um Berechtigungen für gemeinsam genutzte Docker-Volumes zu verwalten?" als Beispiel dafür, wie Datencontainer verwendet werden können, um Probleme wie Berechtigungen und uid/gid-Zuordnung mit dem Host zu vermeiden.

Um eine der ursprünglichen Bedenken des OP anzusprechen: Der Datencontainer darf nicht gelöscht werden. Selbst wenn der Datencontainer gelöscht wird, gehen die Daten nicht verloren, solange ein Container einen Verweis auf dieses Volume hat, d.h. ein Container, der das Volume über --volumes-from eingebunden hat. Also solange nicht alle zugehörigen Container gestoppt und gelöscht werden (man könnte dies als das Äquivalent eines versehentlichen rm -fr / betrachten), sind die Daten sicher. Sie können den Datencontainer immer wieder erstellen, indem Sie --volumes-from bei einem Container durchführen, der einen Verweis auf dieses Volume hat.

Machen Sie jedoch immer Sicherungskopien!

UPDATE: Docker hat jetzt Volumes, die unabhängig von Containern verwaltet werden können, was die Verwaltung noch einfacher macht.

10voto

Will Stern Punkte 16443

Es gibt verschiedene Ebenen zur Verwaltung von persistenten Daten, abhängig von Ihren Bedürfnissen:

  • Speichern Sie es auf Ihrem Host
    • Verwenden Sie die Flagge -v host-path:container-path, um Daten aus dem Containerverzeichnis dauerhaft in ein Hostverzeichnis zu speichern.
    • Backups/Wiederherstellungen erfolgen durch das Ausführen eines Backup/Wiederherstellungscontainers (wie z.B. tutumcloud/dockup), der im selben Verzeichnis eingebunden ist.
  • Erstellen Sie einen Datencontainer und binden Sie dessen Volumes an Ihren Anwendungscontainer an
    • Erstellen Sie einen Container, der ein Daten-Volume exportiert, verwenden Sie --volumes-from, um diese Daten in Ihren Anwendungscontainer einzubinden.
    • Backup/Wiederherstellung wie bei der oben genannten Lösung.
  • Verwenden Sie ein Docker-Volumenplugin, das einen externen/Drittanbieterdienst unterstützt
    • Docker-Volumenplugins ermöglichen es Ihrem Datenquellen von überall zu stammen - NFS, AWS (S3, EFS und EBS)
    • Je nach Plugin/Dienst können Sie einzelne oder mehrere Container an ein einzelnes Volume anhängen.
    • Je nach Dienst können Backups/Wiederherstellungen automatisiert erfolgen.
    • Obwohl dies mühsam sein kann, manuell zu tun, haben einige Orchestrierungslösungen - wie z.B. Rancher - es bereits integriert und einfach zu bedienen.
    • Convoy ist die einfachste Lösung dafür, dies manuell durchzuführen.

8voto

Johann Romefort Punkte 91

Wenn Sie Ihre Volumes verschieben möchten, sollten Sie auch Flocker in Betracht ziehen.

Aus dem README:

Flocker ist ein Daten-Volumen-Manager und ein Multi-Host Docker-Cluster-Verwaltungswerkzeug. Mit ihm können Sie Ihre Daten mit den gleichen Tools steuern, die Sie für Ihre zustandslosen Anwendungen verwenden, indem Sie die Leistung von ZFS unter Linux nutzen.

Dies bedeutet, dass Sie Ihre Datenbanken, Warteschlangen und Key-Value-Stores in Docker ausführen und genauso einfach verschieben können wie den Rest Ihrer Anwendung.

6voto

ben schwartz Punkte 2511

Es hängt von Ihrem Szenario ab (das ist eigentlich nicht für eine Produktionsumgebung geeignet), aber hier ist eine Möglichkeit:

Erstellen eines MySQL Docker-Containers

Das Wesentliche dabei ist, ein Verzeichnis auf Ihrem Host für die Datenspeicherung zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X