Podman vs Docker: Vilken ska man välja?

Om du är intresserad av virtualisering och containerteknik har du antagligen stött på termerna Podman och Docker och undrar hur dessa skiljer sig åt.

I denna artikel kommer vi att undersöka de centrala skillnaderna mellan Docker och Podman, och hjälpa dig att bedöma vilket alternativ som passar bäst för dina behov!

Docker: Grunden för containerisering

Docker är en väletablerad containeriseringsteknik som förenklar hanteringen av beroenden i projekt, oavsett om det gäller utveckling eller driftsättning.

Docker, som fungerar på Linux, Windows och macOS, kretsar kring konceptet med containrar och deras orkestrering. Det är här som containerisering skiljer sig från traditionell virtualisering.

Docker bygger på två huvudsakliga komponenter: Docker CLI och Docker Daemon.

Docker Daemon:

Denna tjänst körs i bakgrunden och hanterar Docker-bilder, containrar, nätverk och lagringsvolymer. Docker Daemon kommunicerar med Docker CLI via Docker Engine REST API, som nås via HTTP.

Docker CLI:

Bildkälla: Redhat

Detta är Dockers kommandoradsverktyg för att interagera med Docker Daemon. Det är verktyget du använder när du utför ett Docker-kommando.

Docker använder sig av Linux-kärnan och dess funktionaliteter, som cgroups och namnrymder. Dessa funktioner isolerar processer så att de kan köras oberoende av varandra. Detta är kärnan i containerisering, att kunna köra flera processer och applikationer separat.

Detta möjliggör en effektivare användning av infrastrukturen utan att kompromissa med säkerheten, jämfört med att använda separata system.

Docker, liksom andra containerverktyg, bygger på en bildbaserad implementeringsmodell. Denna modell gör det enkelt att dela en applikation eller en uppsättning tjänster över olika miljöer.

Docker automatiserar också distributionen av applikationer i containermiljöer. Med hjälp av dessa verktyg får användare kontroll över applikationerna, kan snabba upp distributionen, hantera versioner och konfigurera tilldelningen av resurser.

Podman: En modern utmanare

Podman (POD MANager) är ett verktyg för att bygga, köra och hantera OCI-kompatibla containrar och containerbilder. Det utvecklades av Red Hat och var ursprungligen avsett för företagets Linux 8. Det fungerar som en efterträdare till Docker för containerhantering.

Red Hat avslutade stödet för Docker och försäkrade att övergången skulle vara smidig för användarna eftersom Podman bygger på Docker-teknik. Från början var Podman tänkt som ett felsökningsverktyg.

Podman hanterar hela container-ekosystemet med hjälp av libpod-biblioteket. Podman är inledningsvis enbart tillgängligt på Linux-plattformar, men ett REST API och klienter för macOS och Windows är under utveckling för att möjliggöra interaktion med tjänsten.

Det finns dock redan en Varlink-baserad fjärrklient för macOS och Windows som tillåter fjärrkommunikation med en Linux-baserad Podman-server. Libpod-biblioteket erbjuder flera metoder för säker inläsning av bilder, inklusive verifiering.

Podman stöder även ”pods” för att hantera grupper av containrar tillsammans, samt flera bildformat, inklusive OCI och Docker-bilder.

I mindre miljöer kan Podman fungera som ett förstadium till Kubernetes och överbrygga gapet mellan enskild containerhantering och mer modern orkestrering med Kubernetes.

Användare som vill utforska containrar på en högre nivå kan dra nytta av ”pods”. Det är inte längre nödvändigt att bygga och driva ett Kubernetes-kluster. I de enklaste fallen kan nyligen utvecklade ”pods” testas och förbättras. Det är också möjligt att senare migrera till Kubernetes.

Kommandot `podman generate kube` skapar motsvarande konfigurationsfiler som kan användas som indata för Kubernetes-verktyget `kubectl`.

Nyare versioner av Podman kan till och med generera konfigurationsfiler för systemd. Det är en stor fördel för de som använder den vanliga init-efterföljaren för containerorkestrering.

Podman vs Docker: Viktiga skillnader

Docker har etablerat sig som det dominerande verktyget för containerhantering. Docker har flera fördelar, som till exempel ett växande utbud av bilder. Dock finns det även nackdelar, såsom potentiella säkerhetsrisker. Docker är inte längre det rekommenderade verktyget för Kubernetes.

Det faktum att containrar, till skillnad från virtuella system, inte kräver en egen kärna är en stor fördel. Dock innebär detta en säkerhetsrisk i Docker, eftersom Docker-containrar traditionellt bara kan köras med root-privilegier.

Detta kan ge processer som körs i containrarna tillgång till kärnan med root-privilegier, vilket potentiellt kan användas för att attackera värdsystemet.

