# 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
````











