Heb je ooit gehoord van Dockerception?

Nou, hou je vast. We duiken het konijnenhol in.

Portainer, de webinterface die je zo bovenop Docker installeert, is zelf een Docker-container.

Het is een tool die draait op precies datgene wat hij beheert. Je start hem met één docker run-regel, en het eerste wat hij doet, is via een klein gaatje in de host (een socketbestand) de Docker-daemon vragen om elke container op de machine te tonen, inclusief zichzelf. Vanuit dat browsertabblad beheer je al je andere Docker-containers.

De interface waar je naar kijkt, staat in zijn eigen containerlijst.

Op een VPS waar je al voor de machine betaalt en waar je al vertrouwd bent met SSH, past Portainer netjes bovenop Docker, zonder dat er onderliggend iets verandert.

Dat is de meerwaarde.

Een machine met 4 GB kan een startpunt zijn voor Docker en Portainer, maar de applicaties die je toevoegt, bepalen of die capaciteit genoeg is. Denk aan domotica, de fotoverzameling van het gezin, de AI-assistent en de nieuwsbrief die je al zo lang wilt lanceren, allemaal op één server die echt van jou is.

Zo krijg je het aan de praat, beveilig je het en haal je er meteen iets uit.

Wat is Portainer precies?

Portainer-architectuur 1x

Portainer is een webinterface die als Docker-container draait en je andere containers beheert via de Docker-socket.

In wezen is het een browsergebaseerde frontend (een grafische interface voor Docker) voor dezelfde Docker-opdrachten die je anders met de hand intypt, aangevuld met stackbeheer, toegang op basis van rollen (als je upgradet naar Business Edition) en een dashboard met CPU- en geheugengebruik.

De socketverbinding is wat het laat werken. In de installatieopdracht ziet de koppeling eruit als -v /var/run/docker.sock:/var/run/docker.sock, en die ene regel doet al het zware werk. Zonder die regel is Portainer een interface voor een lege Docker-host. Met die regel is Portainer de afstandsbediening van de Docker-host.

Eén ding om in gedachten te houden: elk proces dat /var/run/docker.sock kan bereiken, kan de Docker-daemon besturen, en de beveiligingsdocumentatie van Docker zelf zegt onomwonden dat alleen vertrouwde gebruikers dat mogen: een container die via de daemon wordt gestart, kan het volledige bestandssysteem van de host koppelen en zonder beperkingen aanpassen. Dat is een functie als Portainer de vraag stelt, en een probleem als het gaat om een container die je vorige week hebt opgestart en waarvan je vergeten was dat je hem toegang tot de socket had gegeven.

Behandel de socketkoppeling als een bevoorrechte bevoegdheid en controleer elke andere container die er een wil.

Heb je Portainer nodig als je Docker al hebt?

Nee hoor. Docker werkt prima vanuit de terminal, en genoeg mensen draaien jarenlang een paar containers zonder er ooit een interface bovenop te zetten.

Portainer is iets voor je als:

  • Je meer dan twee of drie Docker-containers voor verschillende apps moet beheren.
  • Je om 23.00 uur liever op restart klikt dan een Compose-opdracht opnieuw intypt.
  • Je toegang deelt met iemand die niet in een terminal leeft.
  • Je stack-updates wilt uitrollen vanuit een Git-repository zonder een deployscript te schrijven.

Sla Portainer over als:

  • Je één of twee containers draait die zelden veranderen.
  • Je al vertrouwd bent met Docker Compose en daar graag bij blijft.

Docker zelf is zo gangbaar dat dit geen randbeslissing is. In de Stack Overflow Developer Survey van 2025 gaf 71% van de respondenten aan Docker te gebruiken: de hoogste score van alle technologieën voor cloudontwikkeling en infrastructuur, na een stijging van 17 procentpunten ten opzichte van 2024. Het Portainer-project heeft per augustus 2026 meer dan 38.000 sterren op GitHub.

Er zijn ook andere opties. Dokploy gaat bijvoorbeeld meer de kant op van een volledig zelfgehost PaaS dat apps, databases en SSL voor je regelt. Portainer blijft dichter bij gewoon Docker: dezelfde Compose-bestanden, dezelfde images, alleen met een interface erbovenop.

Leef je in tmux en draai je één app? Sluit dan dit tabblad. Je zit goed. Draai je vier zelfgehoste apps en heb je deze maand al twee keer gegoogeld op Hoe zaten Docker-logs ook alweer?, lees dan verder.

Hoe groot moet je VPS zijn voor Docker en Portainer?

Portainer noemt geen minimale hoeveelheid RAM. Een VPS met 4 GB kan genoeg zijn voor een kleine stack, maar bepaal de grootte op basis van de gezamenlijke vereisten van het besturingssysteem, de Docker-daemon en elke container die je wilt draaien.