En av de mest påtagliga skillnaderna är att Docker kräver att en Docker-daemon körs, medan Podman kan starta containrar direkt från kommandoraden. Det innebär att det inte finns någon bakgrundsprocess som konstant körs, och applikationen startas endast vid behov.

Säkerhetsmässigt är detta en fördel, eftersom Podman är mindre sårbar för attacker eftersom det inte kräver en konstant aktiv daemon med superanvändarprivilegier. Podman saknar denna bakgrundsprocess på grund av sin grundläggande arkitektur, som skiljer sig från Dockers.

Docker använder en klient-servermodell där Docker-klienten kommunicerar med Docker-daemomen via ett API. Podman däremot använder en ”fork-exec”-modell där varje container körs som en underordnad process av Podman.

När Podman först körs med normala användarbehörigheter skapas ett användarnamnrymd. Inom detta användarnamnrymd körs Podman med root-privilegier och kan montera filsystem och skapa containrar.

En Podman-container har enbart samma rättigheter som den användare som kör den. Genom att använda användarnamnrymder kan varje användare skapa och hantera sina egna containrar, utan att dessa syns för andra användare eller superanvändaren.

Eftersom Podman inte är beroende av Docker, har utvecklarna stor flexibilitet och kan snabbare tillgodose användarnas önskemål. Intressanta tillägg i Podman inkluderar kommandona `mount/unmount` och systemd-integration.

Med hjälp av kommandona `mount/unmount` kan värdsystemet montera containerns filsystem för att komma åt eller ändra filer och sedan avmontera dem.

Systemd-integrationen i Podman gör att containrar kan startas, övervakas och startas om via systemd. I Docker fungerar detta inte, på grund av daemons natur.

Podman erbjuder även kommandot `podman generate systemd` som genererar en systemtjänst för den aktuella containern. Detta underlättar för användaren vid skapandet av systemtjänster och möjliggör integration i värdsystemet.

En annan viktig skillnad är att Podman inte påverkar brandväggsreglerna eller den befintliga dnsmasq-installationen, då den skapar sitt nätverk internt. Docker å andra sidan skriver över brandväggsreglerna för att möjliggöra kommunikation mellan containrar.

Podman Docker
Arkitektur Daemonless Daemon
Tjänsthantering Systemd Docker Engine
Brandväggskompatibilitet Respekterar brandväggsregler Skriver över brandväggsregler
Plattform Linux (native) Linux, Windows och Mac

När är det lämpligt att migrera från Docker till Podman?

Om du distribuerar containrar i en RHEL-baserad miljö finns det få alternativ utöver att använda Podman, eftersom det är standardvalet i den miljön. Du kan även välja Podman framför Docker om du har mindre distributioner med ett begränsat antal containrar.

Om du däremot har komplexa system, flera containrar och en stack av samverkande containrar via docker-compose/podman-compose i ett nätverk, så är Docker ett bättre alternativ, då Docker har ett mer moget nätverkshanteringssystem.

Om du precis har börjat utforska containerteknik är Docker ett bättre alternativ, eftersom det är ett stabilt och väletablerat verktyg med omfattande dokumentation och en relativt kort inlärningskurva, jämfört med Podman som fortfarande utvecklas och saknar lika utförlig dokumentation.

Migrera från Podman till Docker

Om du använder kommandoraden är det enkelt att växla mellan Docker Engine och Podman. I många fall räcker det med ett alias i shell: `$ alias docker=podman`.

Detta förutsätter givetvis att rätt programvara är installerad på systemet. I Linux är detta oftast inget problem, då färdiga programvarupaket finns tillgängliga för de flesta distributioner.

Windows och macOS är däremot inte fullt ut stödda. Aliasmetoden fungerar eftersom många Docker-kommandon har motsvarande i Podman.

Vissa Docker-kommandon saknar dock motsvarighet i Podman, och vissa kommandon kan fungera annorlunda i de olika verktygen. I nuläget påverkar detta främst hanteringen av befintliga volymer.

Bytet blir något mer komplicerat om du använder grafiska verktyg som Docker Desktop. Detta påverkar framförallt utvecklare som arbetar med Windows eller macOS.

Användare av Docker Desktop behöver bekanta sig med kommandoraden, vilket även gäller Docker compose. Podman-compose är ett alternativ som är skrivet i Python och kan fungera som en ersättare till Docker compose.

Slutsatser

Övergången från Docker till Podman kan anses vara i stort sett slutförd. För användare och administratörer är de flesta aspekter av denna förändring smidiga. Många Docker-funktioner har identiska motsvarigheter i Podman.

En stor fördel är avsaknaden av en enskild daemon-process och root-privilegier, för att inte nämna den integrerade hanteringen av containergrupper. Det är dock värt att komma ihåg att Docker fortfarande är den ledande tekniken när det gäller containrar, men detta kommer sannolikt att förändras på sikt.

Du kan utforska fler Docker-kommandon för att hantera containrar.