Tech

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.

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 von docker 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 sowas eth0@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 und adguard_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 🙂

Eine Antwort schreiben

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert