← Zurueck zu Proxmox Grundlagen
📦

LXC Container

Leichtgewichtige Linux-Container mit minimalem Overhead - perfekt fuer Services und Docker.

⏱️ 30-45 Minuten 📊 Mittel
1-2% Overhead
🚀 Sekunden-Start
🐧 Linux-only
🐳 Docker-kompatibel
🤔 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

  1. Datacenter → Storage → local
  2. CT Templates → Templates
  3. Gewuenschtes Template auswaehlen und herunterladen
Templates per CLI
bash

# 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: DHCP oder statisch
⌨️ Container erstellen (CLI) +

Container lassen sich schnell per CLI erstellen.

Standard-Container
bash

# 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
Container mit statischer IP
bash

# 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
Docker-optimierter Container
bash

# 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.

Grundoperationen
bash

# 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
Ressourcen aendern
bash

# 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
Zusaetzliche Disks
bash

# 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
Container-Typ aendern
bash

# 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.

Container-Konfiguration
bash

# 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
Docker installieren
bash

# 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
Schnelle Alternative
bash

# 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 klonen
bash

# 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
Template erstellen
bash

# 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 +
Haeufige Probleme
bash

# 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
Container-Logs
bash

# 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 →