De pagina met systeemvereisten van Portainer zelf zegt verrassend weinig over RAM: de Server wordt geleverd als lichtgewicht container, en de prestatierichtlijnen in de documentatie gaan over opslag (daarover hieronder meer). De echte RAM-berekening draait om je workloads: reken op het besturingssysteem, de Docker-daemon en elke container die je wilt draaien. Reken ook schijfruimte voor logs: het standaard logstuurprogramma json-file van Docker roteert geen logs, dus de logs van een spraakzame container kunnen na verloop van tijd flink wat schijfruimte opslokken. De logdocumentatie van Docker raadt in plaats daarvan het stuurprogramma local aan. Zodra Docker is geïnstalleerd (stap 2 hieronder), maak je de configuratiemap van Docker aan, stel je het logstuurprogramma local in en herstart je Docker: voer sudo install -d -m 0755 /etc/docker uit, dan printf '%s\n' '{ "log-driver": "local" }' | sudo tee /etc/docker/daemon.json > /dev/null en dan sudo systemctl restart docker. Doe dit voordat je apps uitrolt die lang blijven draaien: het stuurprogramma local roteert logs standaard, en de wijziging geldt alleen voor containers die daarna worden aangemaakt.

Zo vertaalt zich dat naar echte workloads:

Tabel met VPS-groottes voor Docker en Portainer: een kleine appstack met Ghost, n8n, Postgres en een reverse proxy past op DreamHost Stack 8 met 8 GB RAM; Stack 4 is geschikt voor één of twee lichte apps; grotere pakketten kies je op basis van de gedocumenteerde vereisten van je workloads

Het rekenwerk is simpel optellen: zoek de gedocumenteerde RAM-vereiste op van elke app die je wilt draaien, tel het besturingssysteem en de Docker-daemon erbij op en laat ruimte over voor pieken in gebruik. Portainer zelf noemt geen minimale hoeveelheid RAM, dus het zijn de apps, niet de interface, die de machine vullen.

Bij DreamHost is onze VPS Hosting er in vier Stack-pakketten op basis van RAM (Stack 4, 8, 16 en 32). Het instappakket Stack 4 (2 vCPU's, 4 GB RAM, 75 GB NVMe SSD, volledige root-toegang) past goed bij een kleine Docker-host. Bij maandelijkse facturering kost het $8,99/mnd voor de eerste 3 maanden en wordt het daarna automatisch verlengd tegen $15,99/mnd (per augustus 2026; de volledige looptijd plus belastingen wordt bij het afrekenen in rekening gebracht. De actuele bedragen staan altijd op de pagina Docker + Portainer VPS).

Twijfel je of zelf hosten de tijd waard is? Dan is Stack 4 de maat om mee te beginnen: groot genoeg om erachter te komen, klein genoeg dat je niet betaalt voor ruimte die je niet gebruikt. Groeit je berekening eroverheen, dan stap je over naar een groter pakket en verhuist je omgeving mee. Let wel: terugschalen naar een kleinere Stack wordt momenteel niet ondersteund, dus begin bewust klein.

Een opmerking over opslag: het datavolume van Portainer bevat zijn eigen database en configuratie, plus een kloon van elke Git-repository waaruit je stacks uitrolt. De documentatie van Portainer waarschuwt dat grote of meerdere repository’s flink wat schijfruimte kunnen innemen. De prestatierichtlijnen in de documentatie gaan over opslag, niet over geheugen: prestaties op SSD-niveau (≈3,5 MB/s, 30.000 IOPS of meer, een schrijflatentie van minder dan 10 ms) noemen ze ideaal. Stack 4 bevat 75 GB NVMe-SSD-opslag.

Hoe installeer je Docker en Portainer op een VPS?

Formulier voor de eerste installatie van Portainer.io om een beheerdersaccount met gebruikersnaam aan te maken

Het kost zeven stappen. Hoe lang downloaden en installeren duurt, hangt af van je VPS en je netwerkverbinding. De opdrachten in stap 2 tot en met 6 zijn geschreven voor Ubuntu en kun je op een schone server op volgorde plakken. De ene plek waar een opdracht een waarde nodig heeft die alleen jij kent (je eigen IP-adres, in stap 4), wordt in die stap aangegeven. (Wil je de hele lijst overslaan? De appbibliotheek van VPS-hosting bij DreamHost bevat een Docker + Portainer-image waarin beide al zijn geconfigureerd.)

1. Kies een Linux-distributie

Deze gids gebruikt Ubuntu 24.04 LTS. Docker Engine ondersteunt Ubuntu 22.04, 24.04 en 26.04 LTS (per augustus 2026). Ubuntu is een van de vooraf geïnstalleerde besturingssystemen op VPS-hosting van DreamHost.

Debian en distributies uit de RHEL-familie zoals AlmaLinux werken ook, maar daarvoor heeft de documentatie van Docker eigen installatiestappen, en de opdrachten hieronder kun je niet zomaar overnemen. Nog een extra addertje bij de RHEL-familie: de installatiedocumentatie van Portainer gaat ervan uit dat SELinux is uitgeschakeld, en zegt dat je --privileged aan Docker moet meegeven bij het uitrollen van Portainer als je SELinux ingeschakeld wilt houden. Zei die zin je niets? Gebruik dan Ubuntu.

Weet je niet welke versie van Ubuntu je draait? Ontdek vijf manieren om het te controleren.

2. Installeer Docker vanuit de officiële repository

Voer geen apt install docker.io uit en installeer Docker ook niet via snap. De officiële installatiedocumentatie van Docker noemt docker.io bij de onofficiële pakketten die je moet verwijderen voordat je Docker Engine installeert, en de installatiedocumentatie van Portainer waarschuwt dat het snap-pakket compatibiliteitsproblemen kan veroorzaken.

Verwijder eerst eventuele conflicterende pakketten. Dit is de verwijderopdracht uit de huidige installatiedocumentatie van Docker, en op een schone server vindt hij meestal niets om te verwijderen. De documentatie vermeldt dat apt kan melden dat geen van deze pakketten is geïnstalleerd:

bash
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1)

