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

548 lines
12 KiB
Markdown

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