Tutorial 6: Container, Docker, Podman

ASE WS 2023/24

In diesem Tutorial werden wir:

Achtung: Dieses Dokument unterstützt lediglich die Übung und ist keine vollständige Anleitung

Setup

Wir arbeiten dieses Mal mit einer lokalen Docker/Podman-Installation

Wichtig: auf segfault.net kann man Docker nur als normaler User (sudo - user) mit udocker starten. Das funktioniert aber dann auch nicht.

Deshalb arbeiten wir über das VPN auf unserem Server rinfmi2.ur.de. Benutzernamen gibt's im Kurs.

Docker und Podman

Docker und Podman sind beides Tools zur Erstellung, Ausführung und Verwaltung von Containern. Sie ermöglichen es, Anwendungen und deren Abhängigkeiten in isolierten Umgebungen auszuführen, ohne dass sie sich gegenseitig beeinflussen.

Docker

Docker ist das am weitesten verbreitete Container-Management-System. Es nutzt eine daemonbasierte Architektur, bei der der Docker-Daemon auf dem Host-System läuft und die Container verwaltet. Docker erfordert Root-Rechte, um den Daemon auszuführen.

Die einfachste Art, Docker unter Windows und macOS zu installieren, ist Docker Desktop

Unter Linux: Installation über Paketmanager (apt install docker.io)

Podman

Podman ist ein neueres, von Redhat entwickeltes Tool, das eine ähnliche Funktionalität wie Docker bietet, aber ohne die Verwendung eines Daemons auskommt. Es ermöglicht es, Container als normale Benutzer auszuführen und erfordert keine Root-Rechte.

Installation auf verschiedenen Betriebssystemen am einfachsten über Podman Desktop oder:

Podman speichert Images und Container-Konfiguration im Verzeichnis /var/lib/containers wenn es als Root gestartet wird. Für normale User landen die Images unter $HOME/. local/share/containers/storage/ (spezifiziert durch Open Container Initiative (OCI)).

Aufgabe 1 - Container starten

Tipp 1: in allen Beispielen kann man docker auch durch podman ersetzen

Tipp 2: statt Debian kann man auch das sehr kleine alpine Docker-Image verwenden.

Ein Dockerfile erlaubt es, ein eigenes Image zu generieren und diesem Dateien und Befehle hinzuzufügen:

# Use the official Debian image as the base image
FROM debian:latest

# Update the package list and install additional packages
RUN apt update && apt install -y cowsay

# Add any necessary files or scripts
COPY app/entrypoint.sh /entrypoint.sh

# Set the working directory
WORKDIR / 

# Set the entrypoint that will be run when the container starts
ENTRYPOINT ["/entrypoint.sh"]

Das Script app/entrypoint.sh enthält z.B. folgendes:

#!/bin/bash

while [[ 1 ]]; do
    /usr/games/cowsay "HELLO!"
    sleep 2
done

Wichtig: das Script muss ausführbar sein (chmod +x entrypoint.sh)

Mittels docker build -t my_image . erzeugt man aus der Datei Dockerfile ein Image

Tipp: Unser Image gibt auf stdout jetzt kontinuierlich die “HELLO”-sagende Kuh aus. Um die Ausgabe eines laufenden Containers zu sehen: docker logs -f <container id>

Dockerfile-Referenz

Aufgabe 2

Erstellen eine Dockerfile, das einen simplen Webserver startet:

Tipp: damit man vom Host aus auf den Webserver im Container zugreifen kann, muss man die Container-Ports auf Host-Ports mappen (`-p 8123:8000`)

Tipp: ADD vs COPY

docker-compose

docker-compose verwendet die Spezifikation in einer YAML-Datei um mehrere Container gemeinsam zu konfigurieren und zu administrieren.

Achtung: in aktuelleren Docker-Versionen ist docker-compose schon als Subbefehl integriert. Bei älteren Versionen muss man docker-compose anstelle von docker compose verwenden

Beispiel-Konfiguration: WikiBase Docker images

Aufgabe 3

Erstelle eine Datei docker-compose.yml, die den Server aus Aufgabe 2 baut, startet und auf Port 1234 des Hosts antworten lässt.

Docker-Integration in Gitlab und GitHub