Voeg daarna de GPG-sleutel van Docker toe (elke regel hieronder is een aparte opdracht):

bash
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

Voeg vervolgens de apt-repository van Docker toe. Dit schrijft de repositorydefinitie naar /etc/apt/sources.list.d/docker.sources, het bestand dat de installatiedocumentatie van Docker gebruikt, waarbij je Ubuntu-versie en CPU-architectuur automatisch worden ingevuld:

bash
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update

Installeer tot slot Docker Engine en de Compose-plug-in in één keer:

bash
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3. Controleer of Docker draait

Voer sudo docker run hello-world uit.

Krijg je het bericht Hello from Docker! niet te zien? Los dan eerst het probleem met de daemon op voordat je Portainer erbovenop zet.

4. Koppel UFW aan Docker voordat je Portainer start

Dit is het deel dat de meeste gidsen aan het eind zetten, als het al te laat is: wanneer Docker een poort publiceert, wordt het verkeer ernaartoe omgeleid voordat het de chains bereikt die UFW filtert. Een gepubliceerde poort is dus bereikbaar vanaf het openbare internet, zelfs als UFW zegt dat hij geblokkeerd is. (De volledige uitleg staat hieronder.) Zodra je Portainer start, is poort 9443 openbaar, en dat precies tijdens het venster van vijf minuten waarin wie er als eerste bij is het beheerdersaccount mag aanmaken. Regel de firewall dus eerst.

Is UFW nog niet actief? Sta dan SSH toe en schakel UFW in. (Draait SSH bij jou op een aangepaste poort, sta dan die poort toe in plaats van 22, anders is dit de stap waarin je jezelf buitensluit.)

bash
sudo ufw allow 22/tcp
sudo ufw enable

Installeer daarna chaifeng/ufw-docker, een tool van derden die de benodigde regels toevoegt aan /etc/ufw/after.rules, zodat verkeer naar de gepubliceerde poorten van Docker wordt gefilterd via de DOCKER-USER-chain. De opdrachten hieronder zetten de release 251123 van het project (november 2025) vast in plaats van te halen uit de steeds veranderende master-branch, en ze gebruiken curl, dat je in stap 2 al hebt geïnstalleerd:

bash
sudo curl -fsSL -o /usr/local/bin/ufw-docker \
  https://github.com/chaifeng/ufw-docker/raw/251123/ufw-docker
sudo chmod +x /usr/local/bin/ufw-docker
sudo ufw-docker install
sudo ufw reload

Na het herladen worden gepubliceerde containerpoorten gefilterd via UFW. Als je beleid voor gerouteerd verkeer inkomende verbindingen weigert en geen bestaande regel de poort toestaat, blijven openbare verbindingen geblokkeerd totdat je ze expliciet toestaat. (Het ufw-docker-project vermeldt dat een herstart van de server het oplost als de regels na een herstart van UFW niet werken.)

Geef nu vooraf toestemming voor je eigen toegang tot de interface van Portainer. Vervang YOUR_HOME_IP door het openbare IP-adres waarvandaan je gaat browsen:

bash
sudo ufw route allow proto tcp from YOUR_HOME_IP to any port 9443

