Docker in Proxmox LXC Container: Einrichtung und Best Practices

Docker in einem Proxmox LXC Container statt in einer VM spart Ressourcen. So richten Sie es richtig ein — inkl. Nesting, AppArmor und Compose.

Docker in einer vollständigen VM laufen zu lassen funktioniert, verschenkt aber die Vorteile von Proxmox. Ein LXC Container braucht keinen eigenen Kernel und startet in Sekunden statt Minuten. Docker darin zu betreiben kombiniert das Beste aus beiden Welten: leichtgewichtige Proxmox-Container mit dem Docker-Ökosystem.

Es gibt dabei ein paar Stolpersteine. Diese Anleitung zeigt, wie Sie Docker in einem Proxmox VE 9 LXC Container sauber einrichten.

Schritt 1: LXC Container erstellen

Der Container braucht spezielle Features, damit Docker funktioniert:

pct create 200 local:vztmpl/ubuntu-24.04-standard_24.04-2_amd64.tar.zst \
  --hostname docker-host \
  --cores 2 \
  --memory 2048 \
  --swap 1024 \
  --rootfs local-lvm:30 \
  --net0 name=eth0,bridge=vmbr0,ip=dhcp \
  --unprivileged 1 \
  --features nesting=1,keyctl=1 \
  --start 1

Warum diese Parameter?

  • nesting=1 — Erlaubt verschachtelte Container (Docker erstellt eigene Namespaces)
  • keyctl=1 — Wird von Docker für Overlay-Dateisysteme benötigt
  • unprivileged 1 — Sicherheit: Container hat keine Root-Rechte auf dem Host
  • 30 GB Disk — Docker-Images brauchen Platz, 8 GB werden schnell knapp

Schritt 2: Docker installieren

Im Container:

# In den Container wechseln
pct enter 200

# System aktualisieren
apt update && apt upgrade -y

# Docker-Repository einrichten
apt install -y ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
  https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" \
  > /etc/apt/sources.list.d/docker.list

# Docker installieren
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Prüfen
docker run --rm hello-world

Häufige Fehler und Lösungen

Fehler: AppArmor "docker-default" Profil

AppArmor enabled on system but the docker-default profile could not be loaded

Lösung: In der Proxmox-Host-Konsole (nicht im Container):

# Container stoppen
pct stop 200

# AppArmor-Profil anpassen
echo "lxc.apparmor.profile = unconfined" >> /etc/pve/lxc/200.conf

# Container starten
pct start 200

Hinweis: apparmor.profile = unconfined reduziert die Isolation. Für Produktivsysteme sollten Sie stattdessen einen privilegierten Container verwenden oder ein eigenes AppArmor-Profil erstellen.

Fehler: Overlay-Dateisystem nicht verfügbar

failed to register layer: Error processing tar file

Lösung: Prüfen Sie, ob keyctl aktiviert ist:

# Auf dem Proxmox-Host
pct config 200 | grep features
# Sollte enthalten: keyctl=1,nesting=1

Fehler: Bridge-Netzwerk funktioniert nicht

Docker-Container im LXC können standardmäßig das Docker-Bridge-Netzwerk nutzen. Falls Probleme auftreten:

# Im Container: IP-Forwarding aktivieren
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

Docker Compose Beispiel

Ein typisches Setup mit Nginx Reverse Proxy und einer Webanwendung:

# docker-compose.yml
services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    restart: unless-stopped

  app:
    image: your-app:latest
    expose:
      - "3000"
    environment:
      - NODE_ENV=production
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD_FILE=/run/secrets/db_password
    restart: unless-stopped

volumes:
  db_data:
# Starten
docker compose up -d

# Logs prüfen
docker compose logs -f

# Status
docker compose ps
Server-Administration von Binary System Services

Best Practices

Ressourcen begrenzen

Docker-Container im LXC teilen sich die zugewiesenen Ressourcen. Begrenzen Sie einzelne Services:

services:
  app:
    image: your-app:latest
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '1.0'

Volumes statt Bind Mounts

Verwenden Sie Docker Volumes statt Bind Mounts für persistente Daten. Volumes werden von Docker verwaltet und sind einfacher zu sichern:

# Volume erstellen
docker volume create app_data

# Backup eines Volumes
docker run --rm -v app_data:/data -v /backup:/backup alpine \
  tar czf /backup/app_data_backup.tar.gz -C /data .

Automatische Updates

Halten Sie Docker-Images aktuell:

# Alle Images aktualisieren
docker compose pull
docker compose up -d

# Unbenutzte Images aufräumen
docker image prune -f

Monitoring

Überwachen Sie den Ressourcenverbrauch:

# Live-Übersicht aller Container
docker stats

# Disk-Verbrauch
docker system df

LXC + Docker vs. VM + Docker

LXC + DockerVM + Docker
RAM-Overhead~50 MB (nur LXC)~500 MB (Kernel + OS)
Startzeit2-3 Sekunden30-60 Sekunden
Disk-OverheadMinimal2-5 GB für OS
IsolationGut (Namespaces)Sehr gut (Hardware-Level)
Kompatibilität99% der Docker-Images100%
Geeignet fürDie meisten WorkloadsSpezialfälle, maximale Isolation

Fazit

Docker in einem Proxmox LXC Container ist die ressourcenschonendste Variante um Container-Workloads zu betreiben. Mit den richtigen Einstellungen — Nesting, keyctl, ausreichend Disk — läuft es stabil und performant.

Die häufigsten Probleme (AppArmor, Overlay, Netzwerk) sind mit wenigen Handgriffen gelöst. Für Produktivumgebungen empfehlen wir zusätzlich regelmäßige Backups des gesamten LXC Containers und Monitoring der Docker-Services.

Brauchen Sie Hilfe bei der Einrichtung oder Verwaltung Ihrer Container-Infrastruktur? Wir übernehmen das gerne.

Mehr zu unserer Server-Administration