← Übersicht  ·  Skripte & Dateien  ·  cloud-host · Referenz

Podman & Docker auf dem Laptop

Wie Container-Werkzeug unter Windows wirklich läuft – ein Client im PATH (Programmsuchpfad), der über SSH (Secure Shell) mit einem Linux redet: entweder der WSL2-Maschine auf dem Laptop oder einem Server bei Hetzner. Mit Bezug auf diese Installation, dem Umschalten zwischen lokal und Server, und der Frage „warum sehe ich meine Images nicht?“.

Windows 10 · podman 6.0.2 WSL2 (Windows Subsystem for Linux 2) · rootless Stand: 31. August 2026

01 Deine Installation

Der Ist-Zustand auf dem Laptop – damit die restlichen Abschnitte konkret sind.

Podmanpodman 6.0.2, per winget (Paket Podman.CLI). Update auf 6.1.0 verfügbar: winget upgrade Podman.CLI.
Maschinepodman-machine-default – Typ WSL (Windows Subsystem for Linux), 4 vCPU, 2 GiB RAM (Random Access Memory), 100 GiB Disk, rootless (kein root-Modus).
DockerNicht installiert. Kein docker-Befehl im PATH, kein Docker Desktop.
Composepodman-compose via scoop (Python). podman compose … ruft es automatisch auf.
Connectionsdrei Stk. – podman-machine-default (lokal, rootless, Default), podman-machine-default-root (lokal, rootful), hetzner (Remote-Server, wird von cloud.ps1 angelegt).
WSL-Distrospodman-machine-default (von Podman verwaltet) und ein separates Ubuntu (unabhängig, aktuell gestoppt).
In einem Satz

Du hast Podman lokal (in einer kleinen Linux-VM) und kein Docker. Für dieses Repo ist das genau richtig – der Laptop ist nur Fernbedienung, die Container laufen auf dem Server.

02 Wie Podman unter Windows läuft

Container brauchen einen Linux-Kernel. Windows hat keinen – also läuft immer irgendwo ein Linux, und podman.exe ist nur der Client davor.

Der Unterschied, aus dem sich fast alles Weitere ergibt: wie viele Kerne laufen hier eigentlich?

Zeichnung aus Diagramme: Hetzner & CRC (17).

Virtuelle Maschine Anwendung Anwendung vollständiges Gast-Betriebssystem eigener Kernel virtuelle Hardware (Hypervisor) Kernel des Wirts Trennung durch den Hypervisor: hart. Start in Minuten, GB an Speicher. Container Anwendung Anwendung nur Bibliotheken nur Bibliotheken Namespaces + cgroups getrennte Sicht, geteilte Maschine EIN gemeinsamer Kernel Kein Betriebssystem im Container – nur Dateien. Start in Sekunden, MB an Speicher. Eine Kernel-Lücke betrifft alle gleichzeitig. Deshalb: nie --privileged. WSL2 – und damit dein Laptop deine Container Namespaces + cgroups echter Linux-Kernel Hyper-V – also doch eine VM Windows-Kernel WSL2 ist eine leichtgewichtige VM – sie startet schnell und teilt Speicher dynamisch, bleibt aber eine eigene Maschine. Die Folge, die in dieser Sammlung immer wieder auftaucht Ein Linux-Container braucht einen Linux-Kernel. Windows hat keinen. Also steht unter Windows immer eine VM dazwischen – bei Podman die WSL-Maschine, bei CRC eine Hyper-V-VM. Beides sind eigenständige Rechner mit eigenem Netz. Daraus folgt unmittelbar Zeichnung 09: 127.0.0.1 bedeutet in der WSL-Maschine, in der CRC-VM und auf dem Windows-Host jeweils etwas anderes – drei Loopback-Adressen, drei verschiedene Maschinen. Auf dem Hetzner-Server entfällt die Zwischenschicht: dort läuft Linux, und die Container laufen direkt auf dessen Kernel.
Ein Container ist keine kleine VM. Er ist ein Prozess auf dem Kernel des Wirts, dem man eine eigene Sicht auf Dateisystem, Netz und Prozessliste gegeben hat. Das macht ihn schnell und klein – und erklärt zugleich, warum ein Zugriff auf den Container-Socket gleichbedeutend mit Root auf dem Wirt ist.
TeilWoAufgabe
podman.exeWindows, im PATHDer Client. Nimmt deine Befehle entgegen, schickt sie per SSH / API-Socket an ein Linux und zeigt das Ergebnis. Baut selbst keine Container.
Podman-MaschineWSL2-VM (podman-machine-default)Ein schlankes Linux (Fedora CoreOS-artig) in WSL. Hier laufen die Container, hier liegen die Images. Startet nicht automatisch mit Windows.
Remote-HostHetzner-ServerOptional dasselbe wie die Maschine, nur in der Cloud. Der Client redet per SSH zum podman.socket dort.
Podman DesktopWindows (optional)Grafische Oberfläche über denselben Client – separat: winget install RedHat.Podman-Desktop. Nicht nötig, aber bequem fürs Draufschauen.

