


Einer der am h?ufigsten beantworteten Beitr?ge im offiziellen Docker-Forum ist ?Daten in Datencontainern aktualisieren'.
Aug 08, 2016 am 09:30 AMEiner der am h?ufigsten beantworteten Beitr?ge im offiziellen Docker-Forum ?Upgrade von Daten innerhalb eines Datencontainers“
matlehmann
Ich habe einen Container mit Daten, er hat ein Volumen ( z.B. Persistente Daten in /var/data). Der Container enth?lt persistente Daten für die Software in einem anderen Container.
Für neue Versionen der Software müssen diese permanenten Daten aktualisiert werden (Struktur- oder Layout?nderungen usw.). Aus diesem Grund m?chte ich einen weiteren Datencontainer (in /var/data) mit den aktualisierten Daten am selben Ort erstellen und den alten Datencontainer mit seinen Daten weiterhin intakt halten.
Auf diese Weise kann ich den alten Datencontainer und die alte Version der Software verwenden, falls etwas schief geht.
Aber wie kann ich das machen? Die notwendigen Schritte, um das gewünschte Ergebnis zu erzielen, waren für mich nicht offensichtlich.
Ich kann einen Befehl ausführen, um den Container zu aktualisieren, z. B. docker run -i -t --name temp --volumes-from data -v /upgraded image /upgrade_script.sh
Aber wie kann ich sp?ter das Upgrade wiederherstellen? Daten an den ursprünglichen Speicherort kopieren, ohne die alten Daten zu überschreiben? Wenn ich docker run -i -t --volumes-from temp image cp /upgraded /var/data ausführe, werden meine alten Daten überschrieben. Muss ich für die aktualisierten Daten ein vom Host bereitgestelltes Volume verwenden, oder gibt es eine bessere L?sung?
sam
Nur eine Vermutung, da ich hier im Allgemeinen lieber direkt vom Host bereitgestellte Volumes verwende und Schwierigkeiten habe, den Nutzen von Datencontainern zu finden.
Aber... k?nnen Sie Ihren Datencontainer festschreiben und dann das Bild usw. speichern?
Sven
Oh, denken Sie bitte auch über den Vorschlag nach, Docker-Commit-Snapshot-Container zu verwenden. SAM ist gro?artig.
Keeb
Ich verwende tats?chlich Datencontainer wie UNIX-Pipes. Ich habe das Gefühl, dass sie natürlicher in das Paradigma passen.
docker run -name some_pipe_storage some_container_which_generates_data
docker run --volumes-from some_pipe_storage Something_that_operates_on_data
Die Syntax ist ziemlich umst?ndlich. Sehr kraftvoll und doch primitiv.
sven
hat einige interessante Arbeiten darüber, was mit Docker, dem Verwaltungstool zum Verbinden von Volumes, los ist – ich denke, sie sind auf dem Weg zu 1.4, ich werde einige Nachforschungen anstellen. (Es g?be eine Docker-Volume-Liste und etwas zum Bearbeiten)
Ich würde wahrscheinlich ein Backup-Daten-Volume im Container erstellen und dann eine Datenmigration des Images ausführen, das ich ausführen m?chte, verbunden mit den Daten und Backup-Daten – das würde wahrscheinlich reichen Das erste ist, dass die Daten von ?backup_data“ nach ?backup_data“ kopiert werden und dann die Datenmigration durchgeführt wird.
Sie k?nnen dann die alte und die neue Version ausführen, verbunden mit dem jeweiligen Daten-Backend (m?glicherweise mit Anh?ngen einer schreibgeschützten Sicherung?)
Dadurch sollte die Installation weitgehend gleich sein, unabh?ngig davon, welchen Host Sie verwenden eine Stildarstellung direkt oder über einen Datencontainer.
matlehmann
Ihr Vorschlag ist meine erste Ideenlinie, aber er entspricht nicht meinen Erwartungen, da nach dem Prozess die migrierten Daten und die Originaldaten einen anderen Weg haben, glaube ich Ich sehe keine M?glichkeit, dies zu ?ndern, da Nicht-Host-Volumes nicht auf einem anderen Pfad erneut bereitgestellt werden k?nnen. Der Pfad zu einem Volume von einem Datencontainer ist statisch – auch für Volume-Container, die von ?--volumes-from“ geerbt wurden.
Dies ist für das Host-Volume anders, da ich deren Mount-Standorte bei jedem Docker-Run-Aufruf ?ndern kann.
Ich denke, es ist sehr wichtig, dass Sie über diese Volume-Management-Tools sprechen. Für mich fühlt sich diese Docker-Sprache für Datencontainer eher wie eine Problemumgehung an.
Entschuldigung, sagen Sie ?Docker-Commit ist gro?artig“, weil ich es jedoch nicht sehen kann? Zumindest mit dem vorliegenden Anwendungsfall. Soweit ich wei?, enth?lt ein Docker-Commit für mich ein neues Bild des aktuellen Status des Containers. Dies umfasst alle Betriebssystemdaten, die mich interessieren, mit Ausnahme der persistenten Daten.
sven
Oh Mist. Sie haben Recht, der Volume-Pfad ist derzeit statisch. Sie ben?tigen also einen Schritt
1. Sie haben einen vorhandenen Datencontainer in /data
2. Migrieren Sie zum tempor?ren Datencontainer in /migration (wenn Sie eine Originalinstallation haben)
3./migrate Migrieren Sie die Daten nach Der neu aktualisierte Datencontainer/die neu aktualisierten Daten (das zweite Migrationsimage muss nicht in der ursprünglichen Datenkapazit?t installiert werden
@cpuguy83 kann Ihnen m?glicherweise mehr über das neue Tool smile
WRT Docker Commit sagen – wenn Sie es begehen erstellen Sie nicht eine einzelne Bildebene, die alles enth?lt, sondern eine neue Bildebene, die alle im Container vorgenommenen ?nderungen enth?lt (die beim Starten des Bildcontainers verwendet werden). Wenn Sie also anstelle eines Containers persistente Daten verwenden und Dinge wie Protokolle ausrollen, Sie k?nnten Docker verwenden, um Snapshots/Backups nur Ihrer persistenten Daten zu übertragen – und mit den Exporten von Docker k?nnten Sie diese Ebenen speichern
cpuguy83
@matlehmann siehe github.com/cpuguy83/ docker-volumesDies ist alles andere als eine perfekte L?sung, funktioniert aber in der Zwischenzeit ziemlich gut matlehmann matlehmann Sven matlehmann sam sven matlehmann@SAM Ich wechsle jetzt zur Verwendung von bind-mounted bind mount (oder jeder offizielle Begriff ist ?-v /host:/container“) für Volumes, und anstatt Datencontainer aufgrund der in diesem Thread aufgeführten Nachteile zu verwenden, habe ich aufgrund der im Internet verwendeten und empfohlenen Redewendung begonnen, Datencontainer zu verwenden. Scheint der ?offizielle Weg“ zu sein matlehmann@sven ?"migration" has ?"/ data" (via --volumes from datav10)?"/migration" (via `-v /migration') ?"datav11" has ?"/data" ( via -v /data)?"/migration" (via --volumes from migration) Wir haben also den ?/data“-Container ?datav11“ mit zwei definierten Volumes – für mich sieht es aus wie --volumes-from win one . sam @sven Ich denke, ich versuche nur herauszufinden, warum Sie die Daten in AUFS speichern. Es scheint das falsche Dateisystem für dieses Problem zu sein . BTRFS w?re in Ordnung, aber aufs scheint eine seltsame Wahl für Protokolldateien, die Verwendung von Postgres-Datenbanken usw. zu sein. Verstehe ich die Mechanik von Datencontainern falsch? @matlehmann Wir verwenden ?Volumen“ h?ufig. matlehmann sam sven Ja, es gibt einige Dinge bezüglich Dateisystemen Um das herauszufinden – auf meinen Dockern l?uft gr??tenteils BTRFS Ich denke, die Installation funktioniert auch – aber ich werde trotzdem eine Verknüpfung zu ihnen herstellen und dann den gleichen Prozess wie oben verwenden @sven Ich habe das noch nicht ausprobiert, aber es macht Sinn. Es ist ein seltsamer, verrückter Hühnertanz, aber es k?nnte funktionieren. Ich warte sehnsüchtig auf die Br?tchenbestellung Ja, ich konzentriere mich auf das tollpatschige H?hnchen – ich freue mich auf diese Versionen und die gegrillten H?hnchenschenkel zum Verschlingen https://forums.docker.com/t/upgrade-data-within-data -container/205/20
Das Obige stellt einen der am h?ufigsten beantworteten Beitr?ge im offiziellen Docker-Forum vor, ?Upgrading Data in Data Containers“, einschlie?lich relevanter Inhalte. Ich hoffe, dass er für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.
@Sven Danke für deine Antwort und für weitere Informationen. Ich verstehe Schritt 3 von ?/Migration von Daten in den neu aktualisierten Datencontainer, der in /data installiert ist (das zweite Migrationsimage erfordert nicht die Installation der ursprünglichen Datenkapazit?t) immer noch nicht in der aktuellen Form (mit Docker1.2 und ( kein spezieller Volume-Befehl), ich sehe nicht, wie ich einen Container mit dem Volume eines anderen Containers haben kann – ein Teil davon ist gemountet und ein Teil davon ist nicht gemountet. Nach dem, was ich gesehen habe, ist es entweder alles oder nichts oder ?- -“. volumes-from other_container“ oder nicht. Wenn also für den migrierten Container aus Schritt 2 die Originaldaten gemountet sind, wurde der Container in Schritt 3 gemountet, und daher überschreibt der Kopiervorgang von /mifrated nach /data die Originaldaten. Dennoch Ich habe etwas verloren?
Danke für den Tipp, ich muss noch etwas darüber nachdenken, um mich vorzubereiten
@keeb Das ist ein guter Modus, aber Soweit ich sehen kann, l?st es nicht das Problem, worüber ich spreche. Alle diese ?Pipe“-Container werden am Ende immer noch das Volumen von ?some_pipe_storage“ haben, ohne dass zu einem bestimmten Zeitpunkt ein anderer Container erstellt werden kann Pfad. Andere Daten, ohne die ursprünglichen Daten zu überschreiben.
Hmm, mal sehen, ob ich das hinbekomme. Die Erkl?rung ist ein Beispiel:
Angenommen, jemand hat einige Docker-Images erstellt, webappv10, webappv11, webapp_migratorv10_to_v11.
Zun?chst haben Sie ein 1.0-basiertes System ausgeführt.
docker run -v /data --name datav10 busybox true
docker run -p 80:80 --volumes-from datav10 --name webv10 webappv10
dann aktualisieren, fragen Sie mich nach dem Upgrade, Sie werden Schritt 2 ausführen (wie Sie bereits betont haben, k?nnen wir nicht zwei Volumes in der Datei enthalten gleiches Verzeichnis)
docker run -v /migration --name datav10-to-v11 busybox true
docker run --volumes-from datav10-to-v11 --volumes-from datav10 - -name migration webapp_migratorv10_to_v11
Dann Schritt 3, migrieren Sie die kopierten Daten in einen neuen Datencontainer und bereiten Sie die Daten im Verzeichnis /data mit
docker run -v /data --volumes-from datav10-to -v11 --name datav11 busybox cp vor -r /migration /data
und dann die Webanwendung der Version 1.1 ausführen
docker run -p 80:80 --volumes-from datav11 --name webv11 webappv11
und mehr Zu Ihrer Ehre, Sie sollten besser ein Skript erstellen alles.
Die Aktualisierung der Container-Volumenerh?hung von datav10 auf V11 erfolgt aufgrund der folgenden Diskussion
@sven Nochmals vielen Dank für Ihre ausführliche Antwort. Ich sch?tze Ihre Gedanken und Zeit.
Die von Ihnen beschriebene Vorgehensweise funktioniert jedoch nicht. Es ruft Volumes mit ?-v“ auf und widerlegt damit die Annahme, dass ein Volume denselben Pfad wie ?--volumes-from“ erbt. Ich habe es gerade noch einmal getestet, um sicherzugehen, aber das ist nicht der Fall. Deshalb führt Docker -v / data aus --volumes-from migration --name datav11 busybox cp -r /migration /data überschreibt meinen ursprünglichen Datencontainer datav10
, der Ihnen gef?llt Der Datencontainer befindet sich aus einem bestimmten Grund in einem einfachen Band (z. B. weil es leichter zu verstehen/zu verarbeiten ist)
Ich bin verwirrt über die Schritte, die es auszuarbeiten gilt. Nicht 2 B?nde von enth?lt /data dils-Anweisung. Wir migrieren einen Puffer und kopieren ihn dann in den neuen Daten-v11-Container
@sam – Es gibt einen kleinen konzeptionellen Unterschied – Sie sind Ich mache immer noch die gleichen 3 Schritte – der gr??te Unterschied besteht für mich darin, dass das Binden von Mounts nur lokal funktioniert, und das setzt voraus, dass Sie über den Speicherplatz dafür verfügen (nicht, dass ich das getan h?tte), w?hrend die Volume-Container-Methode davon ausgeht, dass Ihre Docker-Datenpartition gro? ist reicht aus, um den Docker-Container auszuführen, und funktioniert genauso wie die lokale Fernbedienung, wenn Sie die Zeilen ?docker run -v /data ...“ in ?docker run -v /local/data ...“ ?ndern und dann ?bind mounts to“ verwenden bind mount, im Auftrag von
?"datav10" has ?"/data" (via -v /data)
?"/data" (via --volumes -from migration)
Wir speichern auf dem Host bereitgestellte Volumes in handelsüblichen Containern, um eine einfache Rotation und Persistenz aller Protokolle zu gew?hrleisten. (Hier ist eine weitere Option, die das Streamen aus dem Container w?re, aber der Mechanismus ist nicht trivial. Denken Sie beispielsweise an einen NGINX-Container. Verwenden Sie Protokolle?)
Wir speichern einige Konfigurationen auf einem bereitgestellten GlusterFS-Volume, also was wir kann auf der ganzen Farm absorbieren
@sven Dies wird ein Thema für einen anderen Thread sein: Ich würde wirklich gerne etwas über Ihr GlusterFS-Setup h?ren. Gibt es ein gebrauchsfertiges Image, das als repr?sentatives Volume in GlusterFS verwendet werden kann, oder wie macht man das?
@supermathie w?re am besten für Details zu unserem GlusterFS-Setup geeignet, aber das gesamte Setup erfolgt auf sehr traditionelle Weise und wir verwenden keinen vertrauenswürdigen Docker-Container aktiviert Gluster.
OH(*&^, du hast recht.
Ich dachte, ich w?re so schlau, einen Schritt zu l?schen.
Du musst das /migrate verschieben Ordner zum eigenen Datencontainer, damit Sie das Problem vermeiden, das Sie im letzten Schritt bemerkt haben
Ich habe die einstufigen Beispielschritte aktualisiert, um dies widerzuspiegeln

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

1. Der Ursprung von .NetCore Wenn wir über .NetCore sprechen, dürfen wir seinen Vorg?nger .NET nicht erw?hnen. Java war zu dieser Zeit im Rampenlicht, und Microsoft bevorzugte auch Java. Die Java Virtual Machine auf der Windows -Plattform wurde von Microsoft basierend auf den JVM -Standards entwickelt. Es soll die beste Leistung Java Virtual Machine zu dieser Zeit sein. Microsoft hat jedoch einen eigenen kleinen Abakus, der versucht, Java mit der Windows-Plattform zu bündeln und einige Windows-spezifische Funktionen hinzuzufügen. Die Unzufriedenheit von Sun führte dazu zu einer Aufschlüsselung der Beziehung zwischen den beiden Parteien, und Microsoft startete dann .NET. .NET hat seit seiner Gründung viele Merkmale von Java geliehen und hat Java in Sprachmerkmalen und Formentwicklung nach und nach übertroffen. Java in Version 1.6

Um eine vollst?ndige Python -Webanwendung zu entwickeln, befolgen Sie die folgenden Schritte: 1. W?hlen Sie das entsprechende Framework wie Django oder Flask. 2. Integrieren Sie Datenbanken und verwenden Sie Ormen wie SQLalchemy. 3. Entwerfen Sie das Front-End und verwenden Sie Vue oder React. 4. Führen Sie den Test durch, verwenden Sie PyTest oder Unittest. 5. Anwendungen bereitstellen, Docker und Plattformen wie Heroku oder AWS verwenden. Durch diese Schritte k?nnen leistungsstarke und effiziente Webanwendungen erstellt werden.

Es gibt drei M?glichkeiten, die Prozessinformationen im Docker -Container anzuzeigen: 1. Verwenden Sie den Befehl docktop, um alle Prozesse im Container aufzulisten und PID, Benutzer, Befehl und andere Informationen anzuzeigen. 2. Verwenden Sie DockeKerexec, um den Container einzugeben, und verwenden Sie den Befehl ps oder oberes, um detaillierte Prozessinformationen anzuzeigen. 3.. Verwenden Sie den Befehl dockstats, um die Verwendung von Containerressourcen in Echtzeit anzuzeigen und Dockertop zu kombinieren, um die Leistung des Containers vollst?ndig zu verstehen.

Die Bereitstellung einer Pytorch -Anwendung auf Ubuntu kann durch Ausma? der Schritte durchgeführt werden: 1. Installieren Sie Python und Pip zuerst sicher, dass Python und PIP bereits auf Ihrem System installiert sind. Sie k?nnen sie mit dem folgenden Befehl installieren: sudoaptupdatesudoaptinstallpython3python3-pip2. Erstellen Sie eine virtuelle (optionale) Umgebung, um Ihre Projektumgebung zu isolieren. Es wird empfohlen, eine virtuelle Umgebung zu erstellen: Python3-mvenvMyenvSourceMyEnv/bin/activatet

Das Bereitstellen und Tuning von Jenkins auf Debian ist ein Prozess, der mehrere Schritte umfasst, einschlie?lich Installation, Konfiguration, Plug-in-Management und Leistungsoptimierung. Hier finden Sie eine detaillierte Anleitung, mit der Sie eine effiziente Jenkins -Bereitstellung erzielen k?nnen. Wenn Sie zuerst Jenkins installieren, stellen Sie sicher, dass Ihr System über eine Java -Umgebung installiert ist. Jenkins ben?tigt eine Java -Laufzeitumgebung (JRE), um ordnungsgem?? zu laufen. sudoaptupdatesudoaptininstallopenjdk-11-jdk überprüfen Sie, dass die Java-Installation erfolgreich ist: Java-Version Weiter, fügen Sie j hinzu

Eine effiziente M?glichkeit, einen Docker -Container zu stoppen, umfasst die Verwendung von Basisbefehlen und -Tools. 1. Verwenden Sie den Befehl dockstop $ (dockerps-q) und passen Sie die Zeitüberschreitungszeit an, z. B. DockerStop-T30 $ (Dockerps-Q). 2. Verwenden Sie Dockerps-Filteroptionen wie Dockstop $ (Dockerps-Q-Filter "Label = App = Web"). 3.. Verwenden Sie den DockerCompon-Befehl docker-composedown. 4. Schreiben Sie Skripte, um Container in Ordnung zu bringen, z. B. das Stoppen von DB, App und Webcontainern.

Es gibt zwei M?glichkeiten, die Unterschiede in verschiedenen Docker -Bildversionen zu vergleichen: 1. Verwenden Sie den Befehl dockerdiff, um ?nderungen im Containerdateisystem anzuzeigen. 2. Verwenden Sie den Befehl dockerHistory, um den Hierarchieunterschied im Bildgeb?ude anzuzeigen. Diese Methoden helfen beim Verst?ndnis und Optimieren von Bildversioning.

Durch die Docker -Containerisierungstechnologie k?nnen PHP -Entwickler PHPStorm verwenden, um die Entwicklungseffizienz und die Umweltkonsistenz zu verbessern. Die spezifischen Schritte umfassen: 1. Erstellen Sie eine Dockerfile, um die PHP -Umgebung zu definieren; 2. Konfigurieren Sie die Docker -Verbindung in PhpStorm; 3. Erstellen Sie eine DockerCompon -Datei, um den Dienst zu definieren. 4. Konfigurieren Sie den Remote -PHP -Interpreter. Die Vorteile sind eine starke Umweltkonsistenz, und die Nachteile umfassen lange Startzeit und komplexes Debuggen.
