VMWare, VirtualBox und Qemu haben dieselbe Eigenschaft: Sie benötigen Leistung von den Prozessoren. Einerseits benötigt schon die Software, die Hardware virtualisiert, Kraft, andererseits das darauf laufende Betriebssystem – im Grunde laufen hier dann zwei Betriebssysteme und die Software zur Virtualisierung.
In gewissen Fällen kann hier die Software Docker helfen – hier läuft im Grunde genommen kein zweites Betriebssystem. Der Gast, also das virtualisierte System, nutzt nämlich den Kernel des real installierten Systems. Das hat natürlich auch Nachteile: Da der Kernel des real installierten Systems genutzt wird, lässt sich nur ein verwandtes System virtualisieren. Unter Linux kann man nur Linux-Systeme in Docker laufen lassen, unter Windows nur Windows.
Inhaltsverzeichnis
Was kann man mit Docker anstellen?
Man kann Anwendungen vom restlichen System isolieren, so etwa einen Webserver mit Docker betreiben, der vom restlichen System abgeschottet ist. Man kann andere Linux-Distributionen versuchen – so ist es beispielsweise möglich, unter Debian openSUSE laufen zu lassen …
Docker installieren
Unter den meisten Linux-Distributionen nennt sich das Paket ganz einfach „docker„, unter auf Debian basierenden Linux-Distributionen existiert schon ein gleichnamiges Paket – hier installieren Sie über die Paket-Verwaltung das Paket „docker.io„.
Damit Docker dauerhaft läuft, müssen Sie den automatischen Start aktivieren. Dies gelingt am Terminal als Administrator mit dem Befehl:
systemctl enable docker
Nach einem Neustart startet Docker automatisch mit dem System. Möchten Sie Docker nur hin und wieder nutzen, starten Sie den Dienst manuell auf dem Terminal mit dem administrativen Befehl:
systemctl start docker
Mit:
systemctl stop docker
lässt er sich anschließend wieder beenden. Mit:
systemctl status docker
lässt sich der aktuelle Status anzeigen – hier läuft Docker – „Active: active (running)“:
Nach Images suchen
Man muss nicht lange selbst an Images basteln, es finden sich bereits für viele Aufgaben vorgefertigte Images auf dem Docker-Server im Internet. Gleich einmal zu Beginn – Docker wird vom Administrator genutzt. Nun wollen wir zu Beginn auf dem Terminal suchen – hier etwa nach einer bestimmten Distribution:
docker search debian
Als Ausgabe sehen Sie zu Beginn den Namen des Images, anschließend eine kurze Beschreibung und zuletzt eine Statusmeldung. Sie müssen jedoch nicht unbedingt eine Distribution wählen, es kann sich auch um eine Anwendung handeln, etwa:
docker search apache2
Möchten Sie mehrere Begriffe der Suche übergeben, setzen Sie alle Begriffe in Anführungszeichen.
Sie müssen passende Images jedoch nicht unbedingt am Terminal suchen, Sie können es auch auf der Webseite von Docker grafisch im Webbrowser tun: https://hub.docker.com/search?q=&type=image:
Docker-Images herunterladen
Haben Sie ein passendes Image gefunden, brauchen Sie für den Download nur dessen Namen. Im Beispiel einfach „debian“ – der Download gelingt am Terminal mit dem Befehl:
docker pull debian
In diesem Fall wird nur das Standard-System heruntergeladen, ohne jegliche Anwendungen (rund 60 MB).
Alle installierten Images anzeigen
Mit dem Befehl:
docker images
lassen sich anschließend alle installierten Images anzeigen:
Docker-Images starten
Ein installiertes Image starten Sie anschließend, indem Sie dessen Namen angeben, am besten steigen Sie gleich darin ein. Hierzu nutzen Sie die Optionen „-t -i
“ und geben an, dass Sie das Terminal starten wollen:
docker run -t -i debian /bin/bash
Sie landen also direkt im laufenden System auf dem Terminal. Alternativ starten Sie den Container mit der Option „-d
“ – in diesem Fall wartet das System im Hintergrund auf Eingaben:
docker run -t -i -d debian
Nun können Sie sich auf einem anderen Terminal alle laufenden Container anzeigen lassen:
docker ps
Mit dem Befehl:
exit
innerhalb des laufenden Containers steigen Sie aus diesem aus und beenden ihn. Wie oben schon beschrieben, starten Sie ein Docker-Image im Hintergrund mit dem Befehl:
docker run -i -t -d debian
Dies bedeutet: Sie müssen keine Eingaben machen – das System läuft, und Sie können auf dem Terminal andere Aufgaben erledigen oder natürlich auch weitere Docker-Images starten. Nun können Sie sich mit:
docker ps
die laufenden Docker-Images anzeigen lassen:
Wichtig ist hier nun die „CONTAINER ID„, mit dieser ID können Sie das Image steuern und Befehle in das im Hintergrund laufende System abgeben, hierzu dient der Befehl „exec
„. Um etwa den Befehl „ls
“ in das Image mit der ID „40ae1d009763“ abzugeben:
docker exec 40ae1d009763 ls
Die Ausgabe des Befehls wird in diesem Fall am Terminal ausgegeben, ohne direkt in den laufenden Container zu wechseln. Möchten Sie den im Hintergrund laufenden Container stoppen, genügt ein:
docker stop 40ae1d009763
Arbeiten mit Docker-Images
Nun wissen wir, wie wir Docker-Images installieren, starten und stoppen. Wir möchten darin natürlich auch arbeiten, in meinem Fall starte ich wieder mein Debian mit dem Terminal:
docker run -i -t debian /bin/bash
Ich befinde mich nun auf dem Terminal im laufenden Docker-Container und kann darauf arbeiten – etwa das System aktualisieren, Software installieren, Dateien anlegen und solche bearbeiten – was auch immer. Wird der laufende Container beendet, sind jedoch alle Änderungen verloren. Bei den heruntergeladenen Images handelt es sich um schreibgeschützte Images. Also muss man etwas anders arbeiten: Wir beginnen von vorne. Wir starten einen Container wie oben:
docker run -i -t debian /bin/bash
Wir beenden den Container einfach mittels:
exit
Nun starten wir den Befehl:
docker ps --all
Dieser Befehl zeigt uns nun nicht nur laufende Docker-Container, sondern auch solche, die wir bereits wieder beendet haben – ganz hinten finden Sie in der Tabelle auch die Spalte „NAME“ – dies ist eine freundliche Bezeichnung, mit der wir genau diesen Container wieder starten können – und in diesem Container können wir auch Änderungen vornehmen, die erhalten bleiben. Im Bild oben sehen wir die Bezeichnung „friendly_mclaren
“ – wir können diesen Container also mit:
docker start friendly_mclaren
starten:
Nun können wir mit:
docker attach friendly_mclaren
in den laufenden Container wechseln. Nun könnte man etwa das System aktualisieren, weitere Software installieren und sonstige Änderungen im System vornehmen – diese bleiben erhalten. Mit:
exit
kann man aus dem System aussteigen (dadurch wird dieser Container natürlich beendet), den Container wieder starten, und die Änderungen bleiben erhalten.
Laufende Container lassen sich nun mit:
docker ps
anzeigen, alle gestarteten Container (auch wenn diese nicht laufen) mit:
docker ps --all
Container die nicht laufen, lassen sich mit:
docker rm CONTAINER-ID
löschen, ganze Images, die Sie sich mit
docker images
anzeigen lassen, lassen sich mit
docker rmi Image-Name
löschen.
Man sieht also schon: Um mit Docker zu arbeiten, sollte man zu Beginn ein wenig planen. Nehmen wir einmal an, Sie möchten mit dem vorgefertigten Docker-Image „nginx“ (der Webserver nginx) einen Webserver betreiben – hier ist das System bereit, der Webserver ist installiert. Das System muss jedoch freie Ports haben – der Webserver benötigt ohne HTTPS den Port „80“ – ganz klar: Wir müssen den Port aus dem Container auf das real installierte System aufschalten. Gelingt ganz einfach:
-p Container-Port:Host-Port
In diesem Beispiel ganz einfach:
docker run -p 80:80 nginx
Schon läuft der Container, und Sie können mit „localhost“ über einen Webserver auf die Seite zugreifen:
Mittels:
docker ps --all
sehen wir anschließend den Namen des Containers, mit dem wir den Container mit
docker start NAME
wieder starten können. Möchte man sich den Server komplett selbst zusammenstellen, in diesem Fall einfach einen Webserver – etwa wieder mit dem Image „debian“ -, startet man das Image wieder mit den später zu nutzenden Ports – also
docker run -p 80:80 debian
sucht sich nun die ID oder den Namen und stoppt diesen mit:
docker ps --all
docker stop NAME
Nun kann man den Container starten, in dem man beständige Änderungen vornehmen kann, und darin arbeiten:
docker start NAME
docker attach NAME
Sie können einem Container natürlich auch selbst einen Namen geben – ist einfacher zu merken:
docker run --name= NAME -p 80:80 debian
Docker-Volumes – Auf den Speicher eines Docker-Systems zugreifen und Docker Compose
Hat man eine Software unter Docker installiert und möchte auf die Daten dieser zugreifen, kann es schon einmal umständlich werden. In den Container wechseln, mit Befehlen am Terminal hantieren – mit sogenannten Volumes fällt dies viel einfacher.
Ein Volume ist nichts anderes, als ein Verzeichnis auf dem Docker-System – dieses wird direkt mit dem Wirtssystem geteilt. Zusätzlichen Platz benötigt dies nicht. Man nennt die Geschichte auch gerne Persistenz.
Sehen wir uns diese Geschichte mit einem Beispiel an – ich werde dazu ganz einfach MediaWiki – die Software wird unter anderem bei Wikipedia genutzt.
Mediawiki unter Docker installieren
Für MediaWiki gibt es auf DockerHub bereits ein vorgefertigtes Image, dieses können wir ganz einfach mittels Docker aufsetzen:
docker run --name mediawiki -p 8080:80 -d mediawiki
Jetzt können wir via Webbrowser und der Adresse 127.0.0.1:8080 oder localhost:8080 auf das Wiki zugreifen. Jetzt wird es jedoch problematisch – man richtet das Wiki ein und bekommt die Datei „LocalSettings.php“ zum Download, diese gilt es anschließend im Verzeichnis der MediaWiki-Installation abzulegen, ansonsten läuft das Wiki nicht.
Dafür gibt es nun Volumes – eben Verzeichnisse, die zwischen Host und Gast geteilt werden. Um Docker-Images anzupassen, erstellen wir uns eine Konfigurationsdatei in einem leeren Verzeichnis – die Konfigurationsdatei nennt sich „docker-compose.yml„. Mit dieser Konfigurationsdatei und der Software Docker-Compose passen wir das Image an. Docker-Compose wird unter auf Debian basierenden Linux-Distributionen wie üblich ganz einfach über die Paket-Verwaltung durch das Paket „docker-compose“ installiert.
Wie schon beschrieben – für unser Beispiel dient MediaWiki – am oben gezeigten Link findet sich bereits eine passende Vorlage für die Konfigurationsdatei:
# MediaWiki with MariaDB
#
# Access via "http://localhost:8080"
# (or "http://$(docker-machine ip):8080" if using docker-machine)
version: '3'
services:
mediawiki:
image: mediawiki
restart: always
ports:
- 8080:80
links:
- database
volumes:
- images:/var/www/html/images
# After initial setup, download LocalSettings.php to the same directory as
# this yaml and uncomment the following line and use compose to restart
# the mediawiki service
# - ./LocalSettings.php:/var/www/html/LocalSettings.php
# This key also defines the name of the database host used during setup instead of the default "localhost"
database:
image: mariadb
restart: always
environment:
# @see https://phabricator.wikimedia.org/source/mediawiki/browse/master/includes/DefaultSettings.php
MYSQL_DATABASE: my_wiki
MYSQL_USER: wikiuser
MYSQL_PASSWORD: example
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
volumes:
- db:/var/lib/mysql
volumes:
images:
db:
Alle mit einer Raute „#“ auskommentierten Zeilen werden vom System ignoriert, dienen also zur Beschreibung. Wir sehen zu Beginn den Eintrag „services“ – dieser dient zur Beschreibung der einzelnen Images – wir haben in diesem Beispiel zwei Images – „mediawiki“ und „database„. Die Services geben den Images grob gesagt nur Namen, mit denen wir etwas anfangen können – für „mediawiki“ wird von DockerHub das Image „mediawiki“ heruntergeladen und eingerichtet, für „database“ das Image „mariadb„.
„restart“ zeigt Docker wie und wann Docker das Image starten soll, „always“ heißt nichts anderes als, Docker soll das System automatisch beim Start des Hosts (des Wirtes) starten, gibt es Probleme mit dem Gast, soll Docker das Image wieder neu starten.
Mit „ports“ geben wir die Ports an, über die das Image über den Webbrowser erreicht werden soll – vorne steht der Port, über den wir die Software im Webbrowser erreichen wollen, dahinter der Port im Image. „links“ ist eine sehr einfache Definition für das Netzwerk, über das die beiden Images kommunizieren – in diesem Fall nennt sich das Netzwerk „database„.
Als letzten Eintrag finden wir bei jedem Service den Eintrag „volumes“ – dies sind nun die mit dem Wirt geteilten Verzeichnisse. Wir können hier eines oder auch mehrere Verzeichnisse angeben. Als letzte Konfiguration in der Datei zeigt sich hier noch einmal der Eintrag „volumes“ – hier müssen alle Volumes – besser gesagt, deren Bezeichnungen noch einmal angegeben werden.
Wichtig:
Bei der Konfigurationsdatei wird das YML-Format (YAML) genutzt – dies ist ein wenig gemein – man nutzt hier für Einrückungen nicht den Tabulator, sondern tatsächlich zwei Leerzeichen – alles andere funktioniert bei YML absolut nicht.
Volumes einrichten
Wir sehen im Original der Einrichtungsdatei oben bereits zwei Volumes:
volumes:
- images:/var/www/html/images
# After initial setup, download LocalSettings.php to the same directory as
# this yaml and uncomment the following line and use compose to restart
# the mediawiki service
# - ./LocalSettings.php:/var/www/html/LocalSettings.php
Und:
volumes:
- db:/var/lib/mysql
Im ersten Volume wird das im Gast liegende Verzeichnis „images“ mit dem Host geteilt – alle anderen Zeilen sind nur Beschreibungen. Sehen wir uns diese Zeile etwas genauer an:
- images:/var/www/html/images
Vor jeder Volume hat sich ein Bindestrich zu zeigen „–„, anschließend folgt nach einem Leerzeichen das Verzeichnis, das geteilt werden soll. Sie dürfen hier keinen Pfad angeben – nur das eindeutige Verzeichnis. In diesem Fall liegt das Verzeichnis „images“ im Wirt unter „/var/www/html/images“ – angegeben darf jedoch nur wie schon beschrieben „images“ werden.
Das zweite Volume ist nun ganz einfach „db“ – hiermit werden alle Dateien in der Datenbank des Images „mariadb“ mit dem Host (Wirt) geteilt.
Im Beispiel des Originals wird nur das Verzeichnis „images“ geteilt – ich möchte jedoch das komplette HTML-Verzeichnis teilen, dieses liegt anschließend wie schon beschrieben direkt am Host. Dafür lasse ich das Verzeichnis „images“ weg – dieses liegt ja direkt im Verzeichnis „html„.
Die komplette Konfigurationsdatei sieht in meinem Beispiel dann so aus (ohne Beschreibungen):
version: '3'
services:
mediawiki:
image: mediawiki
restart: always
ports:
- 8080:80
links:
- database
volumes:
- html:/var/www/html/
database:
image: mariadb
restart: always
environment:
MYSQL_DATABASE: my_wiki
MYSQL_USER: wikiuser
MYSQL_PASSWORD: example
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
volumes:
- db:/var/lib/mysql
volumes:
html:
db:
Jetzt lässt sich aus der Konfigurationsdatei „docker-compose.yml“ das originale Docker-Image, das angepasste zaubern – natürlich mit administrativen Rechten am Terminal im Verzeichnis mit der Datei:
docker-compose up -d
Die mit dem Host geteilten Verzeichnisse liegen anschließend auf dem Host unter „/var/lib/docker/volumes/“ – dieses Verzeichnis ist natürlich nur mit administrativen Rechten zugänglich.
14 Reaktionen
[…] Docker – Anwendungen und Systeme unter Linux virtualisieren / isolieren […]
[…] Docker kennen viele, Podman weniger – nutzen tun die beiden Virtualisierungslösungen noch weniger, es ist für Einsteiger einfach zu umständlich, zu kompliziert. Man muss eben etwas Zeit aufbringen, um damit anständig arbeiten zu können, vor allem muss man sich damit beschäftigen, wie es funktioniert. […]
[…] haben wir uns auf der Linux Bibel nur auf dem Terminal basierende Anwendungen mittels Docker angesehen – wir haben also Docker installiert und darin textbasierte Anwendungen installiert […]
[…] Docker wird auch im Privaten immer reizvoller, lassen sich doch so schnell und einfach Anwendungen aus anderen Linux-Distributionen nutzen – wie etwa unter Distrobox – Erleichterungen für Docker und Podman beschrieben. […]
[…] Unter Docker haben wir uns die Grundlagen angesehen, wie wir mit dieser einfachen Möglichkeit professionell und ohne viel Last andere Linux-Distributionen virtualisieren. […]
[…] absolut kostenlos. Im Beispiel werden wir Focalboard ganz einfach in wenigen Minuten über Docker installieren – haben Sie Docker (wie im Link zuvor beschrieben) installiert, dauert es keine […]
[…] und größere Betriebe geeignet – in diesem Fall werden wir das ERP ganz einfach via Docker installieren. In diesem Fall ohne HTTPS – dies können Sie etwa via freier Software HaProxy […]
[…] gibt mehrere Varianten NocoDB unter Linux zu installieren – Docker oder eine binäre Datei, die es einfach nur auszuführen gilt. Eine Beschreibung für alle […]
[…] Docker erstellen und verwalten Sie Container unter Linux. Durch Docker lassen sich nicht nur […]
[…] Sie die Software erst einmal einfach nur testen, empfehle ich die Installation via Docker – eine Anleitung dazu finden Sie […]
[…] bin dabei, AfterShot in Docker zu installieren, die Installation klappt inzwischen, die Ausführung noch nicht ganz. Den Rest […]
[…] Nebenbei finden sich weiters der Webserver Apache, das professionelle Monitoring-Werkzeug Zabbix, Docker, Git, IpTraf-NG und zahlreiche weitere Anwendungen an […]
[…] Blick auf BlendOS oder Vanilla OS geworfen – immutable Linux-Distributionen, die über Docker Pakete aus anderen Linux-Distributionen installieren lassen. Dies ist im Grunde keine neue Idee […]
[…] Oberfläche unter Linux nutzen, die Software nennt sich Open WebUI. Zur Installation nutzen Sie Docker oder Podman. Ollama installieren Sie wie am ersten Link und lassen es via Systemd […]