Docker Portainer Proxmox LXC installeren

Wat je met deze guide bouwt (en waarom dat relevant is)

Docker Portainer Proxmox LXC installeren geeft je een betrouwbare Docker Engine met directe ZFS-opslagtoegang op je eigen hardware. Je Proxmox-server is het gebouw. Deze guide bouwt de machineruimte erin. Elke privacy-gerichte applicatie die je ooit zelf wilt hosten, draait bovenop wat je zo dadelijk gaat opzetten.

Docker is het standaard deploymentformaat voor zelfgehoste applicaties. Vrijwel elk open-source alternatief voor Big Tech-diensten — van fotobeheerders tot bestandssynchronisatieplatforms — wordt als Docker-image uitgebracht. Dat betekent dat je, voordat je Google Photos of Google Drive kunt vervangen, een betrouwbare, goed presterende Docker Engine op je eigen hardware nodig hebt. Deze guide bouwt precies dat: een slanke Ubuntu 24.04 LXC-container op Proxmox, geconfigureerd met directe ZFS-opslagtoegang en beheerd via de browserinterface van Portainer. Dit is de basislaag. De volgende guides in deze reeks installeren Immich (Google Photos-vervanger) en Nextcloud (Google Drive-vervanger) rechtstreeks bovenop deze engine.

Het privacyargument is eenvoudig. Wanneer je Docker-host op je eigen hardware draait, komt je data nooit op een cloudserver terecht. Geen Google-account. Geen abonnement. Geen gebruiksvoorwaarden die zonder jouw instemming worden gewijzigd. Je foto’s, bestanden en documenten blijven op schijven die jij fysiek in bezit hebt.

Wat je aan het einde hebt

  • Een Ubuntu 24.04 LXC die op Proxmox draait met kernel nesting ingeschakeld
  • ZFS-datasets die via Bind Mounts rechtstreeks op kernelniveau in de container zijn gekoppeld, zonder NFS- of SMB-latentie
  • Docker Engine geïnstalleerd en operationeel
  • Portainer CE-webinterface bereikbaar via https://<IP>:9443

Vereisten en minimale hardware

Benodigde infrastructuur

  • Proxmox VE geïnstalleerd en bereikbaar. Als je vanaf bare metal begint, doorloopt onze TerraMaster F4-424 Pro Proxmox-installatiegids een volledige hostinstallatie van begin tot eind.
  • NVMe SSD sterk aanbevolen voor de LXC-rootschijf. Docker-imagelagen genereren veel willekeurige I/O tijdens het pullen van images en het starten van containers. Een harde schijf of trage SATA SSD vormt een merkbare bottleneck.
  • Minimaal 4 CPU-cores en 4 GB RAM toegewezen aan de container.
  • Bestaande ZFS-storagepools voor het persistent opslaan van applicatiedata. Dit zijn de pools die je via Bind Mounts koppelt. Als je die nog niet hebt aangemaakt, behandelt onze Proxmox ZFS-bestandsservergids het aanmaken van pools uitgebreid.

Benodigde voorkennis

  • Kunnen navigeren in de Proxmox-webinterface
  • Basiskennis van Linux-terminalcommando’s
  • Een werkend begrip van het verschil tussen containers en VM’s: een VM emuleert een complete machine inclusief eigen kernel; een container deelt de hostkern en isoleert alleen de userspace-processen

Twee routes door deze guide

Beginnende Bas: Volg Methode 1 van boven naar beneden. Elke stap wordt uitgelegd. Je hoeft Methode 2 niet eerst te lezen.

Ervaren Erik: Lees eerst Methode 2 voor de architectuurredenering en voer daarna Methode 1 uit met volledige context. Het ‘waarom’ staat in Methode 2. Het ‘hoe’ staat in Methode 1.


Methode 1: De snelle start (route voor beginners)

Stap 1: Maak de Ubuntu LXC aan in Proxmox (kritiek: schakel Nesting in)

