261 lines
9.5 KiB
Markdown
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]
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|