So arbeiten Sie mit Docker-Datenvolumes unter Ubuntu 14.04

Einführung

In diesem Artikel wird das Konzept der Docker-Datenvolumes erläutert: Welche Datenträger sind sie, warum sind sie nützlich, welche Datenträgertypen gibt es, wie werden sie verwendet und wann werden sie verwendet? Wir werden auch einige Beispiele für die Verwendung von Docker-Volumes mit dem Kommandozeilen-Tool "+ docker +" durchgehen.

Wenn das Ende des Artikels erreicht ist, sollten Sie mit dem Erstellen und Verwenden von Docker-Daten jeder Art vertraut sein.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie Folgendes:

Docker-Container erklären

Um mit Docker arbeiten zu können, sind einige Docker-spezifische Konzepte erforderlich. In den meisten Dokumentationen wird erläutert, wie das Docker-Toolset verwendet wird, ohne dass ausführlich erläutert wird, warum Sie eines dieser Tools verwenden möchten. Dies kann verwirrend sein, wenn Sie mit Docker noch nicht vertraut sind. Wir werden zunächst einige Grundlagen durcharbeiten und dann mit Docker-Containern arbeiten. Sie können jederzeit mit dem nächsten Abschnitt fortfahren, wenn Sie zuvor mit Docker gearbeitet haben und nur wissen möchten, wie Sie mit Datenvolumen beginnen können.

Ein Docker-Container ähnelt einer virtuellen Maschine. Grundsätzlich können Sie eine vorgefertigte „Linux-Box“ in einem Container ausführen. Der Hauptunterschied zwischen einem Docker-Container und einer typischen virtuellen Maschine besteht darin, dass Docker nicht so weit von der Umgebung entfernt ist wie eine normale virtuelle Maschine. Ein Docker-Container teilt den Linux-Kernel mit dem Host-Betriebssystem, dh, er muss nicht wie eine virtuelle Maschine „gebootet“ werden.

Da so viel gemeinsam genutzt wird, ist das Starten eines Docker-Containers ein schneller und kostengünstiger Vorgang. In den meisten Fällen können Sie einen vollständigen Docker-Container (das Äquivalent einer normalen virtuellen Maschine) in der gleichen Zeit aufrufen, in der ein normaler Computer ausgeführt werden würde Kommandozeilenprogramm. Dies ist großartig, da dadurch die Bereitstellung komplexer Systeme viel einfacher und modularer wird. Dies ist jedoch ein anderes Paradigma als der übliche Ansatz für virtuelle Maschinen und hat einige unerwartete Nebenwirkungen für Benutzer aus der Virtualisierungswelt.

Lernen der Arten von Docker-Datenvolumes

Es gibt drei Hauptanwendungsfälle für Docker-Datenvolumes:

  1. Um Daten zu behalten, wenn ein Container entfernt wird

  2. Daten zwischen dem Host-Dateisystem und dem Docker-Container austauschen

  3. Daten mit anderen Docker-Containern teilen

Der dritte Fall ist etwas weiter fortgeschritten, daher werden wir in diesem Tutorial nicht darauf eingehen, aber die ersten beiden sind recht häufig.

Im ersten (und einfachsten) Fall möchten Sie lediglich, dass die Daten hängen bleiben, auch wenn Sie den Container entfernen. Daher ist es häufig am einfachsten, Docker zu überlassen, wo die Daten gespeichert werden.

Daten persistent halten

Es gibt keine Möglichkeit, ein Daten-Volume direkt in Docker zu erstellen. Stattdessen erstellen wir einen Daten-Volume-Container, an den ein Volume angehängt ist. Verwenden Sie für alle anderen Container, die Sie dann mit diesem Datenträgercontainer verbinden möchten, die Docker-Option "+ - Volumes-from ", um das Volume aus diesem Container abzurufen und auf den aktuellen Container anzuwenden. Dies ist auf den ersten Blick etwas ungewöhnlich. Lassen Sie uns ein kurzes Beispiel durchgehen, wie wir mit diesem Ansatz dafür sorgen können, dass unsere " byebye +" - Datei auch dann erhalten bleibt, wenn der Container entfernt wird.

Erstellen Sie zunächst einen neuen Datenvolumen-Container, um unser Volumen zu speichern:

docker create -v /tmp --name datacontainer ubuntu

Dadurch wurde ein Container mit dem Namen "+ datacontainer " erstellt, der auf dem " ubuntu " - Image und im Verzeichnis " / tmp +" basiert.

