548 lines
12 KiB
Markdown
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)
|