Während Docker ein nützliches Tool zum Packen und Verwalten von Anwendungen ist, stellt es auch viele einzigartige Herausforderungen dar, z. B. den Umgang mit gespeicherten Daten. Normalerweise fügen Sie Volumes zu Containern im Erstellungsskript hinzu, aber was ist, wenn Sie neue erstellen müssen?
Hinzufügen eines Volumes zu einem laufenden Docker-Container
Leider ist es nicht so einfach, einfach ein neues Volume hinzuzufügen. Die Volumes von Containern müssen beim Start konfiguriert werden, was bedeutet, dass Sie den Container neu starten müssen, um ein neues Volume hinzuzufügen. Es gibt zwar eine hackige Lösung (mehr dazu weiter unten), aber es wird dringend empfohlen, trotzdem einen Container-Neustart durchzuführen.
Dies hat mehrere Gründe. Der Neustart des Containers ist relativ einfach und die meisten Codeaktualisierungen erfordern sowieso einen Neustart des Dienstes. Das Nachverfolgen von Updates in Git ist ein weiterer wichtiger Faktor, insbesondere wenn Sie Docker Compose verwenden, und das Bearbeiten des Startskripts ist weitaus besser als das manuelle Hinzufügen des Volumes zu einem laufenden Container.
Wenn Ihr Dienst groß genug ist, dass Sie sich Gedanken über (höchstens) einige Minuten geplanter Ausfallzeit zum Neustarten des Containers machen, sollten Sie wahrscheinlich eine Skalierungsbereitstellung mit mehreren Instanzen ausführen, die unabhängig voneinander aktualisiert werden können. Moderne Autoskalierungssysteme sollten darauf ausgelegt sein, damit umzugehen, da Codebereitstellungen häufig vorkommen.
Wenn Sie ein Volume hinzufügen möchten, müssen Sie den laufenden Container stoppen:
docker stoppt meinen_container
Erstellen Sie bei Bedarf ein neues Volume:
docker volume create nginx-config
Führen Sie es dann mit einem aktualisierten Startbefehl aus und fügen Sie --mount
hinzu -Flag, um das Quellvolume und das Zielziel zu konfigurieren.
docker run -d --name devtest --mount source=nginx-config,target=/etc/nginx nginx:latest
Wenn Sie Docker Compose verwenden, können Sie diesen Vorgang einfacher automatisieren und nachverfolgen, da die Volume-Konfiguration über eine Einstellungsdatei abgewickelt wird. Sie müssen das Volume zu docker-compose.yml
hinzufügen Datei:
Version: "3.0"Dienste:Web:Bild:nginx:neueste Ports:- "80:80" Volumes:- /docker/nginx-config/:/etc/nginx/
Anschließend können Sie die Dienste von Docker Compose neu starten. Compose hat einen „Neustart“-Befehl, aber es dient eigentlich nur dazu, den laufenden Dienst ohne Konfigurationsänderungen zu aktualisieren. Wenn Sie die Bilder aktualisieren möchten, müssen Sie docker-compose up
ausführen mit dem --build
Flagge:
docker-compose up -d --build
Sie können docker-compose down
auch manuell ausführen vorher die Dienste zu stoppen, aber es ist in den meisten Fällen nicht notwendig, es sei denn, Sie wollen es mit dem -v
ausführen Flag, um vorhandene Volumes zu zerstören.
VERBUNDEN: Was ist Docker Compose und wie wird es verwendet?
Klonen aus einem vorhandenen Container
In fast allen Fällen sollten Sie nicht vom aktuellen Ausführungsstatus eines Containers abhängig sein. Alles, was Ihnen wichtig ist, z. B. Anwendungsdaten, sollte in einem Volume gespeichert werden, damit es über Container-Neustarts und -Neuerstellung hinweg beibehalten werden kann.
Diese Methode ist wahrscheinlich für die meisten Leute keine gute Idee, da Sie jedes Mal ein neues Bild erstellen müssen, wenn Sie dies tun möchten, und es erfordert immer noch Ausfallzeiten. Wenn Sie jedoch einem laufenden Container ein Volume hinzufügen müssen, können Sie docker commit
verwenden um ein neues Image basierend auf diesem Container zu erstellen und es dann mit dem neuen Volume zu klonen.
Holen Sie sich die Container-ID von docker ps
:
docker-ps
Klonen Sie es dann mit commit
:
docker commit f88f33c918d2 Bildname
Dann können Sie das neue Image ausführen und das alte Image durch das geklonte ersetzen.
docker run -d --name devtest --mount source=nginx-config,target=/etc/nginx imagename
Die Hacky-Lösung
Docker-Volumes sind wirklich nur ein Trick, den die Docker-Laufzeit verwendet, um Hostverzeichnisse für Container verfügbar zu machen, und alles hängt von der Konfiguration ab. Aus diesem Grund können Sie diese Konfiguration tatsächlich direkt ändern und den gesamten Docker-Daemon neu starten, damit Ihr System diese Änderungen ohne Neustart übernimmt.
Dies ist natürlich weitaus komplizierter, als sich nur mit einem Neustart des Containers zu befassen. Wenn Sie also eine Minute Ausfallzeit bewältigen können, empfehlen wir Ihnen dringend, dies stattdessen zu tun.
Sie müssen zum Speicherverzeichnis von Docker navigieren:
cd /var/lib/docker/containers
Darin befinden sich viele Ordner, die Docker-Container-IDs entsprechen, die Sie mit docker ps
finden können . Öffnen Sie diejenige für den Container, den Sie ändern möchten.
Die Konfigurationsdatei ist config.v2.json
, aber es ist in einem kompakten Format und schwer zu bearbeiten. Sie können jq
installieren um JSON auf der Befehlszeile schön auszugeben und dies zur Bearbeitung in eine neue Datei zu leiten:
Sie müssen nach unten scrollen, um „MountPoints“ zu finden, das die Konfiguration für alle Volumes und Bind-Mounts enthält. Sie können hier eine neue hinzufügen, die das folgende Format haben sollte:
"MountPoints":{ "/home/container":{ "Source":"/var/lib/pterodactyl/volumes/c7fb3a04-e540-48a7-9704-13987f52e933", "Destination":"/home/container ", "RW":true, "Name":"", "Driver":"", "Type":"bind", "Propagation":"rprivate", "Spec":{ "Type":"bind" , "Source":"/var/lib/pterodactyl/volumes/c7fb3a04-e540-48a7-9704-13987f52e933", "Target":"/home/container" }, "SkipMountpointCreation":true } },
Sobald dies erledigt ist, können Sie den JSON wieder zurück in die Konfigurationsdatei verkleinern:
jq -c . tmp.json> config.v2.json
jq
ist ein leistungsstarkes Dienstprogramm. Wenn Sie diesen Prozess also vollständig automatisieren möchten, können Sie dies tun.
VERBUNDEN: Arbeiten mit JSON in der Befehlszeile
Starten Sie dann einfach den Docker-Dienst neu, um die Änderungen zu übernehmen:
sudo service docker restart