Docker Von Grund auf Arbeiten mit Containern, Teil 1

Dies ist Teil einer zweiteiligen Serie über die Arbeit mit Docker-Containern. In diesem Teil konzentrieren wir uns auf die vielen Möglichkeiten und Optionen zum Ausführen eines Images und wie der Host mit einem Docker-Container interagieren kann. 

Im zweiten Teil behandeln wir das Auflisten, Starten, Stoppen und Neustarten von Containern sowie das Ausführen von Befehlen zum Ausführen von Containern. Docker-Images sind die Einheiten der Bereitstellung. Wenn Sie ein Image ausführen, instantiieren Sie einen Docker-Container, der einen einzelnen Prozess in seiner eigenen isolierten Umgebung für den Dateisystem-, Netzwerk- und Prozessbaum ausführt. 

Docker-Container sind sehr flexibel und ermöglichen viele Anwendungsfälle, die mit anderen Technologien wie virtuellen Maschinen und Bare-Metal-Servern zu schwer, komplex und / oder teuer sind.

Stellen Sie vor dem Start sicher, dass Docker in Ihrer Umgebung ordnungsgemäß installiert ist. Abhängig von der Installation und Ihrem Benutzer müssen Sie es möglicherweise als sudo ausführen. Ich werde das Sudo überspringen. 

Bild ausführen

Sie starten einen Docker-Container, indem Sie ein Image ausführen. Es gibt verschiedene Möglichkeiten, einen Container auszuführen, die die einfache Verwaltung aller Container beeinflussen. Beim Starten des Containers wird normalerweise der in der Dockerfile definierte Befehl ausgeführt. Hier ist die Dockerfile für den Hallo-Welt-Container:

FROM scratch COPY Hallo / CMD ["/ Hallo"] 

Der Befehl führt einfach die "Hallo" - Binärdatei aus, die beim Erstellen des Abbilds in das Stammverzeichnis des Containers kopiert wurde.

Vordergrund vs. Freistehendes

Ein Container kann im Vordergrund ausgeführt werden, wo er blockiert, bis der Prozess beendet ist und der Container nicht mehr ausgeführt wird. Im Vordergrundmodus druckt der Container seine Ausgabe an die Konsole und kann Standardeingaben lesen. Im getrennten Modus (wenn Sie das Flag -d angeben) kehrt die Steuerung umgehend zum Container zurück 

Einen nicht benannten Container ausführen

Die einfachste Möglichkeit, einen Container auszuführen, ist: Dockerlauf .

Wenn Sie einen Container mit diesem Befehl ausführen, weist Docker ihm einen Namen zu, der aus zwei zufälligen Wörtern besteht. Zum Beispiel: docker run hallo-welt.

Wenn Sie bereits ein Hallo-Welt-Image haben, wird es von Docker ausgeführt. Wenn Sie dies nicht tun, wird es aus dem offiziellen Docker-Repository DockerHub gezogen und dann ausgeführt. Die Ausgabe sollte folgendermaßen aussehen:

Hallo von Docker! Diese Meldung zeigt an, dass Ihre Installation ordnungsgemäß funktioniert. Um diese Nachricht zu generieren, hat Docker die folgenden Schritte ausgeführt: 1. Der Docker-Client hat den Docker-Daemon kontaktiert. 2. Der Docker-Daemon holte das "Hallo-Welt" -Image vom Docker Hub. 3. Der Docker-Dämon hat aus diesem Image einen neuen Container erstellt, der die ausführbare Datei ausführt, die die gerade gelesene Ausgabe erzeugt. 4. Der Docker-Dämon hat diese Ausgabe an den Docker-Client gesendet, der sie an Ihr Terminal gesendet hat. Um etwas Ehrgeizigeres auszuprobieren, können Sie einen Ubuntu-Container mit folgendem Befehl ausführen: $ docker run -it ubuntu bash Teilen Sie Bilder, automatisieren Sie Arbeitsabläufe und vieles mehr mit einer kostenlosen Docker-ID: https://cloud.docker.com/ Weitere Beispiele und Ideen finden Sie unter: https://docs.docker.com/engine/userguide/ 

Das Hallo-Programm wird nach Anzeige der Nachricht beendet, wodurch der Prozess innerhalb des Containers und der Containerlauf beendet werden. Der Container bleibt immer noch in der Nähe, falls Sie eine Verbindung herstellen, Protokolle untersuchen oder etwas anderes. Um den Container anzuzeigen, können Sie den folgenden Befehl ausführen:

docker ps -a --format "Tabelle .ID \ t . Status \ t . Names" CONTAINER ID STATUSNAMEN 8e2e491accb5 Beendet (0) vor 2 Minuten clever_liskov