Het meest voorkomende struikelblok in deze hele guide is het vergeten van het Nesting-vinkje. We behandelen dit als eerste, nog voor alles else.

  1. Klik in de Proxmox-webinterface op Create CT rechtsboven.
  2. Stel Hostname in op DockerEngine. Zorg dat Unprivileged container is ingeschakeld.
  3. Kritieke actie: Klik onderaan de wizard op Advanced. Zoek het Nesting-vinkje op en controleer dat het aan staat.Schermafbeeldingsplaatshouder: Proxmox CT-wizard Advanced-paneel met het Nesting-vinkje gemarkeerd.

    Waarschuwing: Als je deze stap overslaat, start de Docker-daemon niet op. Je krijgt foutmeldingen over cgroups. De oplossing staat in de sectie Probleemoplossing, maar het is sneller om Nesting nu meteen in te schakelen.

  4. Selecteer Ubuntu 24.04 als template.
  5. Stel de schijfgrootte in op 32 GB op local-lvm.
  6. Stel in: CPU: 4 cores, Memory: 4096 MB, Network: DHCP.
  7. Klik op Finish.

Nadat de wizard is gesloten, navigeer je naar de container in het linkerpaneel, open je Options en schakel je Start at boot in. Zo zorgt je Docker Engine er automatisch voor dat hij een stroomonderbreking overleeft.

Stap 2: Configureer Bind Mounts (uitvoeren vanuit de Proxmox-hostshell, NIET vanuit de LXC)

Bind Mounts koppelen je ZFS-datasets rechtstreeks op kernelniveau aan het LXC-bestandssysteem. Deze commando’s moeten worden uitgevoerd vanuit de Proxmox-hostshell, niet vanuit de container zelf. Je configureert de container van buitenaf.

Let op: Vervang 101 door je werkelijke container-ID als Proxmox een ander nummer heeft toegewezen. Je kunt het ID bevestigen in de resourceboom aan de linkerkant.

# Run on the Proxmox HOST shell
# Replace 101 with your actual LXC container ID
pct set 101 -mp0 /hdd-pool/Opslag,mp=/mnt/opslag
pct set 101 -mp1 /fast-data/SnelleData,mp=/mnt/snelle_data

Controleer na het uitvoeren van beide commando’s of ze correct zijn geregistreerd:

pct config 101

Zoek in de uitvoer naar mp0– en mp1-regels. Als die er staan, zijn de Bind Mounts geconfigureerd. Als ze ontbreken, voer je de pct set-commando’s opnieuw uit en controleer je of de bronpaden op de Proxmox-host bestaan.

Stap 3: Installeer Docker Engine (uitvoeren binnen de LXC-console)

Je wisselt nu van context. Vanaf deze stap werk je binnen container 101, niet meer op de Proxmox-host. Toegang tot de container gaat via de Proxmox-interface door Container 101 te selecteren en op het tabblad Console te klikken, of door pct enter 101 uit te voeren vanuit de Proxmox-hostshell.

# Update system packages first
apt update && apt upgrade -y

# Install curl
apt install curl -y

# Download and execute the official Docker install script
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

Belangrijk: De URL https://get.docker.com is het officiële Docker-installatiescript. Controleer of de URL exact overeenkomt voordat je het uitvoert. Dit script detecteert je besturingssysteem en installeert automatisch de juiste Docker Engine-pakketten.

Stap 4: Installeer Portainer CE

Portainer biedt een browsergebaseerde GUI om alle Docker-containers, volumes, netwerken en Stacks (Docker Compose-bestanden uitgevoerd via de interface) te beheren. Je gebruikt Portainer om elke applicatie in deze reeks te installeren zonder CLI-commando’s uit je hoofd te hoeven kennen.

# Create a persistent volume for Portainer's own configuration data
docker volume create portainer_data

# Deploy the Portainer CE container
docker run -d \
  -p 8000:8000 \
  -p 9443:9443 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

De vlag --restart=always instrueert Docker om Portainer automatisch te herstarten als de container stopt of de LXC herstart. De koppeling van /var/run/docker.sock geeft Portainer directe communicatie met de Docker-daemon.

PoortProtocolDoel
9443HTTPSPortainer-webinterface
8000HTTPEdge Agent-tunnel (optioneel, niet nodig voor deze guide)

Methode 2: De pro-setup (architectuurverdieping)

De kernvraag: waarom LXC in plaats van een VM?

