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.