Ich werde später erklären, wie Container aufgelistet werden, sowie alle relevanten Optionen. Im Moment konzentrieren wir uns auf den Namensteil. Docker hat den Namen "clever_liskov" automatisch generiert, und ich muss ihn oder die Container-ID verwenden, um sich auf diesen Container zu beziehen, z. B. um ihn neu zu starten, zu entfernen oder einen Befehl auszuführen.

Einen benannten Container ausführen

Die Verwendung von Container-IDs oder automatisch generierten Namen ist manchmal unpraktisch. Wenn Sie häufig mit einem Container interagieren, den Sie häufig neu erstellen, erhält er eine andere ID und einen automatisch generierten Namen. Der Name wird auch zufällig sein. 

Docker lässt Sie Ihre Container benennen, wenn Sie sie ausführen, indem Sie einen "--name" angeben "Kommandozeilenargument. In einfachen Fällen, in denen nur ein Container pro Image vorhanden ist, können Sie den Container nach Ihrem Image benennen: docker run - name hallo-welt hallo-welt.

Nun, wenn wir uns den Prozess ansehen (habe ich entfernt) clever_liskov früher) sehen wir, dass der Container Hallo-Welt heißt:

docker ps -a --format "Tabelle .ID \ t . Names" CONTAINER-ID-NAMEN f6fe77b3b6e8 hallo-world 

Ein benannter Container bietet mehrere Vorteile:

  • Sie haben einen stabilen Namen für Ihre Container, die Sie sowohl interaktiv als auch in Skripts verwenden.
  • Sie können einen aussagekräftigen Namen wählen.
  • Sie können einen Kurznamen wählen, wenn Sie interaktiv arbeiten möchten.
  • Es verhindert, dass Sie versehentlich mehrere Container desselben Bildes haben (sofern Sie immer denselben Namen angeben)..

Schauen wir uns die letzte Option an. Wenn ich versuche, den gleichen Run-Befehl erneut mit dem gleichen Namen "Hallo-Welt" auszuführen, erhalte ich eine klare Fehlermeldung:

docker run - name hallo-world hallo-world docker: Fehlerantwort vom Daemon: Konflikt. Der Containername "/ hello-world" wird bereits vom Container f6fe77b3b6e8e77ccf346c32c599e67b2982893ca39f0415472c2949cacc4a51 verwendet. Sie müssen diesen Container entfernen (oder umbenennen), um diesen Namen wiederverwenden zu können. Siehe 'docker run --help'.. 

Ausführen eines Bildes zum automatischen Entfernen

Container bleiben standardmäßig erhalten. Manchmal brauchst du sie nicht. Anstatt verlassene Container manuell zu entfernen, lassen Sie den Container von alleine verschwinden. Das --rm Kommandozeilenargument macht den Trick: docker run --rm hallo-welt.

Einen anderen Befehl ausführen

Standardmäßig führt Docker den Befehl aus, der in der Docker-Datei angegeben ist, mit der das Image erstellt wurde (oder direkt der Einstiegspunkt, wenn kein Befehl gefunden wird). Sie können es jederzeit überschreiben, indem Sie am Ende des Befehls run einen eigenen Befehl eingeben. Lass uns laufen ls -la auf der busybox Bild (das Hallo Welt Bild hat keine ls ausführbar):

docker run busybox ls -la insgesamt 44 drwxr-xr-x 18-wurzel 4096 Mar 18 17:06. drwxr-xr-x 18 Wurzelwurzel 4096 Mar 18 17: 06… -rwxr-xr-x 1 Wurzelwurzel 0 Mar 18 17:06 .dockerenv drwxr-xr-x 2 Wurzelwurzel 12288 9. März 00:05 bin drwxr-xr -x 5 wurzel wurzel 340 Mar 18 17:06 dev drwxr-xr-x 2 wurzel 4096 Mar 18 17:06 etc drwxr-xr-x 2 niemand nogroup 4096 Mar 9 00:05 home dr-xr-xr-x 85 Wurzelwurzel 0 Mar 18 17:06 proc drwxr-xr-x 2 Wurzelwurzel 4096 Mar 9 00:05 Wurzel dr-xr-xr-x 13 Wurzelwurzel 0 Mar 18 17:06 sys drwxrwxrwt 2 Wurzelwurzel 4096 Mar 9 00: 05 tmp drwxr-xr-x 3 wurzel wurzel 4096 Mar 9 00:05 usr drwxr-xr-x 4 wurzel wurzel 4096 Mar 9 00:05 var 

Mit dem Host interagieren

Docker-Container führen isolierte Prozesse in ihrer eigenen kleinen Welt durch. Es ist jedoch oft notwendig und nützlich, dem Host Zugriff zu gewähren.

