LXC Container
Leichtgewichtige Linux-Container mit minimalem Overhead - perfekt fuer Services und Docker.
🤔 Was ist LXC?
LXC (Linux Containers) ist eine Betriebssystem-Virtualisierung, die den Linux-Kernel des Hosts teilt. Container starten in Sekunden und haben kaum Overhead.
Vorteile
- ✓ Minimaler Ressourcenverbrauch
- ✓ Sekundenschneller Start
- ✓ Einfaches Management
- ✓ Ideal fuer viele kleine Services
- ✓ Docker funktioniert darin
Einschraenkungen
- ✗ Nur Linux als Gast-OS
- ✗ Teilt Host-Kernel
- ✗ Keine eigenen Kernel-Module
- ✗ Weniger Isolation als VMs
- ✗ Manche Software inkompatibel
LXC vs Docker
LXC sind "System-Container" (vollstaendiges OS), Docker sind "Application-Container" (einzelne App). LXC eignen sich perfekt als Docker-Host!
📥 Templates herunterladen
Container werden aus vorgefertigten Templates erstellt.
Web-UI
- Datacenter → Storage → local
- CT Templates → Templates
- Gewuenschtes Template auswaehlen und herunterladen
# Verfuegbare Templates anzeigen
pveam available
# Nach Distribution filtern
pveam available | grep debian
pveam available | grep ubuntu
pveam available | grep alpine
# Template herunterladen
pveam download local debian-12-standard_12.2-1_amd64.tar.zst
pveam download local ubuntu-22.04-standard_22.04-1_amd64.tar.zst
pveam download local alpine-3.19-default_20240207_amd64.tar.xz
# Heruntergeladene Templates auflisten
pveam list local
Empfohlene Templates
- Debian 12: Stabil, gut dokumentiert, Standard-Wahl
- Ubuntu 22.04: Weit verbreitet, guter Support
- Alpine: Minimal (5 MB), perfekt fuer Single-Purpose
🖱️ Container erstellen (Web-UI)
Rechtsklick auf den Node → Create CT
1. General
- CT ID: Eindeutige Nummer
- Hostname: Name des Containers
- Unprivileged: ✓ Aktivieren (sicherer)
- Nesting: ✓ Fuer Docker aktivieren
- Password: Root-Passwort
2. Template
- Storage: Wo das Template liegt (local)
- Template: Heruntergeladenes Template waehlen
3. Disks
- Storage: local-lvm oder ZFS
- Disk size: Root-Partition (8-32 GB typisch)
4. CPU
- Cores: Anzahl der CPU-Kerne
- Container koennen Cores "ueber-provisionieren"
5. Memory
- Memory: RAM-Limit in MiB
- Swap: Swap-Speicher (optional)
6. Network
- Bridge: vmbr0
- IPv4: DHCP oder statische IP
- IPv6: Optional
7. DNS
- DNS domain: Optional
- DNS servers: Oder Host-Einstellungen verwenden
Schnellstart-Einstellungen
- Template:
debian-12-standard - Unprivileged:
Ja - Nesting:
Ja(fuer Docker) - Disk:
8-16 GB - RAM:
1024-2048 MB - Network:
DHCPoder statisch
⌨️ Container erstellen (CLI)
Container lassen sich schnell per CLI erstellen.
# Einfacher Debian-Container
pct create 200 local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst \
--hostname debian-ct \
--cores 2 \
--memory 2048 \
--swap 512 \
--rootfs local-lvm:8 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
--unprivileged 1 \
--features nesting=1 \
--password
# Container starten
pct start 200
# Mit statischer IP-Adresse
pct create 201 local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst \
--hostname webserver \
--cores 2 \
--memory 2048 \
--rootfs local-lvm:16 \
--net0 name=eth0,bridge=vmbr0,ip=192.168.1.50/24,gw=192.168.1.1 \
--nameserver 192.168.1.1 \
--unprivileged 1 \
--features nesting=1 \
--onboot 1 \
--password
# Autostart bei Boot aktiviert mit --onboot 1
# Fuer Docker/Podman optimiert
pct create 202 local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst \
--hostname docker-host \
--cores 4 \
--memory 4096 \
--rootfs local-lvm:32 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
--unprivileged 1 \
--features nesting=1,keyctl=1 \
--password
# Features erklaert:
# nesting=1 - Erlaubt Container-in-Container (Docker)
# keyctl=1 - Fuer FUSE/Overlay-Filesysteme (Docker)
🔧 Container verwalten
Wichtige Befehle fuer die Container-Verwaltung.
# Alle Container auflisten
pct list
# Container-Status
pct status 200
# Container starten
pct start 200
# Container stoppen (graceful)
pct shutdown 200
# Container sofort stoppen
pct stop 200
# Container neu starten
pct reboot 200
# In Container einloggen (als root)
pct enter 200
# Befehl im Container ausfuehren
pct exec 200 -- apt update
pct exec 200 -- cat /etc/os-release
# Container-Konfiguration anzeigen
pct config 200
# CPU-Cores aendern
pct set 200 --cores 4
# RAM aendern
pct set 200 --memory 4096
# Swap aendern
pct set 200 --swap 1024
# Disk vergroessern
pct resize 200 rootfs +10G
# Hostname aendern
pct set 200 --hostname new-hostname
# Netzwerk aendern
pct set 200 --net0 name=eth0,bridge=vmbr0,ip=192.168.1.100/24,gw=192.168.1.1
# Mount-Point hinzufuegen (extra Storage)
pct set 200 --mp0 local-lvm:50,mp=/data
# Host-Verzeichnis in Container mounten (Bind-Mount)
# Vorsicht: Sicherheitsrisiko bei unprivileged Containern!
pct set 200 --mp1 /mnt/shared,mp=/shared
# USB-Geraet durchreichen (nur privileged)
# In /etc/pve/lxc/200.conf:
# lxc.cgroup2.devices.allow: c 189:* rwm
# lxc.mount.entry: /dev/bus/usb dev/bus/usb none bind,optional,create=dir
Bind-Mounts und Unprivileged
Bei unprivileged Containern haben Dateien andere UIDs. Fuer Bind-Mounts:
pct set 200 --mp0 /host/path,mp=/container/path,backup=0
Oder: Container privilegiert machen (weniger sicher).
🔒 Privileged vs Unprivileged
Wichtiger Sicherheitsunterschied zwischen Container-Typen.
Unprivileged (Standard)
- ✓ Root im Container ≠ Root auf Host
- ✓ UID-Mapping (100000+)
- ✓ Sicherer bei Ausbruch
- ✓ Empfohlen fuer die meisten Faelle
- ✗ Manche Software braucht Anpassungen
Privileged
- ✓ Root im Container = Root auf Host
- ✓ Keine UID-Mapping-Probleme
- ✓ Voller Hardware-Zugriff moeglich
- ✗ Container-Ausbruch = Host-Kompromittierung
- ✗ Nur wenn unbedingt noetig
# ACHTUNG: Nicht im laufenden Betrieb!
# Unprivileged → Privileged
pct stop 200
# In /etc/pve/lxc/200.conf:
# unprivileged: 0
pct start 200
# Oder neu erstellen ohne --unprivileged 1
Wann Privileged?
- NFS-Server: Braucht Kernel-Module
- USB-Geraete: Direkter Hardware-Zugriff
- Spezielle Netzwerk-Setups: Raw Sockets
- Legacy-Software: Die Root-UID 0 erwartet
🐳 Docker in LXC
Docker laeuft hervorragend in LXC-Containern - die effizienteste Loesung fuer Self-Hosting.
# Features in der Container-Config aktivieren
# /etc/pve/lxc/200.conf
# Fuer Docker erforderlich:
features: nesting=1,keyctl=1
# Optional fuer FUSE (manche Docker-Images):
features: nesting=1,keyctl=1,fuse=1
# Container neu starten nach Aenderung
pct reboot 200
# Im Container einloggen
pct enter 200
# System aktualisieren
apt update && apt upgrade -y
# Docker installieren (Debian/Ubuntu)
apt install -y ca-certificates curl gnupg
# Docker GPG-Key
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# Docker Repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker installieren
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Docker testen
docker run hello-world
# Oder einfach mit Convenience-Script:
pct enter 200
curl -fsSL https://get.docker.com | sh
# Docker Compose ist bereits enthalten (Plugin)
docker compose version
Docker funktioniert!
Mit nesting=1 und keyctl=1 funktionieren die meisten
Docker-Images problemlos. Nur bei sehr speziellen Anforderungen (privilegierte
Container, bestimmte Kernel-Features) gibt es Einschraenkungen.
📋 Klonen & Templates
Container schnell vervielfaeltigen oder als Vorlage speichern.
# Container stoppen (empfohlen)
pct shutdown 200
# Full Clone
pct clone 200 210 --hostname clone-container --full
# Linked Clone (nur ZFS/LVM-thin)
pct clone 200 211 --hostname linked-clone
# Clone mit anderem Storage
pct clone 200 212 --hostname backup-clone --full --storage backup-storage
# Container wieder starten
pct start 200
pct start 210
# Container stoppen
pct shutdown 200
# In Template umwandeln
pct template 200
# Template kann nur noch geklont werden
pct clone 200 220 --hostname from-template --full
# Hinweis: Template kann nicht mehr gestartet werden!
Eigene Templates
Erstelle einen Container, installiere alle benoetigte Software (Docker, Tools, etc.), dann in Template umwandeln. Spart Zeit bei neuen Deployments!
🔧 Troubleshooting
# Container startet nicht
pct start 200
journalctl -xe | grep lxc
dmesg | tail -50
# Netzwerk funktioniert nicht
pct exec 200 -- ip a
pct exec 200 -- ping 8.8.8.8
pct exec 200 -- cat /etc/resolv.conf
# Docker funktioniert nicht
# Features pruefen:
grep features /etc/pve/lxc/200.conf
# Sollte enthalten: nesting=1,keyctl=1
# Permission denied bei Docker
# Meist weil nesting fehlt oder AppArmor blockiert
# In /etc/pve/lxc/200.conf:
# lxc.apparmor.profile: unconfined
# Disk voll
pct df 200
pct resize 200 rootfs +10G
# System-Logs im Container
pct exec 200 -- journalctl -xe
# LXC-spezifische Logs
cat /var/log/lxc/200.log
# Container-Start debuggen
lxc-start -n 200 -F -l DEBUG -o /tmp/lxc-debug.log
AppArmor-Probleme
Bei Problemen mit Docker in LXC kann AppArmor die Ursache sein:
# In /etc/pve/lxc/200.conf hinzufuegen:
lxc.apparmor.profile: unconfined
Container-Setup gesucht?
Wir helfen bei der optimalen Container-Architektur fuer deine Services.
Beratung anfragen →