Kein Daemon. Anders als Docker läuft bei Podman kein Hintergrunddienst als root. Jeder podman-Aufruf startet kurz einen Prozess, macht seine Arbeit, ist weg. Das ist der Grund, warum es „rootless“ kann und warum ein abgestürzter Daemon nie das Problem ist – es gibt keinen.

Merksatz

podman ... auf dem Laptop tut nichts lokal – es fragt die gerade als Default gesetzte Connection. Ist das die Maschine, siehst du Laptop-Container. Ist es hetzner, siehst du die vom Server. Das ist die häufigste Verwirrung – Abschnitt 5.

03 Rootless: als dein User, nicht als root

Deine Maschine läuft rootless – der Normalfall bei Podman. Das prägt, wie Ports, Dateirechte und ein paar Images sich verhalten.

Was das heißt

Container-Prozesse laufen mit deinen Rechten, nicht als root. Es gibt keinen privilegierten Dienst dazwischen – nichts, was ein Angreifer aus einem Container heraus übernehmen könnte, um dann als root auf dem Host zu sitzen. Ein Ausbruch landet bestenfalls bei deinem Benutzerkonto.

Wie es funktioniert – User-Namespaces

Innerhalb des Containers gibt es root (UID 0), aber das ist eine Illusion: UID (User Identifier) 0 im Container = dein User auf dem Host. Alle anderen Container-UIDs werden auf einen dir zugeteilten Bereich abgebildet (aus /etc/subuid / /etc/subgid, meist 65 536 IDs ab 100000). Nachsehen:

Laptop · PowerShell
podman machine ssh cat /etc/subuid           # dein zugeteilter UID-Bereich
podman unshare cat /proc/self/uid_map        # die Abbildung Container -> Host
podman info --format "{{.Host.Security.Rootless}}"   # true

Die drei Folgen im Alltag

ThemaWas rootless anders macht
Ports < 1024Ein normaler User darf sie nicht binden. In der Podman-Maschine ist net.ipv4.ip_unprivileged_port_start=80 meist schon gesetzt, dann geht -p 80:80. Sonst: hoher Port (-p 8080:80) + Reverse Proxy, oder auf einem Server den sysctl setzen (macht die Container-Host-Anleitung).
Datei-Eigentümer in VolumesSchreibt der Container als „root“, gehört die Datei auf dem Host dir. Schreibt er als UID 33 (www-data), gehört sie einer hohen Host-UID wie 100032 – sieht „fremd“ aus, ist normal. Rechte anpassen: podman unshare chown -R 33:33 ./data oder Mount mit :U.
Images, die echtes root wollenSelten – manche System-Container (systemd drin), alte Software. Dann rootful fahren: podman --connection podman-machine-default-root run … lokal, oder sudo podman auf einem Server.
rootless und rootful sind getrennte Welten

