
Minisforum MS-A2: Homelab Setup Teil 2 – Docker und Portainer in Proxmox
Nach der erfolgreichen Einrichtung von Proxmox auf dem Minisforum MS-A2 in Teil 1 unseres Homelab Setups folgt im zweiten Schritt der Aufbau der Docker-Umgebung.
Heute werden wir:
- Docker in einem LXC Container in Proxmox ans Laufen bekommen
- Portainer in diesem Container installieren
- Ein benutzerdefiniertes Docker Netzwerk einrichten, das Container ins lokale Heimnetz hängen kann
- AdGuard als Beispiel Container über Portainer installieren und starten.
Kurzer Exkurs LXC Container vs Virtual Machines
Einleitend: Den Begriff Docker Container selbst verwende ich hier synonym für alle OCI-kompatiblen Container Formate. OCI ist dabei die von Docker Inc veröffentlichte „Open Container Initiative“, denen viele Container Formate (Red Hat’s Podman, containerd, usw.) als Industriestandard folgen.
In Proxmox kann man Docker entweder in einer vollwertigen VM oder in einem LXC-Container betreiben. Eine VM bietet maximale Kompatibilität und eine saubere Trennung durch ihren eigenen Kernel – das ist stabiler bei Updates und ggfls. nochmal sicherer in der Isolation. Dafür braucht sie aber mehr Ressourcen, da jedes Betriebssystem separat läuft. Ein LXC hingegen teilt sich den Kernel mit dem Host und ist dadurch extrem leichtgewichtig: weniger Overhead, schneller Start und effizienterer Ressourceneinsatz. Manche Funktionen (z. B. spezielle Netzwerk-Setups mit VLANS etc) können im LXC eingeschränkt sein, doch für unsere Zwecke hier – einfache Containerdienste, die über Portainer verwaltet werden – reicht ein LXC vollkommen aus. Deshalb entscheide ich mich hier bewusst für die schlanke LXC-Variante.
Installation LXC mit Docker & Portainer
Für die Installation von Standard Diensten wie Docker, gibt es in Proxmox die sog. Proxmox VE Helper-Scripts. Diese Skripte werden von der Open Source Community öffentlich gepflegt und sind ein sehr guter Einstieg, der einem das heavy lifting bei der Installation in Proxmox erstmal abnimmt.
Hinweis: Wenn ihr nach diesen Skripten sucht, stellt sicher, dass ihr die verlinkte Version verwendet oder die, die zu diesem Github Repo gehört. Es existieren im Internet noch viele Links auf eine ältere Version vom Original-Maintainer „tteck“, der jedoch inzwischen leider verstorben ist. Die hier verlinkte Version ist die weitergepflegte Variante, die auf tteck’s Arbeit basiert.
Auf der Proxmox VE Helper-Scripts Seite gebt also docker in das Suchfeld ein, wählt die LXC Variante die auftaucht und ihr kommt auf diese Seite.
Ihr müsst euch einmal den bash Befehl rauskopieren, der das Script ausführt:
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/docker.sh)"
und diesen Dann in der Proxmox VE-Shell ausführen. Die VE-Shell startet ihr indem ihr in Proxmox in eurem Datacenter die Proxmox Node auswählt und dann oben rechts den „>_ Shell
“ Button klickt.
Dort dann den obigen bash
Befehl reinkopieren. Der lädt diese Datei aus dem Internet und führt sie aus.
Jetzt werden diverse Fragen gestellt, auf die ich diese Antworten gebe:
Advanced Config
Privileged
- Container ID:
100
- Hostname:
docker
- Disk Size: bspw.
64gb
- Cores: bspw.
4
- RAM: bspw.
12288
MiB (entspricht 12GB * 1024) - Network Bridge
vmbr0
- Freie static IP aus eurem Netz: bspw:
192.168.178.4/24
(das /24 ist die 255.255.255.0 subnet mask) - Euer lokaler Gateway: Bspw.
192.168.178.1
- IPv6 deaktivieren
- APT-Cacher IP leer lassen
- MTU default
- DNS Search Domain leer lassen
- DNS Server IP wenn ihr nichts außergewöhnliches habt in der Regel dieselbe wie der Gateway:
192.168.178.1
- Im Rest kann man immer den Default bestätigen (MAC, VLAN, tags, root cert und access, fuse, etc.)
- Bei der Frage nach dem Storage Pool, wählen wir zdata, das wir in Teil 1 eingerichtet haben.
- Sonst wieder Defaults wählen.
- Jetzt wird das Installationsskript gestartet, da kommen auch nochmal Fragen:
- Den
Docker Compose v2 plugin
wollen wir installieren. - Ebenso die Portainer UI.
- Den Docker TCP Socket (Zugriff auf eine Docker API) benötigen wir nicht exposed, hier kann man „No“ wählen.
- Den
