Umgebungsvariablen an einen Container übergeben

Docker-Container erben nicht automatisch die Umgebung des Host-Prozesses, auf dem sie ausgeführt wurden. Sie müssen dem Container explizit Umgebungsvariablen bereitstellen, wenn Sie ihn mithilfe von ausführen -e Befehlszeilenflag Sie können mehrere Umgebungsvariablen übergeben. Hier ist ein Beispiel: 

Docker-Run --rm -it -e ENV_FROM_HOST = "123" busybox / # env HOSTNAME = 8e7672bce5a7 SHLVL = 1 HOME = / root ENV_FROM_HOST = 123 TERM = xterm PATH = / usr / local / sbin: / usr / sbin: / usr / bin: / sbin: / bin PWD = / / # 

Die erste Zeile führt den busybox-Container aus und übergibt die ENV_FROM_HOST Variable und dann in den Container läuft env zeigt, dass die ENV_FROM_HOST ist richtig eingestellt.

Sie können auch Host-Umgebungsvariablen verwenden. Dadurch werden einige Host-Umgebungsvariablen festgelegt und im Ausführungsbefehl verwendet:

$ export VAR_1 = 1 $ export VAR_2 = 2 $ docker-run --rm -it -e VAR_1 = "$ VAR_1" -e VAR_2 = "$ VAR_2" - busybox

Im Container sind sie jetzt sichtbar:

/ # env | grep VAR VAR_1 = 1 VAR_2 = 2 

Mounten von Host-Verzeichnissen

Eine der nützlichsten Interaktionen ist das Einhängen von Host-Verzeichnissen. Das erlaubt mehrere interessante Anwendungsfälle:

  • Freigegebener Speicher zwischen Containern, die auf demselben Host ausgeführt werden.
  • Anzeigen und Bearbeiten von Dateien mit Ihrer Hostumgebung und Tools und Verwenden der Dateien im Container.
  • Persistenz auf Hostebene über die Lebensdauer eines Containers hinaus.

Hier erstelle ich eine Datei auf dem Host: $ echo "Ja, es funktioniert!" > ~ / data / 1.txt

Dann laufe ich die busybox Bild Montage der ~ / data-Verzeichnis zu /Daten im Container und Anzeige des Dateiinhalts auf dem Bildschirm:

$ docker run --rm -v ~ / data: / data busybox cat /data/1.txt Ja, es funktioniert! 

Ich habe die cat /data/1.txt Befehl hier.

Anzeigen von Ports für den Host

Wenn Sie einen Port in Ihrer Dockerfile mit freigeben ENTLARVEN, es ist nur für andere Docker-Container zugänglich. Um es auf dem Host zugänglich zu machen, müssen Sie die -p Befehlszeilenargument. Die Syntax lautet -p :.

Hier läuft das nginx Bild, das den Port 80 freigibt und die -p Befehlszeilenargument, um es auf dem Host an Port 9000 sichtbar zu machen: 

Andocklauf - Name Nginx --rm -d -p 9000: 80 nginx

Beachten Sie, dass der Nginx-Container im Gegensatz zu den vorherigen Befehlen, die einige Aufgaben ausgeführt und abgeschlossen haben, weiter ausgeführt wird und eingehende Anforderungen überwacht. Vergewissern Sie sich, dass nginx wirklich betriebsbereit ist und auf Anforderungen an Port 9000 reagiert. Ich ziehe den ausgezeichneten httpie-HTTP-Client gegenüber curl vor, um Webserver und Dienste von der Befehlszeile aus zu treffen:

http HEAD localhost: 9000 HTTP / 1.1 200 OK Accept-Ranges: Bytes Verbindung: Keep-Alive Content-Length: 612 Content-Type: text / html Datum: So 19 Mär 2017 07:35:55 ​​GMT ETag: "58a323e4- 264 "Zuletzt geändert: Di 14 Feb 2017 15:36:04 GMT Server: nginx / 1.11.10 

Fazit

Es gibt viele Möglichkeiten, ein Docker-Image zum Erstellen eines Containers auszuführen, und es gibt viele Optionen. Jede Kombination unterstützt eine bestimmte Verwendung. Es ist sehr nützlich, wenn Sie mit Docker-Containern arbeiten, um die Details vollständig zu erfassen und die beste Methode zum Starten Ihrer Container zu verwenden. 

Darüber hinaus ermöglicht das Anhängen von Host-Volumes sowie das Bereitstellen und Veröffentlichen von Ports eine enge Integration mit dem Host und eine Vielzahl von Anwendungsszenarien. In Teil zwei werden wir uns mit dem Verwalten einer Reihe von Containern beschäftigen und die volle Leistungsfähigkeit von Docker nutzen.