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.
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.
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
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.
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 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:
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'..
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
.
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
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.
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
Eine der nützlichsten Interaktionen ist das Einhängen von Host-Verzeichnissen. Das erlaubt mehrere interessante Anwendungsfälle:
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.
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
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.