Files
operating-automation/docs/03-Container-Management.md
Ansible Servercow da81549161 add docs
2026-06-11 18:04:41 +02:00

12 KiB

Container-Management

Übersicht

Diese Kategorie umfasst alle Playbooks und Rollen zur Docker-Container-Verwaltung, einschließlich Installation, Konfiguration, Bereinigung und Wartung.

Anwendungsfälle:

  • Docker-Installation auf neuen Hosts
  • Bereinigung ungenutzter Container und Images
  • Verwaltung von Docker-Daemons
  • Konfiguration von Image-Proxy/Mirror für schnellere Pulls
  • Status-Überprüfung von Docker-Compose-Stacks

Playbooks

docker/install-docker.yml

Installation und Konfiguration von Docker aus offizieller Quelle.

Datei: playbooks/docker/install-docker.yml

Zweck: Installiert Docker Engine von der offiziellen Docker-Repository auf Debian-basierten Systemen.

Ziel-Hosts: all

Benutzer: tincadmin (mit sudo-Rechten)

Verwendete Rollen:

  • system (Task: install-docker.yaml)

Wichtige Variablen:

Variable Default Beschreibung
docker_install_source "official" Installationsquelle (official/tinc)

Verwendungsbeispiel:

# Docker von offizieller Quelle installieren
ansible-playbook playbooks/docker/install-docker.yml \
  -i inventories/icp-fra-pve1.yml \
  -K

# Mit tinc-Mirror (schneller in internem Netzwerk)
ansible-playbook playbooks/docker/install-docker.yml \
  -i inventories/icp-fra-pve1.yml \
  -e "docker_install_source=tinc" \
  -K

# Auf einzelnem Host
ansible-playbook playbooks/docker/install-docker.yml \
  -i inventories/icp-fra-pve1.yml \
  --limit newhost.example.com \
  -K

Abhängigkeiten:

  • system Rolle
  • Internet-Zugriff oder tinc-Mirror-Zugriff
  • APT-Paketmanager

Besonderheiten:

  • Verwendet offizielle Docker-Registry standardmäßig
  • Installiert Docker CE (Community Edition)
  • Konfiguriert Docker-Daemon automatisch
  • Aktiviert Docker-Service beim Systemstart

Workflow:

  1. Fügt Docker GPG-Key hinzu
  2. Konfiguriert Docker APT-Repository
  3. Aktualisiert APT-Cache
  4. Installiert Docker CE
  5. Startet und aktiviert Docker-Service

docker/cleanup-images.yml

Bereinigung ungenutzter Docker-Images.

Datei: playbooks/docker/cleanup-images.yml

Zweck: Entfernt ungenutzte Docker-Images um Festplattenspeicher freizugeben.

Ziel-Hosts: all

Benutzer: tincadmin (mit sudo-Rechten)

Verwendete Rollen:

  • docker (Tasks: get-containerstatus, cleanup-images)

Wichtige Variablen:

Variable Default Beschreibung
docker_compose_path /opt/mailcow-dockerized Pfad zum Docker-Compose-Projekt

Verwendungsbeispiel:

# Cleanup für alle Hosts
ansible-playbook playbooks/docker/cleanup-images.yml \
  -i inventories/icp-fra-pve1.yml \
  -K

# Mit custom Compose-Pfad
ansible-playbook playbooks/docker/cleanup-images.yml \
  -i inventories/extern.yml \
  -e "docker_compose_path=/opt/my-app" \
  -K

# Nur auf spezifischem Host
ansible-playbook playbooks/docker/cleanup-images.yml \
  -i inventories/icp-fra-pve1.yml \
  --limit mail-server-01.example.com \
  -K

Abhängigkeiten:

  • Docker-Installation
  • Docker-Compose (falls Compose-Projekt)

Besonderheiten:

  • Statischer Mailcow-Pfad - Standard ist /opt/mailcow-dockerized
  • Entfernt nur ungenutzte Images (keine aktiven Container betroffen)
  • Prüft Container-Status vor Cleanup

Workflow:

  1. Überprüft Status aller Container im Compose-Projekt
  2. Identifiziert ungenutzte Images
  3. Entfernt ungenutzte Images
  4. Gibt Speicherplatz frei

⚠️ Hinweis: Stopped Container und deren Images werden nicht entfernt. Nur vollständig ungenutzte Images.


docker/cleanup-all.yml

Vollständige Docker-Bereinigung (Container, Images, Volumes, Networks).

Datei: playbooks/docker/cleanup-all.yml

Zweck: Umfassende Bereinigung von Docker-Ressourcen auf Mailcow-Hosts, nur wenn alle Container laufen.

