Docker Container – Anlegen, Starten, Verändern

Hier zeige ich kurz und schnell auf, wie man Docker Container anlegt, startet und editiert.

Anmerkung: Ich nutze Windows 10 als Host und arbeite mit Docker Desktop und der Linuxumgebung für Windows namens WSL bzw. WSL2. Diese Befehle funktionieren aber selbstverständlich auch auf nativen Linux-Systemen.

Ein Image herunterladen

Docker Container sind selbstständig lauffähige Instanzen von Images, die editiert, dupliziert, getestet, verschickt oder (später) wieder entfernt werden können. Um also einen Container zu starten, muss man zunächst ein Image anlegen oder herunterladen. Dazu kann man etwa das Repository von docker.com, das Docker Hub, benutzen. (Später wird noch gezeigt, wie man Images selbst erstellen kann.) Das Image verbleibt als Blaupause dabei unverändert.

Im Online Docker Hub gibt es tausende verschiedener Images. Ich nutze hier das thematisch naheliegende Image „docker/getting-started“.

Wir geben in der Kommandozeile ein:

cd ~ # ab ins Homeverzeichnis
docker pull docker/getting-started

Folgendes sollte zu sehen sein:

docker pull docker/getting-started

Um zu überprüfen, welche Images in unserem lokalen Repository vorhanden sind, nutzen wir das Kommando docker images.

docker images
docker images

Den ersten Container erstellen

Nur erstellen wir unseren ersten einfachen Container.

Da es anfangs zu Missverständnissen führen kann, weil man fälschlicherweise die Befehle run und start als Synonyme versteht, muss ich auf den entscheidenden Unterschied hinweisen: run = Abkürzung für create + start

Daher macht

docker create <image_id>
docker start <container_id>

dasselbe wie

docker run <image_id>

Der Befehl run erzeugt also einen neuen Container von einem Image und startet ihn automatisch.

Wir gehen einmal Schritt für Schritt vor.

docker create -p 80:80 docker/getting-started # Container wird angelegt, aber nicht gestartet
docker ps -a # Auflistung der vorhandenen Container

Mit „-p 80:80“ werden die Ports 80 von Container und Gastsystem miteinander verbunden, das ist wichtig, um gleich per Browser auf den Container zugreifen zu können. Wie gewünscht und erwartet wurde ein neuer Container angelegt. Nun wollen wir diesen starten. (Wir können Container über deren automatisch generierten Namen ansprechen.)

docker start eloquent_haslett # Namen kann man leichter nutzen als IDs
docker ps -a # Kontrolle
docker start

Die IP des Containers ermitteln

Um die IP des gestarteten Containers zu ermitteln, müssen wir uns zunächst per Shell verbinden. Dies geschieht mit dem Befehl docker exec. Bei dem von Docker bevorzugten Alpine Linux liegt die Shell auf dem Pfad /bin/sh – andere Linux nutzen z.B. /bin/bash.

docker exec -u 0 -it eloquent_haslett /bin/sh
hostname -i # IP des Containers ausgeben
exit # Verbindung wieder trennen
docker exec

Exkurs: Die IP für Windows Systeme ermitteln

Sollte der Container auf einem Windows Host laufen, dann müssen wir die IP des Containers anders ermitteln.

Dazu müssen wir in der Windows-Konsole (nicht in Unix!) den Befehl ipconfig nutzen. Die IP findet sich dann unter dem Eintrag für den Ethernet-Adapter WSL.

Windows IP config für Docker

Der erste Aufruf eines Containers über den Browser

Wir können jetzt entweder den Container über die Adresse localhost (für Windows) oder über die ermittelte IP aufrufen.

http://localhost/ bzw. http://172.24.64.1 bzw. http://172.17.0.2 (für Linux-Hosts)

Docker Tutorial Container

Als Ergebnis erhalten wir das Tutorial, das auf dem Container läuft.

Somit hätten wir erfolgreich unseren ersten Container erstellt und gestartet.

Den Inhalt eines Containers manipulieren

Das ganze Handling mit Containern wäre nur der halbe Spaß, wenn man die Container nicht auch bearbeiten, sprich: Deren Inhalte nicht verändern könnte.

Dazu werden wir jetzt die Startseite des Tutorials ein wenig verändern.

Zuerst müssen wir uns wieder mit der Shell des Containers verbinden.

docker exec -u 0 -it eloquent_haslett /bin/sh

Auf dem Container-Linux ist leider nur vi als Editor installiert. Wer damit nicht klarkommt, sollte nano installieren.

apk update
apk add nano
Alpine Linux install Nano Editor

Mit Hilfe des Befehls find finden wir heraus, wo sich die HTML-Dateien des Tutorials befinden.

find / -name index.html #  Datei(en) suchen
nano /usr/share/nginx/html/tutorial/index.html # Datei editieren
Find index.html auf Alpine Docker Container

Im Editor suchen wir jetzt mit der Tastenkombination STRG+w nach dem String „<h1>“. Die Überschrift besteht aus dem Text „Getting Started“ wir ändern ihn in „Hallo, Welt!“. Dann bitte speichern und den Editor wieder verlassen.

Rufen wir die Seite im Browser neue auf, sollte folgende Änderung zu sehen sein:

Und natürlich sollte die Änderung auch permanent sein und nicht nach Neustart verschwunden sein.

exit # um die Shell des Containers zu verlassen, falls noch nicht geschehen
docker stop eloquent_haslett # Container stoppen
docker start eloquent_haslett # Container wieder starten

Und wenn wieder die Seite im Browser aufgerufen wird, sehen wir weiterhin die Änderung.

Der umgekehrte Weg: Image aus Container erstellen

Wenn wir nun aus dem geänderten Container ein eigenes Image erstellen wollen (um es bspw. in das Repository von Docker hochzuladen oder um es Kunden zum Testen zugänglich zu machen), wird der Befehl docker commit genutzt.

docker commit <container_id> <neue_image_bezeichnung:tag>

Praktischerweise sollten wir den neuen Namen mit einem Tag versehen, um eine Versionierung zu simulieren. Für unseren Fall also Folgendes:

docker commit eloquent_haslett docker/getting_started:edited
docker images # Kontrolle
Docker Container in Image umwandeln.

Wir sehen jetzt zwei Images, das ursprüngliche, welches wir aus dem Docker Hub geladen haben und das neue mit der Hallo-Welt-Überschrift im Tutorial.