Die Connection podman-machine-default (rootless) und podman-machine-default-root (rootful) haben eigene Images, Container und Volumes. Was du rootless gebaut hast, sieht rootless-podmansudo podman bzw. die -root-Connection sieht es nicht, und umgekehrt. „Mein Image ist weg“ liegt oft nur daran, dass man versehentlich die andere Seite fragt.

Auf dem Hetzner-Server

Die cloud-init.yaml aktiviert podman.socket als System-Socket – die hetzner-Connection zeigt also auf root@…, dort läuft Podman rootful. Für einen Wegwerf-Server mit einem Zweck ist das ok. Die Sicherheits-Vorteile von rootless holt man sich eher auf einem Host, der länger steht (siehe Server-Hardening).

04 Die Podman-Maschine steuern

Die lokale Linux-VM. Ein paar Befehle reichen für den Alltag.

Laptop · PowerShell
podman machine list                 # welche Maschinen, laufen sie?
podman machine start                # die (einzige) Maschine hochfahren
podman machine stop                 # runterfahren (Container werden gestoppt)
podman machine ssh                  # Shell in die VM
podman machine info                 # CPU/RAM/Disk, Podman-Version drin

Nach jedem Windows-Neustart oder Ruhezustand ist die Maschine oft aus (oder halb da – siehe Troubleshooting). Erst podman machine start, dann arbeiten.

Ressourcen ändern

Deine Maschine hat 2 GiB RAM – für ein, zwei Test-Container ok, für einen lokalen Stack (Datenbank + App + Proxy) schnell zu wenig. Anpassen geht nur bei gestoppter Maschine:

Laptop · PowerShell
podman machine stop
podman machine set --cpus 4 --memory 4096      # RAM auf 4 GiB
podman machine set --disk-size 120             # Disk NUR vergroessern, nie kleiner
podman machine start

Neu aufsetzen

Wenn die Maschine kaputt ist, ist sie schnell ersetzt (Images/Container darin sind dann weg – die auf dem Server nicht):

Laptop · PowerShell
podman machine stop
podman machine rm podman-machine-default       # fragt nach, loescht die VM
podman machine init --cpus 4 --memory 4096 --disk-size 100
podman machine start
Wo die Images physisch liegen

In der VM (virtuelle Maschine) unter ~/.local/share/containers/storage (rootless). Nach Windows durchgereicht wird das nicht als Ordner – es steckt in der WSL-Disk (ext4.vhdx unter %LOCALAPPDATA%\containers\podman\machine\wsl). Reinschauen: podman machine ssh, dann normale Linux-Befehle. Platz prüfen: podman system df.

05 Connections: lokal ↔ Server umschalten

Der Punkt, der dich zweimal erwischt hat. Eine Connection ist ein benanntes Ziel (Adresse + SSH-Key). Eine davon ist Default – die fragt jeder podman-Befehl ohne --connection.

Laptop · PowerShell
podman system connection list
NameZielWann
podman-machine-defaultlokale VM, rootlessDer Normalfall. Deine Laptop-Container.
podman-machine-default-rootlokale VM, als rootNur wenn du Ports < 1024 ohne Extra-Config brauchst oder etwas root verlangt.
hetznerssh://root@<server-ip>Zeigt auf den Cloud-Server. Legt cloud.ps1 beim up an und macht sie zum Default.

Umschalten

Laptop · PowerShell
# dauerhaft: Default setzen
podman system connection default podman-machine-default   # zurueck auf lokal
podman system connection default hetzner                  # auf den Server

# einmalig, ohne den Default zu aendern
podman --connection podman-machine-default images
podman -c hetzner ps
Die Falle nach cloud.ps1

.\scripts\cloud.ps1 up setzt den Default auf hetzner. Ab da zeigt podman images die Images auf dem Server, nicht die vom Laptop – das ist Absicht, damit podman build/run auf dem Server landen.