Staat deze regel er al voordat Portainer start, dan is IPv4-verkeer naar de UI alleen toegestaan vanaf jouw IP-adres en van niemand anders, ook tijdens het venster voor het eerste beheerdersaccount. Zoals de regel er nu staat, dekt hij alleen IPv4. Volgens de documentatie van ufw-docker ondersteunt de tool ook IPv6-netwerken en werkt hij /etc/ufw/after6.rules bij als dat nodig is. Neem dat echter niet zomaar aan: reageert je VPS op een openbaar IPv6-adres, voer dan de test van buitenaf uit de firewallsectie ook via IPv6 uit voordat je erop vertrouwt. De keerzijde: de meeste thuisverbindingen krijgen af en toe een ander IP-adres, dus misschien moet je de regel later bijwerken. Vind je dat vervelend, dan is een VPN vóór de UI op de lange termijn de nettere oplossing (zie de sectie over beveiligen).

5. Maak een persistent volume voor de gegevens van Portainer

Voer daarna sudo docker volume create portainer_data uit.

Doordat de database van Portainer op een Docker-volume staat (en niet in de container), wist een upgrade van Portainer je configuratie niet.

6. Start Portainer Community Edition

Dit is de opdracht uit de Linux-installatiedocumentatie van Portainer, op één flag na: de officiële versie publiceert ook poort 8000. Dat is een TCP-tunnel die je alleen nodig hebt als je later externe omgevingen koppelt via Edge Agents. Een installatie op één host heeft die niet nodig, dus laten we hem weg:

bash
sudo docker run -d \
  -p 9443:9443 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:lts

Laten we dat regel voor regel doorlopen:

  • -d draait de container op de achtergrond.
  • -p 9443:9443 is de webinterface van Portainer via HTTPS: de poort die je in stap 4 voor jouw IP-adres hebt opengezet.
  • --restart=always start Portainer weer op na een herstart van de server.
  • De -v-flags zijn de socketkoppeling en het persistente volume uit stap 5.
  • :lts legt je vast op de Long Term Support-releaselijn van Portainer. Dat is de tag die Portainer zelf in de installatiedocumentatie gebruikt.

7. Open de UI en maak je beheerdersaccount aan

Ga in je browser naar https://YOUR_VPS_IP:9443 (vanaf het IP-adres dat je in stap 4 hebt toegestaan).

Klik de waarschuwing over het zelfondertekende certificaat weg. Je komt uit op het scherm create the initial administrator user. Kies een gebruikersnaam die niet admin is, stel een sterk wachtwoord in en bewaar het op een betrouwbare plek. En… je bent binnen!

Waarom kreeg ik net een time-out van Portainer?

Omdat Portainer bij de eerste installatie precies vijf minuten wacht tot iemand hem claimt. Doet niemand dat, dan gaat de deur op slot.

Letterlijk uit de FAQ van Portainer zelf:

As a security precaution, when Portainer is first installed it will wait for 5 minutes for an administrator user to be created (part of the initial setup). If a user is not created within those 5 minutes, the Portainer Server will stop listening for requests.

Vertaald: als je stap 6 gebruikte om een boterham te smeren, weigert je installatie nu met je te praten. En je hebt niets verkeerd gedaan.

De oplossing is simpel. Voer sudo docker restart portainer uit.

Daarmee start de container opnieuw op, krijg je een nieuw venster van vijf minuten en kom je op het scherm om een beheerder aan te maken. Herhaal zo vaak als nodig. Welkom bij zelf hosten.

Script je de installatie voor een hele reeks servers (Ansible, Terraform, een deploypipeline), dan accepteert Portainer de flag --admin-password-file. Die maakt bij de eerste start van de container de beheerder aan vanuit een bestand, zodat je niet tegen de klok naar een aanmaakscherm hoeft. De documentatie over CLI-configuratie van Portainer beschrijft de syntaxis. Voor een eenmalige installatie op een VPS volstaat het herstarttrucje.

Hoe voorkom je dat Docker je firewall omzeilt?

Vergelijking van de Docker-firewall: zonder DOCKER-USER-regel is onbeperkte toegang tot containers mogelijk

Dat heb je al gedaan, in stap 4. Hier lees je wat er precies gebeurde, hoe je bewust poorten openzet en hoe je bewijst dat het werkt.

Het probleem: als je de poort van een container publiceert met -p 80:80, is die poort bereikbaar vanaf het openbare internet, zelfs als ufw status poort 80 als geweigerd toont. Volgens de documentatie over pakketfiltering van Docker Docker routes container traffic in the nat table, which means that packets are diverted before it reaches the INPUT and OUTPUT chains that ufw uses.

UFW is niet kapot. Hij staat gewoon in de verkeerde gang.

