# 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**: ```bash # 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**: ```bash # 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**: ```bash # 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**: ```yaml 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**: ```yaml - 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**: ```yaml - 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**: ```yaml container_status: nginx-mailcow: true mysql-mailcow: true postfix-mailcow: false # nicht laufend ``` **Verwendung**: ```yaml - 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**: ```yaml - 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`: ```yaml use_docker_image_mirror: true docker_mirror_location: "SC" # oder "tinc" docker_install_source: "official" ``` **Abhängigkeiten** (`requirements.yml`): ```yaml collections: - name: community.docker version: "3.11.0" ``` **Installation**: ```bash 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](04-Mail-Server-Verwaltung.md#use-docker-image-proxyyaml) **Vorteile**: - Reduzierte Bandbreitennutzung - Schnellere Image-Downloads - Caching häufig genutzter Images - Rate-Limit-Vermeidung bei Docker Hub **Konfiguration in group_vars/all.yml**: ```yaml # 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: ```bash # 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: ```bash 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: ```yaml # 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: ```bash # 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: ```bash # 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: ```bash curl -fsSL https://download.docker.com/linux/debian/gpg ``` 3. Verwenden Sie tinc-Mirror als Alternative: ```bash -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: ```bash 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: ```bash docker volume ls docker volume prune ``` 2. Überprüfen Sie Build-Cache: ```bash docker builder prune -a ``` 3. Manuelle vollständige Bereinigung: ```bash docker system prune -a --volumes ``` ### Problem: Docker-Daemon startet nicht **Symptome**: `systemctl status docker` zeigt Failed **Lösung**: 1. Überprüfen Sie Logs: ```bash journalctl -u docker.service -n 50 ``` 2. Überprüfen Sie Daemon-Konfiguration: ```bash cat /etc/docker/daemon.json ``` 3. Starten Sie Daemon neu: ```bash 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: ```bash cd /opt/mailcow-dockerized docker-compose config ``` 2. Überprüfen Sie ob Docker-Compose installiert ist: ```bash docker-compose --version ``` --- ## Externe Abhängigkeiten ### Community Docker Collection **Installation**: ```bash ansible-galaxy collection install community.docker:3.11.0 ``` **Dokumentation**: - https://docs.ansible.com/ansible/latest/collections/community/docker/ - https://galaxy.ansible.com/community/docker **Verwendete Module**: - `community.docker.docker_image` - `community.docker.docker_container` - `community.docker.docker_prune` - `community.docker.docker_compose` --- ## Nützliche Kommandos ### Docker-Informationen abrufen ```bash # 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 ```bash # 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](02-Monitoring.md) | [Nächstes: Mail-Server-Verwaltung →](04-Mail-Server-Verwaltung.md)