Nach cloud.ps1 down ist der Server gelöscht, die Connection hetzner zeigt aber weiter ins Leere – podman images hängt dann in einen SSH-Timeout. Neuere Fassung des Skripts stellt den Default beim down automatisch auf die lokale Maschine zurück. Sonst von Hand: podman system connection default podman-machine-default.

06 Images & Container ansehen

Die Alltagsbefehle. Alle gehen an die Default-Connection – erst prüfen, worauf die zeigt (Abschnitt 5).

Laptop · PowerShell
podman images                       # heruntergeladene/gebaute Images
podman ps                           # laufende Container
podman ps -a                        # auch gestoppte
podman pull docker.io/library/nginx:alpine
podman run --rm -p 8080:80 nginx:alpine     # http://localhost:8080
podman build -t mein-image .        # aus dem Containerfile/Dockerfile hier

podman system df                    # Speicher: Images / Container / Volumes
podman image prune                  # baumelnde Images weg
podman system prune -a              # alles Ungenutzte weg (Vorsicht)
podman rmi <image>                   # ein Image loeschen
Schnelltest „alles ok“

podman run --rm docker.io/library/hello-world – lädt ein winziges Image und gibt einen Grußtext aus. Klappt das, stimmt die ganze Kette (Client → Maschine → Netz).

Grafisch: Podman Desktop (winget install RedHat.Podman-Desktop) zeigt Images, Container, Volumes und Logs in einem Fenster – und hängt sich an dieselben Connections, also auch an hetzner.

07 Podman vs. Docker

Die CLI (Command-Line Interface) ist zu >95 % deckungsgleich – docker run… wird zu podman run…. Die Unterschiede darunter:

Warum Daten im Container verschwinden, was ein Tag wirklich ist, und wieso ein Rebuild oft Sekunden dauert.

Zeichnung aus Diagramme: Hetzner & CRC (18).