De oplossing waar Docker zelf naar verwijst, is de DOCKER-USER iptables-chain. Dat is een chain die Docker speciaal aanmaakt voor eigen regels en die wordt verwerkt vóór de regels in de chains van Docker zelf. Het ufw-docker-script dat je in stap 4 hebt geïnstalleerd, koppelt UFW aan die chain door een blok regels (tussen de markeringen # BEGIN UFW AND DOCKER en # END UFW AND DOCKER) toe te voegen aan /etc/ufw/after.rules. Zo wordt het samen met de rest van je UFW-configuratie geladen.

Een containerpoort bewust openzetten voor het publiek, bijvoorbeeld voor een webapp op containerpoort 80, doe je met een route-regel:

bash
sudo ufw route allow proto tcp from any to any port 80

Eén valkuil waar de documentatie van ufw-docker op wijst: de regel gebruikt de poort van de container, niet die van de host. Heb je gepubliceerd met -p 8080:80, dan is de regel hierboven (poort 80) de juiste, niet poort 8080.

Controleren van buitenaf doe je vanaf een netwerk dat niet op je lijst met toegestane adressen staat. Een hotspot via je telefoon werkt prima. Dit hoort een time-out te geven in plaats van de inlogpagina van Portainer:

bash
curl -k --max-time 5 https://YOUR_VPS_IP:9443

# For IPv6, enclose the address in square brackets:
curl -k --max-time 5 'https://[YOUR_VPS_IPV6]:9443'

Voer dezelfde opdracht uit vanaf het IP-adres dat je in stap 4 hebt toegestaan, en je hoort HTML terug te krijgen. Dat UFW denied zegt, is een bewering. Een time-out vanaf een onbekend netwerk is bewijs.

Alles terugdraaien doe je met sudo ufw-docker uninstall, gevolgd door sudo ufw reload. Volgens het project herstelt de eerste opdracht je UFW-configuratie en verwijdert hij de bestanden die de tool heeft geïnstalleerd. Je kunt ook handmatig het blok tussen de markeringen # BEGIN UFW AND DOCKER en # END UFW AND DOCKER in /etc/ufw/after.rules verwijderen en UFW opnieuw laden.

Hier trappen zelfs scherpe engineers in, op persoonlijke servers en productieservers: UFW zegt het ene, het openbare internet het andere, en de waarheid staat in iptables. Wil je dat Portainer helemaal geen openbare poort heeft, zet er dan een VPN-tunnel voor, zoals WireGuard.

Wat moet je direct na de eerste login beveiligen?

Je bent binnen. Hier zijn vijf dingen die de moeite waard zijn voordat je dat browsertabblad sluit. De eerste vier komen rechtstreeks uit de beveiligingsgids van Portainer zelf:

  • Zet Force HTTPS only aan. De installatie in deze gids publiceert alleen poort 9443, dus er staat sowieso geen HTTP-poort open. Met de schakelaar Force HTTPS only onder Settings → SSL Certificate leg je dat vast. Volgens de documentatie over instellingen van Portainer schakelt die het luisteren op de oude HTTP-poort (9000) volledig uit. Zo kan een toekomstige herimplementatie die -p 9000:9000 toevoegt geen onversleuteld pad heropenen.
  • Vervang het zelfondertekende certificaat. Upload een certificaat dat je zelf hebt gegenereerd, of zet een NGINX-reverse proxy met een Let’s Encrypt-certificaat vóór Portainer. Na de eerste dag is elke keer de browserwaarschuwing wegklikken een gewoonte waar je spijt van krijgt.
  • Gebruik een echte gebruikersnaam voor de beheerder. Met de standaardgebruikersnaam admin hoeft een aanvaller één inloggegeven minder te achterhalen. Kies iets wat specifiek bij jou past.
  • Beperk de UI tot een VPN. Portainer achter een WireGuard-VPN draaien is de aanpak waar de beveiligingsgids van Portainer naar verwijst. Poort 9443 beperkt tot je eigen IP-adres (stap 4) is goed. Poort 9443 die alleen via een privénetwerk bereikbaar is, is beter.
  • Controleer de koppeling met de Docker-socket. Alles wat toegang heeft tot /var/run/docker.sock, bestuurt de Docker-daemon en daarmee de host. Koppel de socket niet zomaar aan andere containers. Elke extra koppeling is een nieuw pad naar de host. Beweert een container dat hij de socket nodig heeft, vraag dan waarom. En overweeg een socketproxy als het antwoord voor monitoring is.

Hoe gebruik je Portainer in de dagelijkse praktijk?

De beloning voor het installeren van Portainer komt op de dag dat je niet meer via SSH inlogt om een haperende container te herstarten, maar gewoon op een knop klikt. De grotere beloning is stackbeheer.

Een Portainer-stack is een app met meerdere containers, gedefinieerd in een Docker Compose-bestand. Portainer kan ondersteunde Docker Compose-configuraties als stacks implementeren via vier routes uit de officiële documentatie over stacks:

  • Plak Compose in de webeditor
  • Upload een Compose-bestand
  • Verwijs Portainer naar een Git-repository
  • Implementeer vanuit een aangepaste template
Portainer.io-dashboard met Stack Details, containertabel, logs en statistieken

De Git-route is degene die ertoe doet. Je verwijst Portainer naar een openbare of geauthenticeerde repo en een pad naar docker-compose.yml, en zet daarna GitOps-updates aan. Portainer controleert de repo met een ophaalinterval dat je zelf instelt, of geeft je een webhook-URL die je aan je Git-host toevoegt (bijvoorbeeld aangeroepen vanuit een GitHub Action). Verandert het Compose-bestand in de repository, dan haalt Portainer het automatisch op en implementeert hij de stack opnieuw. En ja, dit werkt in Community Edition. Op de documentatiepagina over stacks heeft alleen de optie voor volumes met relatieve paden het label Business Edition.

Dat is de zelfgehoste versie van automatisch implementeren bij elke push, zonder dat je een PaaS betaalt voor het voorrecht.

De kleinere dagelijkse voordelen tellen ook op. Denk aan logs in een paneel in plaats van ze via de opdrachtregel te volgen, herstarts met één klik, een stack opnieuw opbouwen met een druk op de knop en resourcegrafieken die je in drie seconden scant in plaats van Docker stats te draaien.

Voeg je later externe hosts toe via Edge Agents, dan komt poort 8000 weer in beeld. De FAQ hieronder behandelt de herimplementatie en de firewallregel.

Hoe maak je een back-up van Portainer en je containers?

Een volume zorgt voor persistentie, maar is geen back-up. Het volume portainer_data uit stap 5 overleeft upgrades van de container, maar staat op dezelfde schijf als al het andere. Een echt back-upplan bestaat dus uit drie delen, en alle drie verlaten de VPS.

1. De configuratie van Portainer zelf. Ga in de UI naar Settings → Back up Portainer, laat de standaardoptie Download backup file staan en klik op Download backup. Volgens de documentatie over instellingen van Portainer download je daarmee een tar.gz van alles wat Portainer op het /data-volume opslaat, eventueel versleuteld met een wachtwoord. Dat archief is alles wat je nodig hebt om Portainer te herstellen. De documentatie is net zo duidelijk over de reikwijdte: er wordt alleen een back-up gemaakt van de configuratie van Portainer, niet van de containers, stacks of volumes die je hebt geïmplementeerd. (Geplande back-ups naar S3 bestaan wel, maar alleen in Business Edition. Zet in CE een terugkerende herinnering in je agenda.)

2. Je applicatiedata. De documentatie over volumes van Docker noemt benoemde volumes de aanbevolen manier om containerdata te bewaren, en makkelijker te back-uppen of te migreren dan bind mounts. Een alleen-lezen-koppeling voorkomt alleen dat de back-up-container schrijft. De app zelf kan halverwege het archiveren nog steeds naar het volume schrijven en je een inconsistente kopie bezorgen. Stop dus eerst de container van de app (sudo docker stop myapp), of gebruik het ondersteunde back-upmechanisme van de app zelf. Koppel het volume daarna alleen-lezen aan een wegwerpcontainer, maak er een tar-archief van en start de app daarna weer (vul je eigen namen in):

bash
sudo docker run --rm \
  -v myapp_data:/source:ro \
  -v "$PWD":/backup \
  alpine tar czf /backup/myapp_data.tgz -C /source .

Gebruik voor databases liever de eigen dumptool van de database (pg_dump, mysqldump) dan live databestanden te kopiëren. Zo archiveer je geen bestand terwijl er nog naar geschreven wordt. Verplaats de archieven daarna volgens een vast schema van de server af: met rsync of scp naar een andere machine, of naar objectopslag. Een back-up die op dezelfde schijf staat als de data die hij beschermt, verdwijnt samen met die schijf.

3. Je Compose-bestanden en geheimen. Implementeer je stacks vanuit Git, dan staan de Compose-bestanden al buiten de host. Wat Git niet bevat, is alles wat je nooit hebt gecommit: .env-bestanden, API-sleutels en wachtwoorden die je bij het implementeren hebt opgegeven. Mappen die met een bind mount zijn gekoppeld, vallen ook buiten de volumeback-up hierboven. Inventariseer die apart en maak er versleutelde back-ups van.

Test daarna het herstellen, voordat je het nodig hebt. Volgens de documentatie van Portainer werkt het herstellen van een configuratie alleen op een nieuwe instantie. Implementeer een nieuwe Portainer-container met een leeg datavolume (een wegwerp-VPS of je laptop is prima), kies Restore Portainer from backup tijdens de eerste installatie en controleer of je met je oude inloggegevens kunt inloggen en je stackdefinities ziet. Die oefening dekt alleen deel 1: de configuratie van Portainer. Delen 2 en 3 hebben per app een eigen test nodig. Herstel een archief in een nieuw volume, start de app daarmee en controleer of de data er echt staat. Een ongeteste back-up is een hoop met een bestandsnaam.

Wat kost Portainer? (En wanneer is gratis niet meer gratis?)

Portainer is dubbel gratis. Community Edition is gratis en open source (zlib-licentie), zonder licentiesleutel. En Portainer Business Edition is voor altijd gratis voor maximaal 3 nodes: alle Business-functies, geen tijdslimiet, geen creditcard. In plaats van te betalen vraag je een gratis licentiesleutel aan.

EditieKostenNodesIdeaal voor
Community EditionGratis, open sourceGeen licenties per nodePersoonlijke projecten, homelab, zelfhosters met één VPS
Business Edition — 3 nodes gratisGratis, geen tijdslimietTot 3Kleine homelabs die Business-functies zoals RBAC willen
Home & Student$155/jaarTot 15Grotere homelabs en studenten; strikt niet-commercieel
Business StarterVanaf $105/mnd5, 10 of 15Kleine teams die echte infrastructuur beheren (communitysupport)
Business ScaleVanaf $209/mnd5 tot 35Groeiende teams die 9×5-support nodig hebben
EnterpriseOfferteMaatwerkBehoefte aan compliance en prioriteitssupport

Prijzen komen van de prijspagina van Portainer en gelden per augustus 2026. Voor Starter en Scale zit je aan een jaarcontract vast.

Welke kies je dan? Voor één VPS met één beheerder: Community Edition. Die is open source, vraagt geen registratie en doet alles uit deze gids, inclusief deploys vanuit Git. Wil je rolgebaseerd toegangsbeheer (RBAC) voor een tweede gebruiker, of draai je al twee of drie servers? Kies dan de gratis Business-variant voor 3 nodes. Dat is dezelfde software met de Business-functies ontgrendeld, gratis zolang je op drie nodes of minder blijft. De betaalde abonnementen zijn pas zinvol als je met een team echt veel nodes beheert. En kijk eerst wat voor support je krijgt voordat je aanneemt dat betalen ook support betekent: volgens de prijspagina van Portainer (augustus 2026) krijg je bij Starter communitysupport, vanaf Scale support op werkdagen (9×5) met antwoord de volgende werkdag, en bij Enterprise support met voorrang.

Moet je Portainer toevoegen of overslaan?

Hier is het eerlijke antwoord in twee zinnen:

✅ Ga je deze server delen, vanuit Git deployen of over een jaar meer dan drie containers draaien? Installeer Portainer dan nu, nu de host nog vers is en je gewoontes zich er nog omheen vormen.

❌ Draai je één rustige app en voel je je prima thuis in de terminal? Dan mis je de UI niet die je nooit hebt geïnstalleerd.

De echte vraag is niet: Portainer of geen Portainer. De vraag is of zelf hosten überhaupt de juiste keuze voor je is. En die vraag heb je al beantwoord toen je dit tabblad opende.

Een VPS met 4 GB, Docker en Portainer CE zijn genoeg om serieus te beginnen met zelf hosten: kies je apps, tel hun gedocumenteerde vereisten bij elkaar op en laat de rekensom bepalen wanneer je server moet groeien, niet je verlanglijstje.

Geen slechte deal.

Veelgestelde vragen over Docker en Portainer

Kun je Docker op een VPS draaien?

Ja. Een VPS met root-toegang is een van de flexibelste plekken om Docker te draaien: je installeert Docker Engine op het Linux-besturingssysteem van de server en elke app draait in een eigen container. Waar mensen vaak over struikelen: de VPS is de gehuurde virtuele server, terwijl Docker de software is die je erop draait om applicaties in containers te isoleren. Elke VPS met root-toegang en genoeg RAM voor je containers volstaat. DreamHost VPS Hosting biedt zelfs een image waarop Docker + Portainer al vooraf geïnstalleerd zijn.

Waarvoor gebruik je Portainer?

Portainer gebruik je om Docker-, Docker Swarm- en Kubernetes-containers te beheren via een webinterface. Het draait zelf als Docker-container, maakt verbinding met de Docker-socket van de host en geeft je in de browser overzicht en controle over elke andere container op de host: containers starten en stoppen, stacks met meerdere containers implementeren, logs bekijken en gebruikerstoegang beheren zonder via SSH in te loggen.

Heb ik Portainer nodig als ik Docker heb?

Nee, je hebt Portainer niet nodig om Docker te gebruiken. Docker werkt volledig vanuit de terminal, en veel zelfhosters zetten er nooit een interface bovenop.

Portainer bewijst zijn waarde wanneer je meer dan twee of drie containers beheert, toegang deelt met iemand die niet in een terminal leeft, of stack-updates uitrolt vanuit een Git-repository. Sla het over als je één of twee stabiele containers draait en vertrouwd bent met Docker Compose.

Op welke poort draait Portainer?

Portainer biedt zijn webinterface standaard via HTTPS aan op poort 9443. De officiële installatieopdracht in de Linux-installatiedocumentatie van Portainer publiceert ook poort 8000, een TCP-tunnel die alleen door Edge Agents wordt gebruikt als je later externe Docker-hosts koppelt. Die poort is optioneel, en daarom laat de installatie voor één host in deze gids de -p 8000:8000-flag helemaal weg.

Hoeveel RAM heeft Portainer nodig?

De huidige systeemvereisten van Portainer noemen geen minimale hoeveelheid RAM: de Server draait als lichtgewicht container, en de prestatierichtlijnen in de documentatie gaan over schijfruimte, niet over geheugen. Bepaal hoeveel RAM je nodig hebt door de gedocumenteerde vereisten van het besturingssysteem, de Docker-daemon en elke app die je gaat draaien op te tellen, en laat ruimte over voor pieken.

Bij DreamHost krijg je bij ons instappakket voor VPS Hosting, Stack 4, 4 GB RAM: een startpunt voor één of twee lichte containers. Een stack met n8n, Ghost en een database past in Stack 8, het pakket dat onze Docker-pagina aanbeveelt voor apps in productie. Of 4 GB genoeg is, hangt af van de apps die je echt draait. Groeit je berekening eroverheen, dan kun je overstappen naar een groter Stack-pakket.

Is Portainer gratis?

Ja, zelfs op twee manieren. Portainer Community Edition is gratis en open source, zonder licentiesleutel. Portainer Business Edition (met extra functies zoals rolgebaseerd toegangsbeheer) is ook gratis voor maximaal 3 nodes, met alle functies en zonder tijdslimiet: in plaats van te betalen registreer je je voor een gratis licentiesleutel. Boven de drie nodes beginnen de prijzen voor Business volgens de prijspagina van Portainer bij $105/mnd voor het Starter-abonnement (per augustus 2026), en een Home & Student-licentie van $155/jaar dekt niet-commerciële homelabs tot 15 nodes.

Kan Portainer meerdere Docker-hosts beheren?

Ja, Portainer beheert meerdere Docker-hosts via Agents en Edge Agents. De standaard Agent luistert op poort 9001 op elke externe host. Edge Agents maken juist zelf een uitgaande verbinding met tunnelpoort 8000 van de Portainer Server en hebben volgens de vereistendocumentatie van Portainer zelf geen open inkomende poorten nodig. Voor een zelfhoster met één VPS is dat allemaal niet nodig. Daarom laat de installatie in deze gids de flag voor poort 8000 weg die wel in de officiële opdracht van Portainer staat. Zodra je een externe omgeving via een Edge Agent koppelt, implementeer je Portainer opnieuw met -p 8000:8000 erbij. Sta daarna containerpoort 8000 toe via UFW vanaf het openbare uitgaande IP-adres van elke Edge Agent, en vervang hier EDGE_AGENT_IP: sudo ufw route allow proto tcp from EDGE_AGENT_IP to any port 8000.

Omzeilt Docker UFW op een VPS?

Ja, Docker omzeilt UFW standaard, omdat Docker containerverkeer afhandelt op de NAT-laag van iptables, die vóór de INPUT- en OUTPUT-chains van UFW zit.

Volgens de documentatie over pakketfiltering van Docker: packets are diverted before it reaches the INPUT and OUTPUT chains that ufw uses. De oplossing is om je regels toe te voegen aan de iptables-chain DOCKER-USER, en een communitytool om UFW daaraan te koppelen is chaifeng/ufw-docker, die je in stap 4 van deze gids installeert, nog voordat Portainer ooit start.

Hulp nodig?

Of je nu vastzit of gewoon wat starttips nodig hebt: onze experts staan altijd voor je klaar. We helpen je graag.

Hulp van DreamHost Sales

24/7/365 via het chatvenster

Klantenservice via chat

24/7/365 via Panel

Ga naar Panel
E-mail klantenservice

24/7/365 via Panel

Ga naar Panel