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

So teilen Sie Daten zwischen Docker-Containern

Docker-Container sind absichtlich isolierte Umgebungen. Jeder Container hat sein eigenes Dateisystem, auf das andere Container oder Ihr Host nicht direkt zugreifen können.

Manchmal müssen Container Daten teilen. Obwohl Sie darauf abzielen sollten, dass Container autark sind, gibt es Szenarien, in denen die gemeinsame Nutzung von Daten unvermeidlich ist. Dies kann so sein, dass ein zweiter Container auf einen kombinierten Cache zugreifen, eine dateigestützte Datenbank verwenden, ein Backup erstellen oder Operationen mit benutzergenerierten Daten ausführen kann, z. B. ein Bildoptimierer-Container, der Profilfotos verarbeitet, die über einen separaten Webserver-Container hochgeladen wurden .

In diesem Leitfaden sehen wir uns einige Methoden zum Übergeben von Daten zwischen Ihren Docker-Containern an. Wir gehen davon aus, dass Sie Docker bereits eingerichtet haben und mit grundlegenden Konzepten wie Containern, Images, Volumes und Netzwerken vertraut sind.

Volumes zur gemeinsamen Nutzung eines Verzeichnisses verwenden

Volumes sind de facto die Möglichkeit, die gemeinsame Nutzung von Daten einzurichten. Sie sind unabhängige Dateisysteme, die ihre Daten außerhalb eines einzelnen Containers speichern. Das Mounten eines Volumes in einen Dateisystempfad innerhalb eines Containers bietet Lese- und Schreibzugriff auf die Daten des Volumes.

Volumes können gleichzeitig an mehrere Container angehängt werden. Dies erleichtert die nahtlose gemeinsame Nutzung und Persistenz von Daten, die von Docker verwaltet wird.

Erstellen Sie zunächst ein Volume:

docker volume create --name shared-data

Erstellen Sie als Nächstes Ihre Container und mounten Sie das Volume in dem Dateisystempfad, der von jedem Image erwartet wird:

docker run -d -v shared-data:/data --name example example-image:latest
docker run -d -v shared-data:/backup-source --name backup backup-image:latest

In diesem Beispiel die Datei backup Container erhält effektiven Zugriff auf das example /data des Containers Verzeichnis. Es wird als /backup-source gemountet; Änderungen, die von einem Container vorgenommen werden, werden im anderen widergespiegelt.

Schnellstart-Container mit passenden Volumes

Das obige Beispiel könnte mit docker run vereinfacht werden --volumes-from des Befehls Flagge. Dies bietet einen Mechanismus zum automatischen Mounten von Volumes, die bereits von einem vorhandenen Container verwendet werden:

docker run -d --volumes-from example --name backup backup-image:latest

Diesmal die backup Container erhält die shared-data Datenträger, der in seinem /data gemountet ist Verzeichnis. Der --volumes-from Flag zieht alle Volume-Definitionen ein, die an example angehängt sind Container. Es ist besonders ideal für Backup-Jobs und andere kurzlebige Container, die als Zusatzkomponenten zu Ihrem Hauptdienst fungieren.

Verbesserung der Sicherheit mit schreibgeschützten Mounts

Volumes werden standardmäßig immer im Lese-/Schreibmodus bereitgestellt. Alle Ihre Container mit Zugriff auf ein Volume dürfen seinen Inhalt ändern, was möglicherweise zu unbeabsichtigtem Datenverlust führt.

Es hat sich bewährt, freigegebene Volumes im schreibgeschützten Modus bereitzustellen, wenn von einem Container keine Änderungen erwartet werden. Im obigen Beispiel die Datei backup Container muss nur den Inhalt der shared-data lesen Volumen. Das Festlegen des Mounts in den schreibgeschützten Modus erzwingt diese Erwartung und verhindert, dass Fehler oder böswillige Binärdateien im Image Daten löschen, die von example verwendet werden Behälter.

docker run -d -v shared-data:/backup-source:ro --name backup backup-image:latest

