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.

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.

Schreibe einen Kommentar

11 Reaktionen

Neue Themen im Forum
[gelöst]Ubuntu 24.04 ab 28.04.24Mir ist nicht bekannt das bei Ubuntu die Schritte alle zwei Jahre … Weiterlesen
ddterm - Another Drop Down Termin …gerade gefunden und installiert, finde ich praktisch: https://g … Weiterlesen
GImageReader Texterkennung Grafis …Ein sehr gutes Programm, das ich häufig benütze, wenn ich aus Bild … Weiterlesen
Kategorien im Wiki
WIKI-Beiträge des Monates

Die Beiträge des Monates finden Sie im Kalender unter den blau markierten Tageszahlen.

September 2023
M D M D F S S
 123
45678910
11121314151617
18192021222324
252627282930  
Archive