Wenn wir nun einen neuen Ubuntu-Container mit dem "+ - volume-from" -Flag ausführen und "+ bash " erneut ausführen, wird alles, was wir in das " / tmp " -Verzeichnis schreiben, im "" gespeichert / tmp + Volumen unseres + Datencontainer + `Containers.

Starten Sie zuerst das + ubuntu Bild:

docker run -t -i --volumes-from datacontainer ubuntu /bin/bash

Die Befehlszeilenoptionen "+ -t " rufen ein Terminal im Container auf. Das ` -i +` Flag macht die Verbindung interaktiv.

Erstellen Sie an der Bash-Eingabeaufforderung für den "+ ubuntu" -Container eine Datei in "+ / tmp":

echo "I'm not going anywhere" > /tmp/hi

Fahren Sie fort und geben Sie "+ exit +" ein, um zur Shell Ihres Hostcomputers zurückzukehren. Führen Sie jetzt denselben Befehl erneut aus:

docker run -t -i --volumes-from datacontainer ubuntu /bin/bash

Diesmal ist die + hi + Datei schon da:

cat /tmp/hi

Das solltest du sehen:

Output of cat /tmp/hiI'm not going anywhere

Sie können beliebig viele + - Volumes-from + - Flags hinzufügen (wenn Sie beispielsweise einen Container zusammenstellen möchten, der Daten aus mehreren Datencontainern verwendet). Sie können auch beliebig viele Datenvolumen-Container erstellen.

Die einzige Einschränkung bei diesem Ansatz besteht darin, dass Sie den Ladepfad nur innerhalb des Containers (in unserem Beispiel "+ / tmp +") auswählen können, wenn Sie den Datenvolumencontainer erstellen.

Freigeben von Daten zwischen dem Host und dem Docker-Container

Die andere häufige Verwendung für Docker-Container ist die gemeinsame Nutzung von Dateien zwischen dem Host-Computer und dem Docker-Container. Dies funktioniert anders als im letzten Beispiel. Es ist nicht erforderlich, zuerst einen "Nur-Daten" -Container zu erstellen. Sie können einfach einen Container mit einem beliebigen Docker-Image ausführen und eines seiner Verzeichnisse mit dem Inhalt eines Verzeichnisses auf dem Hostsystem überschreiben.

Angenommen, Sie möchten das offizielle Docker Nginx-Image verwenden, aber eine permanente Kopie der Nginx-Protokolldateien aufbewahren, um sie später zu analysieren. Standardmäßig protokolliert das Docker-Image "+ nginx " im Verzeichnis " / var / log / nginx ", dies ist jedoch " / var / log / nginx +" im Docker Nginx-Container. Normalerweise ist es vom Host-Dateisystem aus nicht erreichbar.

Erstellen wir einen Ordner zum Speichern unserer Protokolle und führen Sie dann eine Kopie des Nginx-Images mit einem freigegebenen Volume aus, damit Nginx seine Protokolle in das Dateisystem unseres Hosts schreibt und nicht in das Verzeichnis "+ / var / log / nginx +" im Container:

mkdir ~/nginxlogs

Dann starte den Container:

docker run -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 -i nginx

Dieser Befehl "+ run +" unterscheidet sich ein wenig von den Befehlen, die wir bisher verwendet haben. Zerlegen wir ihn also Stück für Stück:

  • + -v ~ / nginxlogs: / var / log / nginx + - Wir haben ein Volume eingerichtet, das das Verzeichnis + / var / log / nginx + im Nginx-Container mit dem Verzeichnis + ~ / nginxlogs + auf dem Server verknüpft Host-Maschine. Docker verwendet ein "+: +", um den Pfad des Hosts vom Container-Pfad zu trennen, und der Host-Pfad steht immer an erster Stelle.

  • + -d + - Löse den Prozess und laufe im Hintergrund. Andernfalls sehen wir nur eine leere Nginx-Eingabeaufforderung und können dieses Terminal erst verwenden, wenn wir Nginx getötet haben.

  • + -p 5000: 80 + - Richten Sie eine Portweiterleitung ein. Der Nginx-Container überwacht standardmäßig Port 80 und ordnet den Port 80 des Nginx-Containers Port 5000 auf dem Host-System zu.

Wenn Sie genau aufgepasst haben, haben Sie möglicherweise auch einen weiteren Unterschied zu den vorherigen "+ run " - Befehlen bemerkt. Bis jetzt haben wir am Ende all unserer " run " - Anweisungen (normalerweise " / bin / bash ") einen Befehl angegeben, der Docker mitteilt, welcher Befehl im Container ausgeführt werden soll. Da es sich bei dem Nginx-Image um ein offizielles Docker-Image handelt, werden die Best Practices von Docker befolgt. Der Ersteller des Images legt fest, dass das Image den Befehl zum automatischen Starten von Nginx ausführt. Wir können einfach das übliche " / bin / bash +" hier ablegen und die Ersteller des Bildes entscheiden lassen, welcher Befehl in dem Container für uns ausgeführt werden soll.

Wir haben jetzt eine Kopie von Nginx, die in einem Docker-Container auf unserem Computer ausgeführt wird, und der Port 5000 unseres Host-Computers wird direkt dieser Kopie von Nginxs Port 80 zugeordnet. Verwenden Sie curl, um eine kurze Testanfrage zu stellen:

curl localhost:5000

Sie erhalten von Nginx einen HTML-Bildschirm zurück, der zeigt, dass Nginx aktiv ist. Interessanter ist jedoch, dass Sie, wenn Sie im Ordner "+ ~ / nginxlogs " auf dem Hostcomputer nachsehen und die Datei " access.log +" lesen, eine Protokollmeldung von Nginx mit unserer Anfrage erhalten:

cat ~/nginxlogs/access.log

Sie sehen etwas Ähnliches wie:

Output of `cat ~/nginxlogs/access.log`172.17.42.1 - - [23/Oct/2015:05:22:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"

Wenn Sie Änderungen am Ordner "+ ~ / nginxlogs +" vornehmen, können Sie diese auch in Echtzeit im Docker-Container anzeigen.

Fazit

Das fasst es zusammen! Im Folgenden erfahren Sie, wie Sie Datenträgercontainer erstellen, deren Datenträger zum Speichern von Daten in anderen Containern verwendet werden können, und wie Sie Ordner zwischen dem Host-Dateisystem und einem Docker-Container freigeben. Dies deckt alle außer den fortschrittlichsten Anwendungsfällen für Docker-Datenvolumes ab.

Wenn Sie Docker Compose verwenden, können Docker-Datenvolumes in Ihrer Datei + docker-compose.yml + konfiguriert werden. Informationen zur Installation und Verwendung von Docker Compose unter Ubuntu 14.04 finden Sie unter https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-14-04] für Einzelheiten.

Viel Glück und viel Spaß beim Andocken!