Files
mkdocs-etz/mkdocs/docs/bonus/docker-grundlagen.md
2025-12-11 17:31:03 +01:00

261 lines
9.5 KiB
Markdown

# Docker-Grundlagen
## Virtuelle Maschinen (VMs) vs. Container
|Kriterium |Virtuelle Maschine (VM) |Container |
|-------------------|----------------------------------------------|------------------------------------|
|Isolation |Vollständige OS-Isolation (Hardware-Ebene) |Prozess-Isolation (OS-Ebene) |
|Ressourcenverbrauch|Hoch (eigenes OS pro VM) |Gering (teilt Host-OS-Kernel) |
|Startzeit |Minuten |Sekunden |
|Portabilität |Schwerer (große Images) |Leicht (kleine Images) |
|Anwendungsfall |Vollständige Systeme (z. B. Windows auf Linux)|Mikroservices, Web-Apps, Datenbanken|
**Fazit**: Container sind ideal für schnelle, ressourcenschonende Bereitstellung von Anwendungen.
## Docker installieren
[Immer aktuelles Setup anschauen](https://docs.docker.com/engine/install/ubuntu/)
````bash
# Alte Docker-Versionen entfernen
sudo apt removes docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc
# Abhängigkeiten installieren
sudo apt update
sudo apt install -y ca-certificates curl gnupg
# Docker-Repository hinzufügen
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
# Docker installieren
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Docker-Dienst starten und aktivieren
sudo systemctl enable docker
sudo systemctl start docker
# Benutzer zur Docker-Gruppe hinzufügen (für Passwortlosigkeit)
sudo usermod -aG docker $USER
newgrp docker # Aktuelle Shell aktualisieren
````
## Erste Schritte: "Hello World" mit Docker
Fertigen Container ausprobieren:
````bash
docker run hello-world
````
> Ausgabe:
````
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
````
Tatsächlich erklärt der Container selbst was er getan hat.
* ````docker run````: Führt einen Container aus.
* ````hello-world````: Offizielles Test-Image von Docker Hub.
## Eigenes Dockerfile für einen Webserver (Nginx)
### Dockerfile
Erstellen Sie eine Datei namens ````Dockerfile```` mit folgendem Inhalt:
````dockerfile
# Basis-Image: Offizielles Nginx-Image
FROM nginx:latest
# Standard-HTML-Seite ersetzen
COPY index.html /usr/share/nginx/html
# Port 80 freigeben
EXPOSE 80
````
### HTML-Datei bereitstellen
Erstellen Sie eine Datei ````index.html```` im selben Verzeichnis:
````html
<!DOCTYPE html>
<html>
<head>
<title>Meisterkurs IT</title>
</head>
<body>
<h1>Willkommen zum Docker-Webserver!</h1>
<p>Dieser Container läuft auf Port 80.</p>
</body>
</html>
````
###
Image bauen und Container starten
````bash
# Image aus dem Dockerfile bauen
docker build -t mein-nginx .
# Container im Hintergrund starten und Port 8080 des Hosts auf Port 80 des Containers mappen
docker run -d -p 8080:80 --name mein-webserver mein-nginx
````
### Testen
Öffnen Sie einen Browser und rufen Sie ````http://<Ihre-Server-IP>:8080```` auf.
Sie sollten die HTML-Seite sehen.
## Docker Compose für BackupPC
Warum Docker Compose?
* Vereinfacht das Management mehrerer Container
* Definiert alle Dienste in einer YAML-Datei.
### Beispiel: backuppc/docker-compose.yml für BackupPC
compose-Dateien immer in einem Ordner!
````yaml
services:
backuppc:
image: adferrand/backuppc
container_name: backuppc
restart: unless-stopped
ports:
- "8081:80" # Webinterface auf Port 8081
volumes:
- /etc/localtime:/etc/localtime:ro # Uhrzeit vom Host
- /etc/timezone:/etc/timezone:ro # Zeitzone vom Host
- ./etc:/etc/backuppc # Einstellungen
- ./home:/home/backuppc # "Userdata" von backuppc. z.B. ssh-keys
- ./backups:/data/backuppc # Das Backupverzeichnis
environment:
- BACKUPC_WEB_USER=meisterkurs
- BACKUPC_WEB_PASSWORD=passw0rd#
- BACKUPPC_UUID=100
- BACKUPPC_GUID=101
````
### Projekt starten
````bash
# Docker Compose-Projekt starten
docker compose up -d
# Status prüfen
docker compose ps
# Log des Container anzeigen
docker compose logs
````
### Zugriff auf BackupPC
Öffnen Sie ````http://<Ihre-Server-IP>:8081```` im Browser.
Anmeldung mit ````meisterkurs```` und ````passw0rd````.
## Docker-Grundlagenbefehle
### Container-Verwaltung
|Befehl |Beschreibung |
|--------------------------------|-----------------------------------------|
|docker ps |Liste aller laufenden Container anzeigen.|
|docker ps -a |Liste aller Container (auch gestoppte) anzeigen.|
|docker start <Container> |Einen gestoppten Container starten. |
|docker stop <Container> |Einen laufenden Container stoppen. |
|docker restart <Container> |Einen Container neu starten. |
|docker rm <Container> |Einen gestoppten Container entfernen. |
|docker rm -f <Container> |Einen Container erzwingen zu entfernen (auch laufende).|
|docker logs <Container> |Logs eines Containers anzeigen. |
|docker logs -f <Container> |Logs eines Containers live verfolgen. |
|docker exec -it <Container> bash|Eine interaktive Shell im laufenden Container öffnen.|
|docker inspect <Container> |Detaillierte Informationen zu einem Container anzeigen (z. B. IP, Volumes).|
### Image-Verwaltung
|Befehl |Beschreibung |
|------------------------|--------------------------------------------------------------|
|docker images |Liste aller lokalen Images anzeigen. |
|docker pull <Image> |Ein Image von Docker Hub herunterladen. |
|docker rmi <Image> |Ein Image entfernen. |
|docker rmi -f <Image> |Ein Image erzwingen zu entfernen. |
|docker build -t <Name> .|Ein Image aus einem Dockerfile im aktuellen Verzeichnis bauen.|
|docker push <Image> |Ein Image zu Docker Hub oder einer Registry hochladen. |
### Docker Compose-Befehle
|Befehl |Beschreibung |
|--------------------------------|---------------------------------------------------------------------------|
|docker compose up -d |Ein Projekt im Hintergrund starten (Detached-Modus). |
|docker compose up --build |Projekt starten und Images neu bauen (falls Änderungen im Dockerfile). |
|docker compose down |Ein Projekt komplett stoppen und entfernen (Container, Netzwerke, Volumes).|
|docker compose ps |Status aller Container im Projekt anzeigen. |
|docker compose logs |Logs aller Container im Projekt anzeigen. |
|docker compose logs -f |Logs aller Container live verfolgen. |
|docker compose logs <Service> |Logs eines bestimmten Services anzeigen. |
|docker compose restart <Service>|Einen bestimmten Service im Projekt neu starten. |
|docker compose build |Images für alle Services im Projekt neu bauen. |
|docker compose pull |Alle Images für das Projekt neu herunterladen. |
|docker compose config |Die Konfiguration des Projekts validieren (z. B. Syntax prüfen). |
|docker compose top |Prozesse in den Containern des Projekts anzeigen. |
### Volumes und Netzwerke
|Befehl |Beschreibung |
|---------------------------------|----------------------------------------------------------------|
|docker volume ls |Liste aller Docker-Volumes anzeigen. |
|docker volume inspect <Volume> |Details zu einem Volume anzeigen (z. B. Mountpunkt). |
|docker volume rm <Volume> |Ein Volume entfernen. |
|docker network ls |Liste aller Docker-Netzwerke anzeigen. |
|docker network inspect <Netzwerk>|Details zu einem Netzwerk anzeigen (z. B. verbundene Container).|
### Praktische Beispiele:
#### BackupPC-Projekt neu starten
````bash
# Projekt stoppen und entfernen
docker compose down
# Projekt mit neuem Passwort starten
docker compose up -d
````
#### Logs von BackupPC live verfolgen
````bash
docker compose logs -f backuppc
````
#### Shell im BackupPC-Container öffnen
````bash
docker exec -it backuppc bash
````
#### BackupPC-Image neu bauen (nach Änderungen am Dockerfile)
````bash
docker compose build backuppc
docker compose up -d
````
#### Alle Images und Container bereinigen
````bash
# Alle gestoppten Container entfernen
docker container prune
# Alle nicht verwendeten Images entfernen
docker image prune -a
# Alle nicht verwendeten Volumes entfernen
docker volume prune
````
## Inhaltsverzeichnis
[TOC]