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.