Portainer – Docker mit einer Weboberfläche verwalten
Docker auf der Kommandozeile – und eine Alternative
Wer Docker im Alltag betreibt, kennt die üblichen Befehle: docker ps, docker logs, docker compose up. Das funktioniert – ist aber nicht immer komfortabel, besonders wenn mehrere Container, Volumes und Netzwerke gleichzeitig im Blick behalten werden müssen.
Portainer ist eine Web-Oberfläche für Docker. Container starten, stoppen, Logs lesen, Images verwalten, Volumes inspizieren – alles im Browser, ohne Terminal.
💡 Niveau: Einsteigerfreundlich. Ein laufender Docker-Host wird vorausgesetzt.
Was ist Portainer?
Portainer ist eine Open-Source-Verwaltungsoberfläche für Container-Umgebungen. Es unterstützt Docker, Docker Swarm und Kubernetes. Die hier verwendete Edition ist Portainer CE (Community Edition) – kostenlos und für private sowie kleine professionelle Umgebungen vollständig ausreichend.
Portainer bietet unter anderem:
- 📋 Übersicht aller Container, Images, Volumes und Netzwerke
- ▶️ Container starten, stoppen, neu starten, löschen
- 📄 Live-Logs und Container-Statistiken (CPU, RAM, Netzwerk)
- 🖥️ Web-basiertes Terminal direkt in laufende Container
- 📦 Stacks – Docker Compose Deployments direkt aus der UI
- 🔐 Benutzerverwaltung mit Rollen und Berechtigungen
Architektur & Docker-Socket-Zugriff
Das Herzstück von Portainer ist der Zugriff auf den Docker-Socket:
┌─────────────────────────────────────────┐
│ Browser / Web-UI │
│ https://portainer:9443 │
└─────────────────┬───────────────────────┘
│ HTTPS
┌─────────────────▼───────────────────────┐
│ portainer-container │
│ │
│ Web-UI · API · Benutzerverwaltung │
│ │
│ /var/run/docker.sock (mount) │
└─────────────────┬───────────────────────┘
│ Unix Socket
┌─────────────────▼───────────────────────┐
│ Docker Daemon │
│ (läuft auf dem Host) │
└─────────────────────────────────────────┘
Der Docker-Socket /var/run/docker.sock ist die Schnittstelle über die Docker-Befehle an den Daemon weitergegeben werden. Portainer mountet diesen Socket direkt in den Container – und kann damit alles steuern, was Docker auf dem Host kann.
Sicherheitsaspekte des Socket-Mounts
Das ist ein wichtiger Punkt: Ein Container mit Zugriff auf /var/run/docker.sock hat effektiv Root-Rechte auf dem Host. Über den Docker-Socket lassen sich neue Container mit beliebigen Mounts starten – einschließlich des gesamten Host-Dateisystems.
Das bedeutet in der Praxis:
- Portainer sollte nicht öffentlich ohne Authentifizierung erreichbar sein
- Der Zugriff sollte auf vertrauenswürdige Netzwerke oder VPN beschränkt sein
- Ein kompromittierter Portainer-Container bedeutet einen kompromittierten Host
In dieser Konfiguration ist Portainer hinter Traefik mit TLS abgesichert – das ist der richtige Ansatz. Wer Portainer nur im lokalen Netzwerk betreibt, kann auf den Reverse Proxy verzichten und den Port direkt binden.
Vorbereitung
mkdir -p /opt/portainer
cd /opt/portainer
docker-compose.yml
services:
portainer:
container_name: portainer
image: portainer/portainer-ce:lts
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
networks:
- portainer
- proxy
volumes:
portainer_data:
name: portainer_data
networks:
portainer:
name: portainer
driver: bridge
proxy:
name: proxy
driver: bridge
external: true
volumes
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
Zwei Mounts mit grundlegend unterschiedlichem Zweck:
/var/run/docker.sock ist der Docker-Socket – darüber kommuniziert Portainer mit dem Docker-Daemon des Hosts. Ohne diesen Mount wäre Portainer blind.
portainer_data:/data ist ein named Volume für die Portainer-eigene Datenbank: Benutzer, Einstellungen, gespeicherte Stacks und Zugangsdaten. Dieses Volume überlebt Container-Neustarts und Updates.
networks
networks:
portainer:
name: portainer
driver: bridge
proxy:
name: proxy
driver: bridge
external: true
Portainer hängt in zwei Netzwerken: portainer als internes isoliertes Netzwerk und proxy für den Traefik-Zugriff. Das proxy-Netzwerk existiert bereits und wird nur eingebunden (external: true).
image: portainer-ce:lts
Das Tag lts (Long Term Support) ist für produktive Umgebungen die richtige Wahl – stabilere Versionszyklen, längerer Support-Zeitraum. Alternativ steht latest für die aktuellste Version zur Verfügung.
Start
docker compose up -d
# Logs prüfen
docker compose logs -f portainer
Portainer ist nach dem Start unter https://portainer.docker.example.com (mit Traefik) oder direkt über https://server-ip:9443 erreichbar.
Beim ersten Aufruf wird ein Admin-Passwort gesetzt – dieser Schritt muss innerhalb weniger Minuten nach dem Start erfolgen, andernfalls sperrt Portainer den Erstzugang aus Sicherheitsgründen. In diesem Fall hilft ein Container-Neustart:
docker compose restart portainer
Ohne Traefik – direkter Port-Zugriff
Wer keinen Reverse Proxy betreibt, kann die Ports direkt freigeben:
services:
portainer:
container_name: portainer
image: portainer/portainer-ce:lts
restart: always
ports:
- "9443:9443" # HTTPS Web-UI
- "8000:8000" # Edge Agent (optional, kann entfernt werden)
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
volumes:
portainer_data:
name: portainer_data
Port 8000 wird nur benötigt, wenn Portainer Edge Agents für die Verwaltung entfernter Docker-Hosts eingesetzt werden. Für eine einzelne lokale Instanz kann er entfernt werden.
Updates & Wartung
# Neues Image holen und Container neu starten
docker compose pull
docker compose up -d
# Portainer-Daten sichern (Volume)
docker run --rm \
-v portainer_data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/portainer_backup_$(date +%Y%m%d).tar.gz /data
Da alle Einstellungen im portainer_data-Volume liegen, gehen bei einem Update keine Konfigurationen verloren.
Fazit
Portainer senkt die Einstiegshürde in Docker-Umgebungen erheblich. Logs lesen, Container neu starten, Stacks deployen – alles ohne Terminal. Der Docker-Socket-Zugriff ist dabei kein Makel, sondern eine bewusste architektonische Entscheidung: mit dem Wissen, was dieser Zugriff bedeutet, lässt er sich sicher einsetzen.