Portainer konfigurieren
Der LXC ist jetzt gestartet und wir können Portainer aufrufen: https://192.168.178.4:9443
und einen Admin User anlegen.
Hinweis: Wenn man hier jetzt Pause gemacht hat, kann man den Portainer Wizard nicht mehr aufrufen. Das ist ein Sicherheitsfeature. Wenn man da eine entsprechende Fehlermeldung bekommt, muss man den Container neu starten. Dafür in Proxmox links den Node Tree aufklappen, bis man den Container sieht und ihn auswählen -> auf „>_ Console“ klicken und in dieser einloggen und dann
docker stop portainer
gefolgt vondocker start portainer
ausführen. Dann kann man den Wizard wieder aufrufen.
In der Portainer Übersicht jetzt auf „Live Connect“ klicken und man hat die Übersicht, der auf dem Host laufenden Docker Container und übrigen Settings.




Netzwerk verstehen und einrichten
Docker Container können auf verschiedene Arten im Netz verfügbar gemacht werden. Ich will hier nicht zu sehr ins Detail gehen, aber zusammengefasst kann man einen Container entweder so konfigurieren, dass man Ports auf dem Container Host selektiv freigibt, die dann an den Container weitergereicht werden (ähnlich zu Port Forwarding in einem Router), oder man konfiguriert den Container so, dass er eine statische oder dynamische IP bekommt und unter der voll verfügbar ist.
Der Modus mit dem Port Forwarding nennt sich Bridge-Modus
. Den haben wir oben schon verwendet, denn unser Portainer läuft im Bridge Modus in Proxmox, weswegen wir den Port 9443 explizit aufrufen müssen. Der Vorteil vom Bridge Modus ist, dass man halt volle Kontrolle darüber hat, welchen Port man überhaupt im Container freigibt. Das ist ein bisschen sicherer. Der Nachteil ist, dass es gerade, wenn mehrere ähnliche Container auf einem Host System laufen sollen, man schnell auch mal mit den Ports etwas durcheinander kommen kann. Ebenso macht es die Netzwerkanalyse unter Umständen etwas unübersichtlich, da sich am Ende viele Services dieselbe IP teilen, was heißt, dass man da die Quellen von Aufrufen bspw in Logs nicht immer klar sieht. Ich persönlich mag es, wenn jeder Service seine eigene IP bekommt und auch in meinem Router sichtbar und verwaltbar ist, daher nehme ich meist nicht den bridge Modus
, sondern verwende den Macvlan-Modus
.
Im
macvlan Modus
bekommt ein Container eine vollwertige lokale IP zugewiesen unter der er erreichbar ist.
Damit wir einen Container so starten können, müssen wir ein Docker Netzwerk einrichten. Das geht in der Portainer UI, oder auf der Kommandozeile.
Netzwerk auf Kommandozeile anlegen
Um es auf der Kommandozeile zu machen, loggt euch in die Shell eures LXC Containers ein. Proxmox ->Links proxmox ausklappen -> 100 (docker) -> Oben Rechts >_ Console
. Dann dort den folgenden Befehl ausführen (IPs für euer Netz anpassen):
docker network create -d macvlan \
--subnet=192.168.178.0/24 \
--gateway=192.168.178.1 \
-o parent=eth0 \
mylocal_net
Der Befehl erstellt ein Netzwerk mit Namen mylocal_net, das im 192.168.178.xxx
Adressbereich liegt und 192.168.178.1
als Gateway verwendet.
Hinweis:
eth0
ist der Name der Netzwerkkarte, die das Helper Skript in eurem LXC angelegt hat. Sollte eure Umgebung hier abweichen und ihr habt ein nicht Standard Setup, könnt ihr den Namen der Netzwerkkarte rausfinden, indem ihr in der LXC Console wo ihr auch das docker network create machen könnt den Befehl ip link ausführt. Dort steht dann sowaseth0@if10
und der richtige Name ist das vor dem @ Zeichen.
Alternativ könnt ihr das Netzwerk über die Portainer UI anlegen.
Netzwerk in Portainer anlegen
Stellt sicher, dass ihr in Portainer auf Live Connect
geklickt habt und geht dann links im local
Bereich auf Networks -> Add network
.
Zuerst brauchen wir eine macvlan Konfiguration. Tragt das hier ein:
- Name:
local_macvlan_config
- Driver:
macvlan
Configuration
auswählen- Parent network card:
eth0
(siehe Kommentar oben) - Subnet:
192.168.178.0/24
- Gateway:
192.168.178.1
- Rest leer / default
Klickt auf Create the network. Dann können wir das konkrete Netzwerk erstellen, indem wir erneut auf Add Network gehen:
- Name:
mylocal_net
- Driver:
macvlan
- Creation auswählen
- Configuration:
local_macvlan_config





