GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

So fügen Sie einem vorhandenen Docker-Container ein Volume hinzu

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:

jq . config.v2.json> tmp.json

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

Docker
  1. So installieren Sie WordPress mit Docker

  2. Wie führe ich ein Programm in einem Docker-Container aus?

  3. Shell:Prüfen, ob Docker-Container vorhanden ist?

  4. So führen Sie MySQL in einem Docker-Container aus

  5. Wie füge ich Benutzer zum Docker-Container hinzu?

Was ist Docker? Wie funktioniert es?

So führen Sie PHPMyAdmin in einem Docker-Container aus

So führen Sie Grafana in einem Docker-Container aus

So richten Sie einen Apache Docker-Container ein

So führen Sie Docker-Container aus

So greifen Sie auf Dateien außerhalb eines Docker-Containers zu