Ziel-Hosts: all (mit Mailcow)

Benutzer: tincadmin (mit sudo-Rechten)

Verwendete Rollen:

  • managed-mailcow (Task: find-mailcow-composedir)
  • docker (Tasks: get-containerstatus, cleanup-all)

Wichtige Variablen:

Variable Beschreibung
docker_compose_path Wird dynamisch aus Mailcow-Directory ermittelt

Verwendungsbeispiel:

# Vollständiges Cleanup auf Mailcow-Hosts
ansible-playbook playbooks/docker/cleanup-all.yml \
  -i inventories/extern.yml \
  -K

# Mit Debug-Ausgabe
ansible-playbook playbooks/docker/cleanup-all.yml \
  -i inventories/icp-fra-pve1.yml \
  -v \
  -K

Abhängigkeiten:

  • Vorhandene Mailcow-Installation
  • Alle Container müssen laufen (Sicherheitsbedingung)

Besonderheiten:

  • Conditional Cleanup: Nur wenn alle Container aktiv sind
  • Bedingung: not 'false' in container_status.values()
  • Dynamische Pfaderkennung über managed-mailcow Rolle
  • Entfernt:
    • Stopped Container
    • Ungenutzte Images
    • Ungenutzte Volumes
    • Ungenutzte Networks

Workflow:

  1. Findet Mailcow-Compose-Directory
  2. Prüft Status aller Container
  3. Abbruch wenn Container nicht laufen
  4. Führt vollständiges Cleanup durch:
    • docker system prune -a
    • docker volume prune
    • docker network prune

⚠️ Warnung: Dieses Playbook ist aggressiv und entfernt alle ungenutzten Ressourcen. Verwenden Sie es nur, wenn Sie sicher sind, dass alle gewünschten Container laufen.


Rollen

Rolle: docker

Zweck: Verwaltung von Docker-Containern, Images und Daemon-Konfiguration.

Pfad: roles/docker/

Hauptaufgaben:

1. install-docker.yml

Installiert Docker von offiziellem Repo oder tinc-Mirror.

Funktionen:

  • Fügt Docker GPG-Signatur-Key hinzu
  • Konfiguriert Docker APT-Repository
  • Installiert Docker CE, CLI und containerd
  • Konfiguriert Docker-Daemon mit Proxy (optional)

Variablen:

docker_install_source: "official"  # oder "tinc"

2. cleanup-images.yml

Entfernt ungenutzte Docker-Images.

Funktionen:

  • Verwendet docker image prune -a
  • Bereinigt dangling Images
  • Gibt Speicherplatz frei

Verwendung:

- include_role:
    name: docker
    tasks_from: cleanup-images.yml

3. cleanup-all.yml

Vollständige Bereinigung aller Docker-Ressourcen.

Funktionen:

  • Entfernt stopped Container
  • Löscht ungenutzte Images
  • Bereinigt Volumes
  • Entfernt ungenutzte Networks

Verwendung:

- include_role:
    name: docker
    tasks_from: cleanup-all.yml

4. get-containerstatus.yml

Prüft Status von Docker-Compose-Containern.

Funktionen:

  • Liest docker-compose ps
  • Erstellt Status-Dictionary
  • Prüft ob Container running sind

Ausgabe:

container_status:
  nginx-mailcow: true
  mysql-mailcow: true
  postfix-mailcow: false  # nicht laufend

Verwendung:

- include_role:
    name: docker
    tasks_from: get-containerstatus.yml
  vars:
    docker_compose_path: /opt/mailcow-dockerized

5. restart-daemon.yml

Startet Docker-Daemon neu.

Funktionen:

  • Reload systemd
  • Restart Docker-Service
  • Wartet auf Verfügbarkeit

Verwendung:

- include_role:
    name: docker
    tasks_from: restart-daemon.yml

Standard-Variablen:

Die Rolle selbst hat keine defaults/main.yml, aber verwendet Variablen aus group_vars/all.yml:

use_docker_image_mirror: true
docker_mirror_location: "SC"  # oder "tinc"
docker_install_source: "official"

Abhängigkeiten (requirements.yml):

collections:
  - name: community.docker
    version: "3.11.0"

Installation:

ansible-galaxy collection install -r roles/docker/requirements.yml

Docker-Image-Proxy/Mirror

Konfiguration

Für schnellere Docker-Pulls in internen Netzwerken kann ein Image-Proxy konfiguriert werden.

Siehe auch: Mail-Server-Verwaltung → use-docker-image-proxy.yaml

Vorteile:

  • Reduzierte Bandbreitennutzung
  • Schnellere Image-Downloads
  • Caching häufig genutzter Images
  • Rate-Limit-Vermeidung bei Docker Hub

