Nachdem ich die Antworten ausgewertet und das Thema studiert habe, möchte ich es zusammenfassen.
Die Docker-Methode zum Aktualisieren von Containern scheint folgende zu sein:
Anwendungscontainer sollten keine Anwendungsdaten speichern . Auf diese Weise können Sie den App-Container jederzeit durch die neuere Version ersetzen, indem Sie Folgendes ausführen:
docker pull mysql
docker stop my-mysql-container
docker rm my-mysql-container
docker run --name=my-mysql-container --restart=always \
-e MYSQL_ROOT_PASSWORD=mypwd -v /my/data/dir:/var/lib/mysql -d mysql
Sie können Daten entweder auf dem Host (in einem als Volume bereitgestellten Verzeichnis) oder in speziellen Nur-Daten-Containern speichern . Lesen Sie mehr darüber
Das Aktualisieren von Anwendungen (z. B. mit yum / apt-get-Upgrade) in Containern wird als Anti-Pattern angesehen . Anwendungsbehälter sollen unveränderlich sein , was ein reproduzierbares Verhalten gewährleisten soll. Einige offizielle Anwendungsbilder (insbesondere MySQL: 5.6) sind nicht einmal für die Selbstaktualisierung ausgelegt (apt-get-Upgrade funktioniert nicht).
Ich möchte mich bei allen bedanken, die ihre Antworten gegeben haben, damit wir alle unterschiedlichen Ansätze sehen können.
Jaroslaw Stavnichiy
quelle
docker rename my-mysql-container trash-container
bevor Sie das neue erstellen?Ich mag es nicht, Volumes als Link zu einem Host-Verzeichnis bereitzustellen, daher habe ich ein Muster für das Upgrade von Docker-Containern mit vollständig von Docker verwalteten Containern entwickelt. Wenn Sie einen neuen Docker-Container mit
--volumes-from <container>
erstellen, erhält der neue Container mit den aktualisierten Images den gemeinsamen Besitz von Docker-verwalteten Volumes.Wenn Sie das Original
my_mysql_container
noch nicht sofort entfernen , können Sie zum bekannten Arbeitscontainer zurückkehren, wenn der aktualisierte Container nicht über die richtigen Daten verfügt oder einen Integritätstest nicht besteht.An diesem Punkt führe ich normalerweise alle Sicherungsskripte aus, die ich für den Container habe, um mir ein Sicherheitsnetz zu geben, falls etwas schief geht
Jetzt haben Sie die Möglichkeit, sicherzustellen, dass die Daten, die sich voraussichtlich im neuen Container befinden, vorhanden sind, und eine Überprüfung der Integrität durchzuführen.
Die Docker-Volumes bleiben so lange erhalten, wie sie von einem Container verwendet werden, sodass Sie den ursprünglichen Container sicher löschen können. Sobald der ursprüngliche Container entfernt wurde, kann der neue Container den Namensvetter des Originals annehmen, um alles so hübsch zu machen, wie es ursprünglich war.
Die Verwendung dieses Musters für die Aktualisierung von Docker-Containern bietet zwei wesentliche Vorteile. Erstens entfällt die Notwendigkeit, Volumes in Hostverzeichnisse zu mounten, da Volumes direkt in aktualisierte Container übertragen werden können. Zweitens sind Sie nie in einer Position, in der es keinen funktionierenden Docker-Container gibt. Wenn das Upgrade fehlschlägt, können Sie problemlos zu der vorherigen Funktionsweise zurückkehren, indem Sie den ursprünglichen Docker-Container erneut hochfahren.
quelle
./postgres-data/:/var/lib/postgres/data
./postgres-data/
Nur um eine allgemeinere (nicht MySQL-spezifische) Antwort zu geben ...
Mit der Service-Image-Registrierung synchronisieren ( https://docs.docker.com/compose/compose-file/#image ):
Erstellen Sie den Container neu, wenn sich die Docker-Compose-Datei oder das Docker-Image geändert hat:
Die Verwaltung von Container-Images ist einer der Gründe für die Verwendung von Docker-Compose (siehe https://docs.docker.com/compose/reference/up/ ).
Der Datenverwaltungsaspekt wird auch durch Docker-Compose über bereitgestellte externe "Volumes" (siehe https://docs.docker.com/compose/compose-file/#volumes ) oder Datencontainer abgedeckt .
Dies lässt potenzielle Abwärtskompatibilitäts- und Datenmigrationsprobleme unberührt, aber dies sind "anwendungsbezogene" Probleme, die nicht Docker-spezifisch sind und anhand von Versionshinweisen und Tests überprüft werden müssen ...
quelle
Ich möchte hinzufügen, dass Sie WatchTower verwenden können, wenn Sie diesen Vorgang automatisch ausführen möchten (Herunterladen, Stoppen und Neustarten eines neuen Containers mit denselben Einstellungen wie von @Yaroslav beschrieben). Ein Programm, das Ihre Container automatisch aktualisiert, wenn sie geändert werden. Https://github.com/v2tec/watchtower
quelle
Beachten Sie für diese Antworten:
app_schema
app_db
root123
So aktualisieren Sie MySQL beim Speichern von Anwendungsdaten im Container
Dies wird als schlechte Vorgehensweise angesehen , da Sie die Daten verlieren, wenn Sie den Container verlieren. Obwohl es eine schlechte Praxis ist, gibt es hier eine Möglichkeit, dies zu tun:
1) Führen Sie einen Datenbankspeicherauszug als SQL durch:
2) Aktualisieren Sie das Bild:
3) Aktualisieren Sie den Container:
4) Stellen Sie den Datenbankspeicherauszug wieder her:
So aktualisieren Sie den MySQL-Container mithilfe eines externen Volumes
Die Verwendung eines externen Volumes ist eine bessere Methode zum Verwalten von Daten und erleichtert das Aktualisieren von MySQL. Durch das Verlieren des Containers gehen keine Daten verloren. Mit Docker-Compose können Sie Docker-Anwendungen mit mehreren Containern auf einem einzigen Host verwalten:
1) Erstellen Sie die
docker-compose.yml
Datei, um Ihre Anwendungen zu verwalten:2) Aktualisieren Sie MySQL (aus demselben Ordner wie die
docker-compose.yml
Datei):Hinweis: Der letzte Befehl oben aktualisiert das MySQL-Image, erstellt den Container neu und startet ihn mit dem neuen Image.
quelle
docker-compose
Wird das funktionieren, seit Sie es erwähnt haben? stackoverflow.com/a/31485685/65313volumes_from
Der Schlüssel ist jetzt veraltet (sogar in Version 3 der Erstellungsdatei entfernt) und wird zugunsten des neuenvolumes
Schlüssels verwendet.docker pull image_uri:tag && docker restart container_running_that_image
arbeitete für mich. Keine Notwendigkeit fürdocker-compose pull && docker-compose up -d
.Ähnliche Antwort wie oben
quelle
So sieht es
docker-compose
beim Erstellen eines benutzerdefinierten Objekts ausDockerfile
.docker build -t imagename:version .
Dadurch wird Ihre neue Version lokal gespeichert.docker-compose down
docker-compose.yml
Datei so, dass sie den neuen Bildnamen widerspiegelt, den Sie in Schritt 1 festgelegt haben.docker-compose up -d
. Es wird lokal nach dem Bild suchen und Ihr aktualisiertes verwenden.-BEARBEITEN-
Meine obigen Schritte sind ausführlicher als sie sein müssen. Ich habe meinen Workflow optimiert, indem ich den
build: .
Parameter in meine Docker-Compose-Datei aufgenommen habe. Die Schritte sehen jetzt so aus:docker-compose build
docker-compose up -d
Ich wusste es damals noch nicht, aber Docker-Compose ist klug genug, um meinen Container einfach mit dem einen Befehl auf das neue Image zu aktualisieren, anstatt ihn zuerst herunterfahren zu müssen.
quelle
docker-compose up -d
ohne zuerst alles stoppen zu müssen.Wenn Sie Docker Compose nicht verwenden möchten, kann ich portainer empfehlen . Es verfügt über eine Neuerstellungsfunktion, mit der Sie einen Container neu erstellen können, während Sie das neueste Bild abrufen.
quelle
Sie müssen entweder alle Images neu erstellen und alle Container neu starten oder die Software irgendwie aktualisieren und die Datenbank neu starten. Es gibt keinen Upgrade-Pfad, den Sie jedoch selbst entwerfen.
quelle
docker restart
Befehl, aber ich bin nicht sicher, ob er Bildänderungen aufnimmt. Und was passiert mit meinen Daten in Containern?Entnahme von http://blog.stefanxo.com/2014/08/update-all-docker-images-at-once/
Sie können alle vorhandenen Bilder mit der folgenden Befehlspipeline aktualisieren:
quelle
Stellen Sie sicher, dass Sie Volumes für alle persistenten Daten (Konfiguration, Protokolle oder Anwendungsdaten) verwenden, die Sie in den Containern speichern, bezogen auf den Status der Prozesse in diesem Container. Aktualisieren Sie Ihre Docker-Datei, erstellen Sie das Image mit den gewünschten Änderungen neu und starten Sie die Container neu, wobei Ihre Volumes an der entsprechenden Stelle bereitgestellt werden.
quelle
Damit habe ich auch um meine eigenen Bilder gekämpft. Ich habe eine Serverumgebung, aus der ich ein Docker-Image erstelle. Wenn ich den Server aktualisiere, möchte ich, dass alle Benutzer, die Container basierend auf meinem Docker-Image ausführen, auf den neuesten Server aktualisieren können.
Im Idealfall würde ich es vorziehen, eine neue Version des Docker-Images zu generieren und alle Container, die auf einer früheren Version dieses Images basieren, automatisch auf das neue Image "an Ort und Stelle" zu aktualisieren. Dieser Mechanismus scheint jedoch nicht zu existieren.
Das nächstbeste Design, das ich bisher entwickeln konnte, ist die Bereitstellung einer Möglichkeit, den Container selbst zu aktualisieren - ähnlich wie eine Desktop-Anwendung nach Updates sucht und sich dann selbst aktualisiert. In meinem Fall bedeutet dies wahrscheinlich, dass ein Skript erstellt wird, bei dem Git-Pulls von einem bekannten Tag stammen.
Das Bild / der Container ändert sich nicht wirklich, aber die "Interna" dieses Containers ändern sich. Sie können sich vorstellen, dasselbe mit apt-get, yum oder was auch immer für Ihre Umgebung angemessen ist. Zusammen mit diesem würde ich das myserver: neueste Image in der Registrierung aktualisieren, sodass alle neuen Container auf dem neuesten Image basieren würden.
Es würde mich interessieren, ob es einen Stand der Technik gibt, der sich mit diesem Szenario befasst.
quelle
Aktualisieren
Dies dient hauptsächlich dazu, den Container abzufragen, der nicht aktualisiert werden soll, da das Erstellen von Images der Weg ist
Ich hatte das gleiche Problem, also habe ich Docker-Run erstellt , ein sehr einfaches Befehlszeilentool, das in einem Docker-Container ausgeführt wird , um Pakete in anderen laufenden Containern zu aktualisieren.
Es verwendet Docker-Py , um mit laufenden Docker-Containern zu kommunizieren und Pakete zu aktualisieren oder einen beliebigen einzelnen Befehl auszuführen
Beispiele:
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec
Standardmäßig wird der
date
Befehl in allen laufenden Containern ausgeführt und es werden Ergebnisse zurückgegeben. Sie können jedoch einen beliebigen Befehl ausgeben, zdocker-run exec "uname -a"
So aktualisieren Sie Pakete (derzeit nur mit apt-get):
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run update
Sie können einen Alias erstellen und als reguläre Befehlszeile verwenden, z
alias docker-run='docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run'
quelle
apt update; apt upgrade
, wird das Bild wachsen.)