Jetzt können wir einen Docker Container mit diesem Netzwerk anlegen.
AdGuard als Beispiel Docker Container mit fester IP
Wir erstellen hier als Beispiel einen AdGuard Docker container, aber jeder andere Container geht natürlich auch. Geht hierfür in Portainer auf local -> Stacks -> Add stack
.
Wählt einen Namen, bspw. adguard
Im Web editor fügen wir nun dieses docker-compose File ein, das auf das offizielle adguardhome Image verweist und dies in dem von uns angelegten mylocal_net starten wird:
version: '3'
services:
adguard:
image: adguard/adguardhome
container_name: adguardhome
restart: unless-stopped
networks:
mylocal_net:
ipv4_address: 192.168.178.201
volumes:
- adguard_work:/opt/adguardhome/work
- adguard_conf:/opt/adguardhome/conf
volumes:
adguard_work:
adguard_conf:
networks:
mylocal_net:
external: true
Klickt auf Deploy the stack
und AdGuard wird gestartet. Am besten schaut ihr jetzt in das Log File des neuen Containers. Das findet ihr unter Local -> Stacks -> adguard -> adguardhome (bei containers) -> Logs. Im Log steht dann auch go to http://192.168.178.201:3000/install.html
wo ihr den AdGuard Install Wizard findet werdet. Ein Setup von AdGuard habe ich in diesem Beitrag schonmal beschrieben.







Fazit
Herzlichen Glückwunsch, ihr habt in eurem Proxmox einen LXC Container erstellt, in dem docker läuft und portainer (als docker container). Ihr habt außerdem ein macvlan erstellt und damit AdGuard als Docker container mit vollwertiger lokaler IP gestartet.
Zum Schluss noch ein paar hilfreiche Tipps
- Ihr könnt natürlich alle docker Kommandos auch ohne portainer direkt in eurem Docker LXC ausführen.
Proxmox -> Links Nodes aufklappen -> 100 (docker) -> rechts ">_ Console
“ - Im AdGuard Beispiel hier drüber werden zwei lokale Pfade, nämlich
adguard_work
undadguard_conf
in den AdGuard Container gemounted. Docker Container speichern in der Regel keine Daten im Container selbst, sondern verwenden dafür eingebundene (gemountete) Pfade wie diese. Der eigentliche Speicherort liegt dabei in eurem Proxmox Dateisystem und ihr könnt so auch Dateien da rein- und rauskopieren oder bspw Backups eurer Dateien anlegen. Ihr findet diese Dateien in eurer Proxmox node:Proxmox -> links Top Level proxmox Node -> Rechts: >_ Shell
. Wenn ihr wie in Teil 1 beschrieben habt euer Proxmox Volume zdata genannt habt, sind diese Pfade bspw hier:
root@proxmox:/zdata/subvol-100-disk-0/var/lib/docker/volumes# ls -lah
total 24K
drwx-----x 5 root root 7 Jun 19 00:25 .
drwx--x--- 12 root root 13 Jun 19 00:05 ..
drwx-----x 3 root root 3 Jun 19 00:25 adguard_adguard_conf
drwx-----x 3 root root 3 Jun 18 19:52 adguard_adguard_work
Hier ist:
- zdata der Name unseres Proxmox Volumes
- ist das Volume unseres LXC Containers mit id 100
- Darin ist der Pfad zu den Docker Volumes, die Portainer / docker compose angelegt hat. Der Name setzt sich zusammen aus dem Namen des stacks / containers vor dem ersten Unterstrich und hinter dem Unterstrich kommt dann der Name des gemounteten Volumes
Viel Spaß beim rumspielen mit Containern in eurem Homelab.
Hier noch ein paar Affiliate Links auf Hardware Empfehlungen für euer Homelab. Jeder klick hilft. Danke 🙂
- Power User
- Minisforum MS-A2
- Western Digital 8 TB SSD für max Storage
- beliebte Alternative: Samsung 990 EVO Plus 4 TB SSD
- Western Digital 1 TB SSD als Boot Drive
- Crucial DDR5 RAM 128GB Kit (2x64GB) 5600MHz SODIMM
- In Kombination mit NAS
- Synology DS923+
- Bei mir seit Jahren zuverlässig: Western Digital Red Pro 8TB
- Einsteiger