Konfiguration in group_vars/all.yml:

# Docker Mirror Configuration
use_docker_image_mirror: true
docker_mirror_location: "SC"  # ServerCow Mirror

# Proxy Settings
docker_proxy_host: "dim.servercow.com"
docker_proxy_port: 3128

Best Practices

1. Regelmäßiges Cleanup

Führen Sie wöchentliches Image-Cleanup durch:

# Jeden Sonntag via Cron
0 2 * * 0 ansible-playbook /path/to/playbooks/docker/cleanup-images.yml \
  -i /path/to/inventories/all.yml

2. Vor Major-Updates

Cleanup vor großen Updates für Speicherplatz:

ansible-playbook playbooks/docker/cleanup-all.yml \
  -i inventories/icp-fra-pve1.yml \
  -K

3. Image-Mirror verwenden

Nutzen Sie interne Mirrors für schnellere Pulls:

# In group_vars/all.yml
use_docker_image_mirror: true
docker_mirror_location: "tinc"

4. Container-Status überwachen

Vor Cleanup immer Container-Status prüfen:

# Manuell auf Host
docker ps -a
docker-compose ps

# Via Ansible
ansible all -i inventories/icp-fra-pve1.yml \
  -m shell -a "docker ps --format '{{.Names}}: {{.Status}}'"

5. Speicherplatz-Monitoring

Überwachen Sie Docker-Speicherverbrauch:

# Auf Host
docker system df

# Via Ansible
ansible all -i inventories/icp-fra-pve1.yml \
  -m shell -a "docker system df"

Fehlerbehebung

Problem: Docker-Installation schlägt fehl

Symptome: APT kann Docker-Repository nicht erreichen

Lösung:

  1. Überprüfen Sie Internet-Verbindung
  2. Testen Sie Repository-Erreichbarkeit:
    curl -fsSL https://download.docker.com/linux/debian/gpg
    
  3. Verwenden Sie tinc-Mirror als Alternative:
    -e "docker_install_source=tinc"
    

Problem: Cleanup entfernt benötigte Images

Symptome: Nach Cleanup fehlen Images für laufende Container

Lösung:

  • Dies sollte nicht passieren, da cleanup-all.yml nur bei laufenden Containern ausgeführt wird
  • Restore aus Backup oder re-pull Images:
    cd /opt/mailcow-dockerized
    docker-compose pull
    docker-compose up -d
    

Problem: Kein Speicherplatz freigegeben

Symptome: docker system df zeigt immer noch hohe Nutzung

Lösung:

  1. Überprüfen Sie Volumes:
    docker volume ls
    docker volume prune
    
  2. Überprüfen Sie Build-Cache:
    docker builder prune -a
    
  3. Manuelle vollständige Bereinigung:
    docker system prune -a --volumes
    

Problem: Docker-Daemon startet nicht

Symptome: systemctl status docker zeigt Failed

Lösung:

  1. Überprüfen Sie Logs:
    journalctl -u docker.service -n 50
    
  2. Überprüfen Sie Daemon-Konfiguration:
    cat /etc/docker/daemon.json
    
  3. Starten Sie Daemon neu:
    systemctl restart docker
    

Problem: Container-Status-Prüfung fehlgeschlagen

Symptome: get-containerstatus Task schlägt fehl

Lösung:

  1. Überprüfen Sie docker-compose.yml:
    cd /opt/mailcow-dockerized
    docker-compose config
    
  2. Überprüfen Sie ob Docker-Compose installiert ist:
    docker-compose --version
    

Externe Abhängigkeiten

Community Docker Collection

Installation:

ansible-galaxy collection install community.docker:3.11.0

Dokumentation:

Verwendete Module:

  • community.docker.docker_image
  • community.docker.docker_container
  • community.docker.docker_prune
  • community.docker.docker_compose

Nützliche Kommandos

Docker-Informationen abrufen

# Speichernutzung
ansible all -i inventories/icp-fra-pve1.yml \
  -m shell -a "docker system df -v" \
  -b

# Laufende Container
ansible all -i inventories/icp-fra-pve1.yml \
  -m shell -a "docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}'" \
  -b

# Docker-Version
ansible all -i inventories/icp-fra-pve1.yml \
  -m shell -a "docker version --format '{{.Server.Version}}'" \
  -b

Manuelle Bereinigung

# Auf spezifischem Host
ssh tincadmin@host.example.com
sudo docker system prune -a --volumes
sudo docker image ls
sudo docker volume ls

Navigation: ← Zurück: Monitoring | Nächstes: Mail-Server-Verwaltung →