add docs
This commit is contained in:
547
docs/03-Container-Management.md
Normal file
547
docs/03-Container-Management.md
Normal file
@@ -0,0 +1,547 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user