Deze vraag duikt voortdurend op in r/homelab- en r/Proxmox-threads, en verdient een direct antwoord.

De VM-aanpak geeft je een eigen kernel en sterkere isolatie. De afweging is reëel: je reserveert RAM en CPU die nergens anders voor gebruikt kunnen worden, en je Docker-data staat op een virtuele schijfimage bovenop je werkelijke opslag. Je hebt een abstractielaag toegevoegd tussen je applicatie en je data.

De LXC-aanpak deelt de Proxmox-kernel. De overhead is vrijwel nul. Belangrijker nog: het maakt directe ZFS Bind Mount-injectie mogelijk — het architectuurvoordeel dat deze opzet de moeite waard maakt. Je krijgt bare-metal Docker-prestaties binnen een unprivileged container met actieve nesting=1.

Voor een homelab met vertrouwde workloads wint de LXC-aanpak op elk praktisch meetpunt.

Het Bind Mount-voordeel: waarom deze architectuur wint

Bekijk het datapad in een traditionele opzet:

Traditioneel: Docker-container schrijft data → NFS- of SMB-share → ZFS-pool. Dat zijn twee netwerkhops, zelfs op een lokaal netwerk. Je betaalt latentie bij elke schrijfactie.

Deze opzet: Docker-container schrijft data → Bind Mount → ZFS-dataset. Dat is een direct pad op kernelniveau. Nul netwerkoverhead.

De praktische impact is duidelijk zichtbaar bij het draaien van Immich. Fotoverwerking omvat het lezen van raw-bestanden, het genereren van miniaturen en het uitvoeren van machine learning-inferentie. Al die bewerkingen schrijven naar opslag. Met Bind Mounts landen die schrijfacties rechtstreeks op ZFS met volledige Copy-on-Write-integriteit, snapshot-mogelijkheden en compressievoordelen intact. Geen NFS-daemon tussenin. Geen SMB-protocoloverhead.

Je kunt op elk moment vanuit de Proxmox-host controleren of nesting correct actief is:

# Verify nesting is active from the Proxmox host
pct config 101 | grep features
# Expected output: features: nesting=1

Beveiligingspositie: unprivileged container als maatregel

Het beveiligingsdebat over VM versus LXC is legitiem. De eerlijke conclusie: een VM biedt sterkere isolatie. Als je niet-vertrouwde workloads draait of in een multi-tenant omgeving werkt, gebruik dan een VM. Dat is hier niet de context.

Voor een homelab met bekende, vertrouwde Docker-images zijn de aanwezige beveiligingsmaatregelen voldoende:

  • unprivileged=1 koppelt de root-gebruiker van de container aan een niet-root UID op de Proxmox-host. Een container-escape geeft geen root-toegang tot de host.
  • Installeer alleen geverifieerde Docker-images van bekende uitgevers binnen deze LXC.
  • Draai geen geprivilegieerde Docker-containers binnen de LXC. Vermijd de vlag --privileged in elke container die je installeert.

Deze afweging is acceptabel voor het dreigingsmodel van een homelab. Voor productieomgevingen in een zakelijke context is dat een ander verhaal. Weet in welke categorie je valt.

Docker Compose en Stacks: de pro-workflow

Portainer Stacks zijn Docker Compose-bestanden die via de Portainer-interface worden uitgevoerd. Je plakt een compose.yml-bestand in de Stacks-editor, klikt op Deploy en Portainer doet de rest. Zo worden Immich en Nextcloud in de volgende guide in deze reeks geïnstalleerd.

Controleer na de installatie of Docker Compose v2 beschikbaar is:

docker compose version
# Expected output: Docker Compose version v2.x.x

Als dit commando een foutmelding geeft, is Docker Compose niet meegeïnstalleerd. Voer het Docker-installatiescript opnieuw uit of installeer het pakket docker-compose-plugin handmatig via apt.


Configuratie en validatie

Validatiechecklist via de commandoregel

Voer deze drie commando’s uit vanuit de LXC-console om te bevestigen dat alles operationeel is voordat je een browser opent:

# 1. Verify Docker Compose v2 is functional
docker compose version

