Linux bietet mit chroot bereits ein mächtiges Tool, um das Rootverzeihnis umzuhängen, wenn man einmal andere Komponenten testen möchte. Doch um ein komplett anderes System zum laufen zu bekommen braucht es weit mehr. Bisher hat man immer eine virtuelle Maschine (VM) dazu verwendet. Der Nachteil dabei ist, dass man ein komplettes Betriebssystem im Rucksack mitschleppen muss. Der Unterschied von VM zu dem containerbasierten System Docker ist, dass Anwendungen als eigene isolierte Prozesse im User-Space mit einer eigenen Umgebung gestartet werden und sich im endeffekt nur den Kernel teilen. Damit die einzelnen Prozesse gut getrennt werden können, wurden CGroups eingeführt, die die HW Ressourcen für Prozesse begrenzen und Kernel-Namespaces, die den Zugriff der Prozesse auf Kernelfunktionen beschränken, wie zum Beispiel PIDs, Netzwerk, Interprozesskommunikation (IPC). Für solche containerbasierten Lösungen ist Docker das bekannteste System.
Damit ich docker testen kann, hab ich diese Installation verwendet. Zum Installieren von Docker wird das ausgeführt:
- sudo apt install docker.io
Nach der Installation sollte der Docker daemon laufen. Starten und testen
- sudo systemctl enable docker
- sudo systemctl start docker
- sudo systemctl status docker
In WSL konnte ich den docker deamon nicht starten. So hab ich das einfach händisch gemacht durch: sudo dockerd &
Ein erster Docker Test:
- sudo docker run hello-world
Da sich das hello-world image nicht lokal befindet, wird es aus dem Docker Hub, einer Docker Cloud geholt und erstellt. Hier muss man zwischen Images und Containern unterscheiden. Ein Image ist lediglich eine Textdatei, die beschreibt, wie eim Container zusammen gestellt werden soll. Ein Container ist dann das Resultat aus dem Image. Alternativ kann aber ein Container auch über commits erstellt werden. Ein Image wird meist als dockerfile Container abgelegt in /var/lib/docker/.
Ein paar wichtige Befehle:
- sudo
docker -help
: zeigt alle befehle - sudo docker pull image : holt image vom docker hub herunter
- sudo docker images : zeigt lokale docker images an
- sudo docker search ubuntu : sucht nach images mit ubuntu
- sudo docker rmi ubuntu : löscht ein image
- sudo docker rm <Container-ID> : löscht einen container
- sudo docker ps -a : zeigt laufende images an mit Container-ID
- sudo docker container ls -a : zeigt verwendete container an mit ID
- sudo docker rm -v <ID> : löscht container
- sudo docker stats : zeigt status
- sudo docker prune : räumt auf
- sudo docker system df : zeigt belegung von docker am host an
- sudo docker run : führt einen container aus
- sudo docker exec image /bin/bash : direkt auf container zugreifen
- sudo docker stop : stoppt inen Container
- sudo docker build : baut einen container aus einem Image
- sudo docker commit <containerID> neuerImageName : speichert die änderung wieder ab unter einem neuen container
- sudo docker export <CONTAINER ID> > /home/ContainerName.tar
- sudo docker import – ContainerName:latest
- sudo docker images –tree : zeigt abhängigkeiten des Containers an
Beispiel für ein Image:
Im folgenden soll ein Image erstellt werden und daraus ein Container. Daz wird ein dockerfile angelegt. In diesem Dockerfile gibt es die folgendne Befehle:
- FROM : bezieht ein Image, das vorher mit pull geholt wurde. Meist ein Betriebssystem. Bei einem eigenen Dockerhub muss hier dann ein kompletter Adresspfad eingegeben werden.
- RUN : beinhaltet einen Linux Befehl der ausgeführt werden soll
- ADD : damit können dateien geladen und überschrieben werden, wie config Dateien
- EXPOSE : bindet den Container an einen bestimmten Port
- ENTRYPOINT : startet einen Prozess im Cotainer, wenn dieser gestartet wird
Zuerst erzeigen wir eine Datei dockerfile in einem eigenen Ordner:
- mkdir mysocker && touch dockerfile
und fügen mit nano in die Datei die folgenden Befehle ein:
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y wget
Damit wird das Docker Image gebaut und bekommt einen Name:
- sudo docker build -t meinimage[:version] .
Beim Erstellen des Containers wird der Container ubuntu heruntergeladen mit pull und taucht auch später in der Liste der images auf.
- sudo docker run -d meinimage
startet nun das Image im hintergrund. Hiermit kommt man in eine Kommandozeile des Containers:
- sudo docker run -t -i meinimage[:version] /bin/bash
- sudo docker run -it -rm meinimage[:version]
und mit exit wieder raus. Sollte man Änderungen an dem Image erstellt haben, so können diese eingecheckt werden mit:
- sudo docker commit -m „text“ containerID image-name
Update:
Für mich hat sich immer die Frage gestellt, wie man mit einem Docker image interagieren kann. Hier hab ich einen Weg für mich gefunden:
- docker pull <dockerimage>[:version]
- docker run -it –name <arbeitsname> <dockerimage>[:version]
- (arbeiten innerhalb des dockerimages)
- exit
- docker start <arbeitsname>
- docker attach <arbeitsname>
- (arbeiten innerhalb des dockerimages)
- exit
Links:
https://alexandernaumov.de/artikel/docker-grundlagen
https://scotch.io/tutorials/getting-started-with-docker
https://tuhrig.de/difference-between-save-and-export-in-docker/
https://hub.docker.com/_/ubuntu
https://itzwieseltal.wordpress.com/2021/10/26/eigenes-linuxsystem-fur-raspberrypi-mit-buildroot-erstellen/
1 Kommentar zu „Docker Einstieg“