Hinzufügen von ro als dritter durch Doppelpunkt getrennter Parameter zum -v Flag gibt an, dass das Volume im schreibgeschützten Modus gemountet werden soll. Sie können auch readonly schreiben statt ro als explizitere Alternative.

Freigabe von Daten über ein Netzwerk

Sie können den Netzwerkaustausch als alternativen Ansatz zur gemeinsamen Nutzung von Daten über Dateisystem-Volumes verwenden. Wenn Sie zwei Container mit demselben Docker-Netzwerk verbinden, können sie nahtlos über automatisch zugewiesene Hostnamen kommunizieren:

docker network create demo-network
docker run -d --net demo-network --name first example-image:latest
docker run -d --net demo-network --name second another-image:latest

Hier first in der Lage sein, second zu pingen und umgekehrt. Ihre Container könnten einen HTTP-API-Dienst ausführen, der es ihnen ermöglicht, mit den Daten der anderen zu interagieren.

Fortsetzung des Backup-Beispiels, jetzt Ihr backup Container könnte eine Netzwerkanfrage an http://example:8080/backup-data stellen um die zu sichernden Daten zu erfassen. Das example Container sollte mit einem Archiv antworten, das alle Daten enthält, die gespeichert werden müssen. Der Backup-Container ist dann dafür verantwortlich, das Archiv an einem geeigneten Speicherort zu speichern.

Das Erzwingen, dass die gemeinsame Nutzung von Daten über ein Netzwerk erfolgt, hilft oft bei der Entkopplung. Sie erhalten klar definierte Schnittstellen, die keine harten Abhängigkeiten zwischen Diensten schaffen. Der Datenzugriff kann präziser gesteuert werden, indem APIs für jeden Datentyp verfügbar gemacht werden, anstatt jedem Container vollständigen Zugriff auf ein Volume zu gewähren.

Es ist wichtig, die Sicherheit zu berücksichtigen, wenn Sie diesen Ansatz verwenden. Stellen Sie sicher, dass alle HTTP-APIs, die für den internen Zugriff durch Ihre anderen Docker-Container ausgelegt sind, keine Ports im Bridge-Netzwerk Ihres Docker-Hosts offengelegt haben. Dies ist das Standardverhalten bei Verwendung der oben gezeigten Netzwerkoptionen; Binden Sie einen Port mit -p 8080:8080 würde den Zugriff auf die Backup-API über die Netzwerkschnittstellen Ihres Hosts ermöglichen. Dies wäre ein Sicherheitsproblem.

Zusammenfassung

Docker-Container sind isolierte Umgebungen, die nicht auf die Dateisysteme der anderen zugreifen können. Nichtsdestotrotz können Sie Daten teilen, indem Sie ein Volume erstellen, das in allen teilnehmenden Containern gemountet wird. Die Verwendung eines gemeinsam genutzten Docker-Netzwerks ist eine alternative Option, die eine stärkere Trennung in Szenarien bietet, in denen direkte Dateisysteminteraktionen nicht erforderlich sind.

Es empfiehlt sich, Interaktionen zwischen Containern so weit wie möglich einzuschränken. Fälle, in denen Sie die gemeinsame Nutzung von Daten benötigen, sollten klar definiert werden, um eine enge Kopplung Ihrer Dienste zu vermeiden. Container, die eine starre Abhängigkeit von Daten von einem anderen haben Container kann im Laufe der Zeit schwieriger bereitzustellen und zu warten sein, wodurch die umfassenderen Vorteile der Containerisierung und Isolierung untergraben werden.


Docker
  1. So erstellen, listen und löschen Sie Docker-Container unter Linux

  2. So erstellen Sie einen Anaconda Python Data Science Docker-Container

  3. So teilen Sie Daten zwischen Docker-Containern unter Ubuntu 22.04

  4. So listen Sie Docker-Container auf

  5. So sichern und wiederherstellen Sie Docker-Container

So führen Sie Docker-Container aus

So entfernen Sie Docker-Container

So stoppen Sie Docker-Container

So benennen oder umbenennen Sie Docker-Container

So verwalten Sie Docker-Container

Docker-Container auflisten / starten / stoppen / löschen