# 2. Confirm the Docker daemon is running and responsive
docker ps

# 3. Find the LXC IP address for browser access
ip a | grep inet

docker ps moet een tabel teruggeven met de Portainer-container vermeld en een status van Up. Als de status Restarting toont, raadpleeg dan de sectie Probleemoplossing. Het commando ip a toont het IP-adres van je LXC op het lokale netwerk. Noteer dit voor de volgende stap.

Eerste aanmelding bij Portainer

  1. Open een browser en ga naar https://<LXC-IP-ADRES>:9443.
  2. Je browser toont een SSL-beveiligingswaarschuwing. Dit is normaal. Zie de sectie De harde waarheid voor de volledige uitleg. Klik op Geavanceerd en ga verder.
  3. Maak je beheerdersaccount aan. Portainer vereist een wachtwoord van minimaal 12 tekens. Gebruik een wachtwoordmanager.
  4. Klik op het scherm voor omgevingsselectie op Get Started.
  5. Klik op de tegel local.
  6. Controleer of het Portainer-dashboard het juiste aantal CPU-cores en de juiste hoeveelheid RAM toont die je aan de LXC hebt toegewezen.

Definitieve validatiechecklist

  • Ubuntu 24.04 LXC draait met nesting=1 bevestigd via pct config 101 | grep features
  • Bind Mounts zijn zichtbaar binnen de LXC op /mnt/opslag en /mnt/snelle_data
  • docker compose version geeft een v2.x-uitvoer terug
  • Portainer-interface laadt op https://<IP>:9443
  • Beheerdersaccount aangemaakt en lokale omgeving verbonden
  • CPU-cores en RAM worden correct weergegeven in het Portainer-dashboard

De harde waarheid: eigenaardigheden en eerlijke beperkingen

Docker in LXC wordt niet officieel ondersteund

Dit moet duidelijk worden gezegd: Docker ondersteunt LXC officieel niet als hostomgeving. Proxmox-ontwikkelaars raden het ook niet aan. Dit is de meest gehoorde zorg wanneer deze architectuur wordt besproken in r/homelab- en r/Proxmox-threads, en het is een terechte zorg.

Het tegenargument is even duidelijk: voor homelabgebruik met unprivileged containers en vertrouwde images wegen de prestatievoordelen en de Bind Mount-architectuur op tegen de isolatieafweging. Duizenden homelabgebruikers draaien deze exacte configuratie dagelijks zonder problemen.

De aanbeveling blijft staan: als je niet-vertrouwde workloads draait, diensten aanbiedt aan anderen, of werkt in een omgeving waar een container-escape een serieus probleem zou zijn, gebruik dan een VM. Voor een persoonlijk homelab met je eigen applicaties is deze opzet de meest efficiënte beschikbare optie.

De realiteit van het zelfondertekende certificaat

Portainer genereert bij de eerste start een eigen lokaal SSL-certificaat. Elke browser toont een beveiligingswaarschuwing wanneer je poort 9443 bezoekt. Dit is normaal gedrag, geen teken dat er iets mis is gegaan.

De waarschuwing betekent dat je browser de certificaatautoriteit niet herkent, niet dat de verbinding onversleuteld is. Het verkeer tussen je browser en Portainer is nog steeds versleuteld via TLS. Voor gebruik op een lokaal netwerk is doorklikken op de waarschuwing veilig.

Een toekomstige guide in deze reeks behandelt Nginx Proxy Manager met Let’s Encrypt om het zelfondertekende certificaat te vervangen door een vertrouwd certificaat, waardoor de browserwaarschuwing volledig verdwijnt.


Probleemoplossing bij veelvoorkomende fouten

Fout: Docker-daemon start niet op (cgroups- of rechtenfouten)

Symptoom: Het uitvoeren van systemctl status docker toont een mislukte status. Foutmeldingen verwijzen naar cgroups, permission denied of kernelfuncties.

Oorzaak: De Nesting-functie was niet ingeschakeld tijdens het aanmaken van de LXC.

Oplossing:

  1. Zet de LXC uit vanuit de Proxmox-host: pct stop 101
  2. Selecteer in de Proxmox-interface Container 101, open Options en klik op Features.
  3. Schakel het Nesting-vinkje in en sla op.
  4. Start de LXC: pct start 101