Dockerfile FROM eclipse-temurin:21 WORKDIR /app COPY target/*.jar app.jar EXPOSE 8081 ENTRYPOINT ["java","-jar",…] Jede Anweisung, die etwas am Dateisystem ändert, wird eine Schicht. build Image – unveränderlicher Stapel 4 · ENTRYPOINT (nur Metadaten) 3 · app.jar – 40 MB 2 · /app angelegt – wenige Bytes 1 · Java-Laufzeit – 180 MB Nur Schicht 3 ändert sich beim nächsten Build – der Rest kommt aus dem Cache. run Container – laufender Prozess schreibbare Schicht weg, sobald der Container gelöscht wird dieselben vier Schichten – nur lesend geteilt mit jedem anderen Container aus dem Image Volume – außerhalb des Stapels überlebt Löschen und Neuerstellen Tag gegen Digest ghcr.io/nursude/app:latest ein Etikett – kann jederzeit auf ein anderes Image zeigen …@sha256:9f2c4a… der Inhalt selbst – ändert sich der Inhalt, ändert sich der Digest Deshalb der Commit-Hash als Tag: ein Etikett, das nie wandert. Zwei Fallen, die daraus folgen 1. Ein gepushtes Image unter demselben Tag zieht Kubernetes nicht neu – der Tag ist ja bekannt. Der alte Container läuft weiter, und man sucht den Fehler im Code. Der Tag muss sich ändern. 2. Ein Passwort in einer Schicht bleibt darin, auch wenn eine spätere Schicht es löscht. Schichten werden gestapelt, nie überschrieben. Warum der zweite Build so viel schneller ist: jede Schicht ist über ihren Inhalt adressiert. Ändert sich nur das jar, bleiben die 180 MB Java-Laufzeit unberührt – weder neu gebaut noch neu übertragen. Genau deshalb steht COPY app.jar im Dockerfile nach allem, was sich selten ändert. Und deshalb gibt es Volumes: alles, was einen Neustart des Containers überleben soll, darf nicht in der schreibbaren Schicht liegen. In Kubernetes heißt dasselbe Prinzip emptyDir (weg mit dem Pod) gegen PersistentVolumeClaim (bleibt) – die ganze Matrix dazu ist Zeichnung 36.
Das Image ist unveränderlich, der Container ist vergänglich. Alles, was ein Container schreibt, landet in einer dünnen Schicht obendrauf, die mit ihm verschwindet. Wer das verinnerlicht hat, versteht ohne weitere Erklärung, warum es Volumes gibt, warum ein Tag sich ändern muss und warum Container-Images so klein sein können.
ThemaPodmanDocker
Architekturdaemonless – jeder Befehl ein Prozesszentraler dockerd-Dienst als root
RootlessStandard – läuft als dein Usergeht, ist aber Opt-in und selten genutzt
CLInahezu identisch – alias docker=podman reicht meist. Flags, Dockerfile, Registries: gleich.
Composepodman compose braucht podman-compose oder docker-compose als Provider. Alternativ Pods / Quadlet / kube play.docker compose eingebaut (Plugin)
Podsja – mehrere Container teilen ein Netz-Namespace, wie ein Kubernetes-Pod. podman kube generate/play.nein (nur Compose-„Services“)
Autostartüber systemd / Quadlet (.container-Dateien) – sauber, kein --restart-Hack nötig--restart=always über den Daemon
Docker-APIpodman system service stellt einen Docker-kompatiblen Socket bereit – Tools, die DOCKER_HOST erwarten, funktionierenist die Referenz
LizenzApache 2.0, komplett frei – auch die GUI (Graphical User Interface)Engine frei, Docker Desktop ab größerer Firma kostenpflichtig
Für dieses Repo

Die Container-Host-Anleitung hat einen Umschalter Podman/Docker. Auf dem Server ist die Wahl fast egal – Podman ist Vorgabe, weil rootless + Quadlet gut zum „Server wegwerfen“-Ansatz passen. Auf dem Laptop brauchst du keins von beiden zwingend. Podman ist da, das reicht als Client.

08 Wenn du Docker lokal brauchst

Etwa weil ein Tool hart docker erwartet oder eine Anleitung docker compose nutzt. Vier Wege, von leicht nach schwer:

Derselbe Befehlssatz, ein grundlegend anderer Aufbau – und warum das für den Jenkins-Server wichtig war.

Zeichnung aus Diagramme: Hetzner & CRC (20).

Docker – mit Daemon docker run … (dein Befehl) über den Socket Unix-Socket, kein Netz dockerd – typische rootful-Installation /var/run/docker.sock – wer darauf schreiben darf, ist faktisch root Container A Container B Container C Alle Container sind Kinder des Daemons, nicht deiner Sitzung. Stirbt der Daemon, ist der Überblick weg – und beim Systemstart bringt er die Container mit restart: always von selbst zurück. Podman – normaler CLI-Aufruf ohne Daemon podman run … (dein Befehl) startet den Container direkt als eigenes Kind rootless: als du selbst, über User-Namespaces Container A Container B Im rootless-CLI-Fall kein dauerhafter Root-Prozess und damit keine zentrale Stelle, an der alles hängt. Autostart: systemd oder Socket-Service konfigurieren. Was in dieser Sammlung daran hängt 1. systemctl enable podman-restart.service aus der Jenkins-Anleitung – ohne Daemon bringt --restart=always die Container nach einem Neustart des Servers nicht zurück. Bei einem Server, der per Snapshot regelmäßig neu entsteht, ist das entscheidend. 2. podman system service stellt trotzdem einen Docker-kompatiblen Socket bereit – für Werkzeuge, die einen Daemon erwarten. Genau den bekommt Jenkins über CONTAINER_HOST und DOCKER_HOST hineingereicht. 3. Podman verlangt vollständige Image-Namen: jenkins/jenkins allein ergibt short-name did not resolve. Docker ergänzt still docker.io.
Derselbe Befehlssatz, ein anderer Aufbau. alias docker=podman funktioniert für den Alltag – die Unterschiede zeigen sich erst dort, wo es um Rechte, Neustarts und Werkzeuge geht, die einen Daemon erwarten. Genau diese drei Stellen sind es, an denen die Anleitungen dieser Sammlung nachhelfen müssen.
WegWomitAnmerkung
Nur die docker-CLI, Backend Podmanscoop install docker + podman system service --time=0 & in der Maschine, dann $env:DOCKER_HOST auf den Podman-SocketKein zweites System. docker und podman reden mit derselben VM.
Rancher Desktopwinget install suse.RancherDesktopFrei. Bringt echten dockerd (oder containerd) in WSL2, plus kubectl/k3s. Guter Docker-Desktop-Ersatz.
Docker Desktopwinget install Docker.DockerDesktopAm einfachsten, aber: Lizenz prüfen (ab ~250 MA / >10 Mio $ Umsatz kostenpflichtig). Läuft parallel zur Podman-Maschine, frisst RAM.
Docker Engine in der Ubuntu-Distroin wsl -d Ubuntu: curl -fsSL https://get.docker.com | shDeine Ubuntu-Distro ist schon da. Kein Windows-Integrationskomfort, aber voll unter Kontrolle.
Empfehlung

Für dieses Repo: nichts davon installieren. Wenn eine Anleitung docker compose zeigt, läuft das auf dem Server (dort ist Docker oder Podman via cloud-init.docker.yaml installiert). Brauchst du's doch lokal, nimm Zeile 1 (nur die CLI) – am wenigsten Ballast.

09 Einen Docker-Server vom Laptop steuern

Analog zur hetzner-Podman-Connection, nur für Docker.

Laptop · PowerShell
# Docker-Client (falls installiert) an den Server haengen
docker context create hetzner --docker "host=ssh://root@<server-ip>"
docker context use hetzner
docker ps                           # Container auf dem Server

# oder nur fuer einen Befehl
$env:DOCKER_HOST = "ssh://root@<server-ip>"; docker compose up -d

Voraussetzung ist derselbe SSH-Key wie für hcloud / die Podman-Connection (~/.ssh/id_ed25519, beim Server hinterlegt – siehe Server-Basis). Der Mehrere-Dienste-Guide und scripts/dienste-stack.ps1 machen genau das per SSH.

+ Wenn „Cannot connect to Podman“ kommt

Die Meldung unable to connect to Podman socket … connectex: No connection could be made heißt: der Client erreicht das Linux nicht.

  1. Zeigt die Connection irgendwohin Totes? podman system connection list – steht der Default auf hetzner und der Server ist unten/gelöscht, ist das die Ursache: podman system connection default podman-machine-default.
  2. Läuft die Maschine wirklich? podman machine list. Steht dort nicht laufend: podman machine start.
  3. Maschine „läuft“, Verbindung trotzdem tot (dein Fall neulich: wsl -l -v zeigt sie als Running, aber 127.0.0.1:<port> refused). Der SSH-Portforward ist nach dem Ruhezustand hängen geblieben. Neu aufsetzen des Tunnels:
    Laptop · PowerShell
    podman machine stop
    podman machine start
    Hilft das nicht: wsl --shutdown (schließt alle Distros!), dann podman machine start.
  4. WSL selbst zickt (WSL 2 requires an update o.ä.): wsl --update, danach podman machine start. Ganz selten: Virtualisierung im BIOS / Windows-Feature „VM-Plattform“ prüfen.
  5. Immer noch kaputt – Maschine wegwerfen und neu (Abschnitt 4, „Neu aufsetzen“). Lokale Images sind dann weg, sonst nichts.
Vorbeugen

Nach jedem Laptop-Start einmal podman machine start (ist die Maschine schon da, kommt nur eine kurze Meldung). Wer's automatisch will: eine Aufgabenplanung bei Anmeldung, analog zu scripts/install-autodown.ps1.

+ Bezug zu den Skripten

Was ghcr.io ist, warum drei verschiedene Registries im Spiel sind – und warum eine davon zwei Adressen hat.

Zeichnung aus Diagramme: Hetzner & CRC (19).

Ein Image-Name besteht aus vier Teilen ghcr.io / nursude / catalog-service : sha-a1b2c3d Host der Registry fehlt er, ergänzt Docker still docker.io – Podman verweigert Konto oder Organisation bei ghcr.io identisch mit dem GitHub-Konto Name des Images meist der Dienst Tag – verschiebbares Etikett hier der Commit-Hash, damit es nie wandert ohne Angabe: :latest – und damit unbestimmt Drei Registries, drei Aufgaben ghcr.io GitHub Container Registry Dein eigenes Lager. Die Images liegen beim selben Anbieter wie der Quellcode – eine Anmeldung weniger. Anmeldung: in Actions das automatische GITHUB_TOKEN, von Hand ein PAT mit write:packages. Öffentliches Ziehen ohne. Öffentlich kostenlos, privat auf das Kontingent. docker.io Docker Hub – die Vorgabe der Welt Von hier kommen die fremden Images: Postgres, Redis, Kafka, Keycloak. Anonymes Ziehen ist gedeckelt – in einer CI, die oft baut, läuft man dagegen. Genau deshalb liegen die eigenen Images woanders. Hier verschwanden 2025 auch die versionsgetaggten Bitnami-Images – daher bitnamilegacy. die Registry im Cluster bei CRC und OpenShift mitgeliefert Verlässt den Laptop nie. Für den lokalen Cluster reicht sie – für den Hetzner-Server nicht, der kommt nicht heran. Selbst unterschriebenes Zertifikat, daher beim Schieben --tls-verify=false. Und sie hat zwei Adressen – siehe unten. Warum die Cluster-Registry zwei Adressen hat default-route-openshift-image-registry.apps-crc.testing von außen – zum Schieben vom Laptop. Geht über den Router, also mit TLS. image-registry.openshift-image-registry.svc:5000 von innen – zum Ziehen durch die Pods. Cluster-interner Name, kein Router beteiligt. Was beim Ziehen passiert 1 · Manifest holen – die Liste der Schichten 2 · nachsehen, welche schon lokal liegen 3 · nur die fehlenden herunterladen Deshalb ist der zweite Pull fast umsonst. Eine Registry ist nichts weiter als ein Dateilager mit HTTP-Schnittstelle: sie kennt Manifeste (welche Schichten gehören zu diesem Namen) und Schichten (adressiert über ihre Prüfsumme). Sie führt nichts aus und weiß nichts von Containern. Für Hetzner ist sie das Ziel des Builds. Der CRC-Cluster zieht dagegen nie von hier, sondern aus seiner eigenen internen Registry – ohne dass Laptop und Server je miteinander sprechen müssten.
Ein Lager, kein Dienst. Die Registry speichert Schichten unter ihrer Prüfsumme und Manifeste unter einem Namen – mehr nicht. Welche man nimmt, ist eine Frage von Anmeldung, Erreichbarkeit und Abrufgrenzen: ghcr.io für die eigenen Images, docker.io für fremde, die Cluster-Registry für alles, was den Laptop nicht verlassen soll.
  • scripts/cloud.ps1 up baut den Server, legt die hetzner-Connection an und macht sie zum Podman-Default – danach landen podman-Befehle auf dem Server.
  • -CloudInit cloud-init.docker.yaml baut den Server stattdessen mit Docker (siehe Container-Host). Die hetzner-Podman-Connection zeigt dann auf einen Server ohne podman.socket – dort per ssh / docker context arbeiten (Abschnitt 9).
  • cloud.ps1 down löscht den Server. Danach den Podman-Default zurück auf podman-machine-default (neuere Skript-Fassung macht das selbst).
  • scripts/dienste-stack.ps1 steuert Docker-Compose-Stacks auf dem Server – komplett per SSH, ohne lokalen Docker-Client.

Alle Angaben Stand August 2026, podman 6. Preise/Server: Kosten & Budget.

⌂ Cockpit