Schlagwort-Archive: Debian

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.

Pimp my shell – Eine vernünftige Arbeitsumgebung für Linux

Immer, wenn ich ein neues Linux aufsetze, führe ich bestimmte Kommandos durch bzw. konfiguriere ich mein System so, dass ich vernünftig damit arbeiten kann. Jeder hat seine Eigenheiten und Bedürfnisse – hier skizziere ich mal die meinen.

Zunächst installieren wir uns sudo, um als normaler Nutzer auch wie ein Supernutzer (=root) agieren zu können, ohne uns als root anmelden zu müssen. Natürlich müssen wir diese eine Installation selbst noch als root vornehmen. Danach müssen wir uns nie wieder als root anmelden – außer ins Notfällen.

apt-get install sudo

Nun fügen wir den während der Installation angelegten Nutzer der Gruppe „sudo“ hinzu: adduser sudo. In meinem Falle also den Nutzer „juergen“

adduser juergen sudo

Mit dem Befehl groups <username> kann man prüfen, ob das Hinzufügen tatsächlich geklappt hat.

groups juergen

Das war es schon. Jetzt bitte mit exit wieder aus der Shell ausloggen und als normaler Nutzer wieder einloggen. Jetzt kann man mit einem vorangestellten sudo Befehle wie root ausführen.

Testen wir unsere neuen Fähigkeiten, indem wir gleich einmal einen vernünftigen Editor installieren.

sudo apt-get install nano

Mit diesem Editor nehmen wir unsere erste Anpassung vor. Wir sorgen dafür, dass ab jetzt jeder neue Nutzer mit der bin/bash Shell verbunden wird.

sudo cp /etc/adduser.conf /etc/adduser.conf.bak # Kopie schadet nie
sudo nano /etc/adduser.conf

Im Editor suchen wir jetzt folgende Zeile (oder fügen sie, falls nicht vorhanden, hinzu):

DSHELL=/bin/bash

Als Nächstes sorgen wir dafür, dass unser System gleich mit den wichtigsten Alias-Befehlen versorgt wird. Mit einem alias kann man mehrere Linux-Kommandos, oder ein Linux-Kommando mit mehreren Optionen durch einen neuen Befehl ersetzen. Es wird benutzt, um Zeit zu sparen und weniger zu tippen.

Das bekannteste alias dürfte wohl die Abkürzung dir für den Befehl „ls -l“ sein.

Wir bearbeiten wieder eine Konfigurationsdatei.

sudo cp /etc/bash.bashrc /etc/bash.bashrc.bak #  Kopie schadet nie
sudo nano /etc/bash.bashrc

Und fügen ans Ende folgende Zeilen hinzu:

alias +='pushd .'
alias ..='cd ..'
alias ...='cd ../..'
alias dir='ls -la  --color=auto'
alias gzcat='gunzip -c'
alias l='ls -alF'
alias la='ls -la'
alias ll='ls -la'
alias ls='/bin/ls $LS_OPTIONS'
alias ls-l='ls -l'
alias md='mkdir -p'
alias o='less'
alias rd='rmdir'
alias rehash='hash -r'
alias rm='rm -i'
alias unzip='tar xfvz'
alias which='type -p'
alias zip='tar cfvz'

Und schon sieht unsere Shell (nach einer Neueinwahl) sehr viel bunter, schöner, übersichtlicher aus.

Connecting to security.debian.org dauert ewig?

sudo apt-get update

dauert ewig in der Ausführung und es hängt bei

Connecting to security.debian.org

Gut möglich, dass Debian versucht, sich mit IPv6 zu verbinden und ihr Netzwerk nur IPv4 bietet.

Versuchen Sie, Debian das penetrante IPv6 auszutreiben.

sudo nano /etc/default/grub

Suchen Sie die Zeile

GRUB_CMDLINE_LINUX_DEFAULT=“quiet“

und ersetzen Sie sie durch

GRUB_CMDLINE_LINUX_DEFAULT=“quiet ipv6.disable=1″

sudo update-grub
sudo reboot

Sie werden sehen, dass es jetzt bei

sudo apt-get update

nicht mehr hängt.