# Verify the fix from the Proxmox host after restart
pct config 101 | grep features
# Must show: features: nesting=1

Nadat je hebt bevestigd dat nesting actief is, voer je systemctl status docker opnieuw uit binnen de LXC. De daemon moet nu een actieve, draaiende status tonen.

Fout: SSL-browserwaarschuwing op poort 9443

Symptoom: Browser toont “Je verbinding is niet privé” of NET::ERR_CERT_AUTHORITY_INVALID.

Oorzaak: Portainer heeft bij de eerste start een zelfondertekend certificaat gegenereerd. Je browser vertrouwt zelfondertekende certificaten standaard niet.

Oplossing: Klik op Geavanceerd in de browserwaarschuwing en klik vervolgens op Doorgaan naar [IP-adres] (onveilig).

Toelichting: Het woord “onveilig” in dat browserlabel verwijst naar het vertrouwen in de certificaatautoriteit, niet naar of de verbinding versleuteld is. De verbinding is versleuteld. Het certificaat is simpelweg niet ondertekend door een erkende autoriteit. Dit is normaal voor lokale netwerkdiensten.

Fout: Bind Mounts niet zichtbaar binnen de LXC

Symptoom: De mappen /mnt/opslag of /mnt/snelle_data zijn leeg of bestaan niet binnen de container.

Oorzaak: De pct set-commando’s zijn uitgevoerd terwijl de container al draaide, of de bronpaden op de Proxmox-host bestaan niet.

Oplossing:

  1. Controleer vanuit de Proxmox-hostshell of de bronpaden bestaan: ls /hdd-pool/Opslag en ls /fast-data/SnelleData. Als een van beide commando’s “No such file or directory” teruggeeft, is het ZFS-datasetpad onjuist. Pas het pad aan zodat het overeenkomt met je werkelijke pool- en datasetnamen.
  2. Stop de container: pct stop 101
  3. Voer de pct set-commando’s uit Stap 2 opnieuw uit.
  4. Start de container: pct start 101
  5. Ga de container in en controleer: ls /mnt/opslag

Conclusie en vervolgstappen

Wat er is gebouwd

  • Ubuntu 24.04 LXC draaiend op Proxmox met actieve nesting-rechten op kernelniveau
  • Direct ZFS-naar-Docker-datapad via Bind Mounts, zonder NFS- of SMB-overhead
  • Docker Engine geïnstalleerd en operationeel
  • Portainer CE-webinterface geïnstalleerd, beveiligd en verbonden met de lokale Docker-omgeving

De privacymijlpaal

Deze infrastructuurlaag is de voorwaarde voor het permanent vervangen van Google Photos en Google Drive. Elke stap in deze guide is uitgevoerd op jouw hardware, op jouw netwerk. Er heeft geen data je gebouw verlaten. Er was geen cloudaccount nodig. Er is geen abonnement geactiveerd.

Wat er volgt in deze reeks

De volgende guide installeert de eerste Big Tech-vervangers via Portainer Stacks:

  • Immich: een Google Photos-alternatief met AI-gestuurde fotoherkenning, automatische back-up van je telefoon en het delen van albums. Alle verwerking vindt plaats op jouw hardware.
  • Nextcloud: een Google Drive-alternatief met bestandssynchronisatie, agenda, contacten en een volledig kantoorpakket. Je bestanden blijven op jouw schijven.

Beide applicaties schrijven hun data rechtstreeks naar de ZFS Bind Mount-paden die je in Stap 2 van deze guide hebt geconfigureerd. De mappen /mnt/opslag en /mnt/snelle_data die je vandaag hebt ingesteld, zijn precies waar Immich en Nextcloud hun data opslaan.

Community en verdere informatie

  • Plaatshouder: link naar r/homelab Proxmox Docker Portainer-discussiethread
  • Plaatshouder: link naar r/Proxmox VM vs. LXC-architectuurthread
  • Plaatshouder: link naar officiële Portainer CE-documentatie op docs.portainer.io
  • Plaatshouder: link naar vorige guide in de reeks over het aanmaken van ZFS-pools