Wechsel von docker zu podman
Inhaltsverzeichnis
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 wollenpodman-docker: ein Package, das dendocker-Command als Alias fürpodmaninstalliert.docker-compose: das originale docker-compose-Tool. Überpodman composewird dies automatisch aufgerufen. Ich habe mich bewusst nicht fürpodman-composeentschieden, 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 :) #
- https://podman.io/docs/installation
- https://www.reddit.com/r/podman/comments/z70zhv/cant_find_storageconf_on_a_fresh_debian_install/
- https://docs.podman.io/en/stable/markdown/podman.1.html
- https://github.com/docker/compose
- https://github.com/containers/podman-compose/issues/587
- https://linuxhandbook.com/courses/podman/autostart-podman-containers/
- https://discussion.fedoraproject.org/t/unable-to-move-podman-containers-to-new-location-on-coreos/139304
-
Ja, ich weiß, dass ich immer noch
docker-composeverwende, aber das entferne ich auch langsam aus der Infra. Schritt für Schritt,podman-composeist einfach für meine Anwendungsfälle einfach noch nicht reif genug. ↩︎