Zum Hauptinhalt springen

Wechsel von docker zu podman

·3 min· Shortlink kopieren
tschüss 💥

Ich habe letztens einige meiner Service-Hosts von Debian 12 auf 13 geupdatet und habe dabei auch vom Container-Engine-Frontend docker-ce von Docker, Inc. zu podman gewechselt. Vorher hatte ich das docker-ce-Frontend aus dem APT-Repository von Docker, Inc. installiert, was ich nie wirklich mochte (Abhängigkeiten von externen Repositories, ein profitorientiertes Unternehmen als Rückgrat eines zentralen Teils meiner Infrastruktur1). Da Debian 13 nun endlich eine relativ ausgereifte Version von podman mitliefert, habe ich die Gelegenheit genutzt, um zu wechseln. Hier kurz, was ich dabei gemacht habe und welche schnellen Fehlerbehebungen ich durchführen musste.

Entfernen bestehender docker-compose Stacks #

Bevor ich überhaupt anfing, die Migration durchzuführen, habe ich alle docker-compose-Stacks in ihren jeweiligen Ordnern heruntergefahren:

docker compose down

Deinstallation von docker-ce #

Gemäß der offiziellen Docker-Dokumentation (wie mans macht) habe ich die auf dieser Seite aufgeführten Packages konsequent vom System genuked:

apt remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Danach noch schnell alle Überbleibsel entfernt, muss ja, ne?

apt autoremove

Installation von podman #

Um podman zu installieren, habe ich folgende Pakete installiert:

apt install podman podman-docker docker-compose

Dabei die folgenden Komponenten:

  • podman: das eigentlich Container-Frontend, das wir haben wollen
  • podman-docker: ein Package, das den docker-Command als Alias für podman installiert.
  • docker-compose: das originale docker-compose-Tool. Über podman compose wird dies automatisch aufgerufen. Ich habe mich bewusst nicht für podman-compose entschieden, da diese Implementation noch nicht bereit für meine Anwendungsfälle ist.

Ein paar schnelle Fixes #

docker.io als unqualifizierte Suchregistry #

Um die bestehende Deklaration von meinen Stacks beizubehalten (wo Docker Hub als primäre Quelle und unqualifizierte Registry genutzt wird), musste ich die neu installierte Container-Registry-Konfigdatei unter /etc/containers/registries.conf bearbeiten und docker.io als unqualifizierte Suchregistry hinzufügen:

unqualified-search-registries = ["docker.io"]

podman.socket systemd-Service #

Als ich anschließend meinen Stack starten wollte, bekam ich einen API-Timeout-Fehler, da der Podman-Client versuchte, den Service zu kontaktieren, der aber komischerweise noch nicht lief (strange…obwohl das Paket die Unit aktiviert ausliefert):

root@host-01:/stacks-of-cash# systemctl status podman.socket
○ podman.socket - Podman API Socket
     Loaded: loaded (/usr/lib/systemd/system/podman.socket; disabled; preset: enabled)
     Active: inactive (dead)
   Triggers: ● podman.service
       Docs: man:podman-system-service(1)
     Listen: /run/podman/podman.sock (Stream)

Ein schneller Fix war, den Socket-Service zu aktivieren:

systemctl enable --now podman.socket

Externes Datenverzeichnis #

Da ich vorher ein (externes) Verzeichnis für den Docker-Cache verwendet hatte, musste ich meine bestehende Docker-Konfiguration auch migrieren:

root@host-01:/stacks-of-cash# cat /etc/docker/daemon.json
{
	"data-root": "/mnt/docker-cache"
}

Dafür habe ich die Datei /etc/containers/storage.conf (Docs) erstellt und folgende Einträge hinzugefügt:

[storage]
driver = "overlay"
graphroot = "/mnt/docker-cache"
runroot = "/run/containers/storage"

Danach noch schnell das Cache-Verzeichnis bereinigt (rm -rf /mnt/docker-cache/*) und den Host sicherheitshalber mal neu gestartet.

Container-Autostart #

Nach dem nächsten Versuch, meine Stacks zu starten bemerkte ich, dass Container nach einem Neustart vom Host nicht automatisch gestartet wurden, obwohl in der docker-compose.yml-Datei das Attribut restart: always gesetzt war. Eine schnelle Google-Suche brachte die Lösung: eine weitere systemd-Unit (podman-restart.service) musste aktiviert werden.

systemctl enable --now podman-restart

Emulationswarnung ausschalten #

Da das Tippen vom docker-Command fest in meinem Workflow verankert ist und ich mich nicht so bald an podman gewöhnen möchte, nutze ich das Alias-Package. Podman erinnert einen jedoch jedes Mal beim Ausführen des docker-Alias, dass man eigentlich gerade podman ausführt. Diese Nachricht lässt sich jedoch schnell ausschalten:

touch /etc/containers/nodocker

Fertig! #

Nachdem alle Fixes gemacht waren, habe ich noch einmal den Host neu gestartet und war schließlich bereit, um meine Stacks wieder in Betrieb zu nehmen. Hier einer der Starts:

root@host-01:/stacks-of-cash# docker compose up -d
>>>> Executing external compose provider "/usr/libexec/docker/cli-plugins/docker-compose". Please see podman-compose(1) for how to disable this message. <<<<

[+] Running 2/2
 ✔ Network host-01_default   Created                                                                                             0.0s 
 ✔ Container boring-service   Started                                                                                             0.4s 
 ✔ Container watchtower       Started                                                                                             0.4s 

Erfolg! ✨

zeug das ich auf google dafür fand :) #


  1. Ja, ich weiß, dass ich immer noch docker-compose verwende, aber das entferne ich auch langsam aus der Infra. Schritt für Schritt, podman-compose ist einfach für meine Anwendungsfälle einfach noch nicht reif genug. ↩︎