Jeśli fascynuje Cię świat wirtualizacji i konteneryzacji, zapewne zetknąłeś się z Podmanem i Dockerem. Być może zastanawiasz się, co je różni.
W tym artykule przyjrzymy się bliżej różnicom pomiędzy tymi dwoma rozwiązaniami i spróbujemy ustalić, które z nich będzie najlepsze dla Twoich potrzeb!
Docker
Docker to technologia konteneryzacyjna, która ułatwia zarządzanie zależnościami w projektach na różnych etapach – od programowania po wdrożenie.
Dostępny na systemach Linux, Windows i macOS, Docker koncentruje się na kontenerach i ich aranżacji, co odróżnia konteneryzację od tradycyjnej wirtualizacji.
Architektura Dockera opiera się na dwóch kluczowych elementach: interfejsie wiersza poleceń (Docker CLI) i demonie Dockera.
Demon Dockera:
Jest to usługa działająca w tle, której zadaniem jest zarządzanie obrazami, kontenerami, sieciami i woluminami Dockera. Docker korzysta z interfejsu API REST Docker Engine, aby komunikować się z demonem za pośrednictwem protokołu HTTP.
Interfejs wiersza poleceń Dockera:
To klient w postaci wiersza poleceń, który umożliwia interakcję z demonem Dockera. Używasz go, gdy wydajesz jakiekolwiek polecenie Dockera.
Docker opiera swoje działanie na jądrze systemu Linux i jego funkcjach, takich jak cgroups i przestrzenie nazw. Te mechanizmy izolują procesy, umożliwiając im niezależne działanie. Celem kontenerów jest właśnie oddzielne uruchamianie wielu procesów i aplikacji.
Dzięki temu możliwe jest optymalne wykorzystanie infrastruktury, bez obniżania poziomu bezpieczeństwa w porównaniu z odrębnymi systemami.
Narzędzia kontenerowe, w tym Docker, wykorzystują model wdrażania oparty na obrazach. Ułatwia to udostępnianie aplikacji lub zestawu usług w różnych środowiskach.
Dodatkowo, Docker automatyzuje proces wdrażania aplikacji w środowisku kontenerowym. Dzięki temu użytkownicy mają pełną kontrolę nad aplikacjami, mogą przyspieszyć wdrożenia, zarządzać wersjami i przypisywać im odpowiednie etykiety.
Podman
Podman (skrót od POD MANAger) to narzędzie do budowania, uruchamiania i zarządzania kontenerami oraz obrazami kontenerów zgodnymi ze standardem OCI. Został opracowany przez firmę Red Hat, początkowo z myślą o systemie Linux 8. Służy do zarządzania kontenerami i jest uważany za oficjalnego następcę Dockera.
Red Hat zaprzestał wsparcia Dockera, ale zapewnił użytkownikom płynne przejście na Podmana, który jest oparty na Dockerze i miał początkowo służyć jako narzędzie do debugowania.
Podman zarządza całym ekosystemem kontenerów za pośrednictwem biblioteki libpod. Ponieważ działa natywnie tylko na systemach Linux, interfejs REST API i klienci są w fazie rozwoju, aby umożliwić korzystanie z niego na systemach macOS i Windows.
Obecnie dostępny jest klient zdalny oparty na Varlink, który działa na platformach macOS i Windows, pozwalając na zdalną komunikację z serwerem Podman działającym na systemie Linux. Biblioteka libpod oferuje bezpieczne metody przesyłania obrazów, w tym weryfikację ich autentyczności.
Podman obsługuje również pody, które umożliwiają zarządzanie grupami kontenerów, oraz wiele formatów obrazów, w tym OCI i Docker.
W mniejszych i łatwych w zarządzaniu środowiskach Podman może pełnić funkcję prekursora Kubernetes. Wypełnia lukę między pojedynczym zarządzaniem instancjami kontenerów a nowoczesną orkiestracją za pomocą Kubernetes.
Użytkownicy kontenerów mogą korzystać z zaawansowanych funkcji dzięki konceptowi podów. Budowa i działanie klastra Kubernetes nie są już konieczne na początkowych etapach. Nowo zaprojektowane pody można testować i udoskonalać w pojedynczych operacjach, a następnie przenieść je do Kubernetes.
Polecenie `podman generate kube` generuje odpowiednie pliki konfiguracyjne, które służą jako dane wejściowe dla narzędzia Kubernetes kubectl.
Nowsze wersje Podmana potrafią generować pliki konfiguracyjne dla systemd, co jest wygodne dla użytkowników, którzy wykorzystują ten system do orkiestracji kontenerów.
Podman vs Docker: różnice
Docker szybko stał się popularnym narzędziem do zarządzania kontenerami, posiada rozbudowane repozytorium obrazów, ale również wady, w tym potencjalne zagrożenia bezpieczeństwa. Ponadto Docker nie jest już wspierany jako kontener dla Kubernetes.
Fakt, że kontenery, w przeciwieństwie do maszyn wirtualnych, nie potrzebują własnego jądra, jest często postrzegany jako zaleta. Jednakże, stanowi to również zagrożenie dla bezpieczeństwa w Dockerze, gdzie kontenery uruchamiane są z uprawnieniami administratora.
To umożliwia procesom w kontenerach dostęp do jądra z uprawnieniami roota, co może prowadzić do ataków na system hosta.
Pierwsza różnica jest widoczna już przy pierwszym użyciu. Docker wymaga uruchomienia demona, podczas gdy Podman pozwala na bezpośrednie uruchamianie kontenera z wiersza poleceń. Nie ma więc procesu działającego w tle, a aplikacja jest aktywna tylko wtedy, gdy jest potrzebna.
Z punktu widzenia bezpieczeństwa jest to zaletą, ponieważ Podman jest mniej podatny na ataki. Dzieje się tak, gdyż nie wymaga stałego działania demona z uprawnieniami superużytkownika. Architektura Podmana jest zasadniczo inna niż Dockera, co eliminuje potrzebę uruchamiania demona w tle.
Docker działa w modelu klient-serwer, gdzie klient komunikuje się z demonem za pomocą API, natomiast Podman korzysta z modelu fork-exec, gdzie każdy kontener działa jako proces potomny Podmana.
Przestrzeń nazw użytkownika tworzona jest przy pierwszym uruchomieniu Podmana z normalnymi uprawnieniami. W tej przestrzeni Podman działa z uprawnieniami roota, umożliwiając montowanie systemów plików i tworzenie kontenerów.
Dzięki temu kontener Podman ma te same prawa co użytkownik, który go uruchomił. Wykorzystanie przestrzeni nazw użytkownika oznacza, że każdy użytkownik może tworzyć i zarządzać własnymi kontenerami, które nie będą widoczne dla innych użytkowników ani superużytkownika.
Podman działa niezależnie od Dockera, co daje jego twórcom większą elastyczność w reagowaniu na potrzeby społeczności. Do ciekawych funkcji Podmana należą polecenia mount/unmount oraz integracja z systemem.
Polecenia mount/unmount umożliwiają zamontowanie systemu plików kontenera na hoście, co pozwala na dostęp do plików i ich modyfikację, a następnie na ponowne odmontowanie.
Podman pozwala na monitorowanie i restartowanie kontenerów za pomocą systemd, co nie jest możliwe w przypadku Dockera ze względu na demona.
Podman udostępnia polecenie `podman generate systemd`, które automatycznie tworzy odpowiednią usługę systemd dla danego kontenera. Dzięki temu użytkownik nie musi ręcznie tworzyć usług systemowych, co ułatwia integrację z systemem hosta.
Inną znaczącą różnicą jest to, że Docker może nadpisywać reguły zapory, aby umożliwić komunikację między kontenerami, tworząc własną sieć wewnętrzną. Natomiast Podman nie modyfikuje reguł zapory sieciowej i istniejącej konfiguracji dnsmasq.
PodmanDockerArchitektura Bez demonaDemonSystem zarządzania usługamidZgodność z zaporą ogniową Przestrzega reguł zapory sieciowejNadpisuje reguły zapory sieciowejPlatforma Natywna obsługa systemów LinuxLinux, Windows i macOS
Kiedy warto rozważyć migrację z Dockera do Podmana
Jeśli pracujesz w środowisku opartym na RHEL, Podman jest naturalnym wyborem, ponieważ jest natywnie wspierany przez ten system. Możesz również rozważyć migrację na Podmana, jeśli masz mniejsze wdrożenia z kilkoma kontenerami.
Jednakże, jeśli pracujesz nad bardziej złożonymi projektami, z dużą liczbą kontenerów i z orkiestracją przy użyciu docker-compose/podman-compose, Docker może być lepszym rozwiązaniem ze względu na lepszą obsługę sieci.
Jeśli dopiero zaczynasz swoją przygodę z kontenerami, Docker może być lepszym wyborem. Jest on bardziej stabilny, ma obszerną dokumentację i jest łatwiejszy w nauce w porównaniu do Podmana, który wciąż ewoluuje i nie posiada tak dobrze zdefiniowanej dokumentacji.
Migracja z Podmana do Dockera
Przejście z Docker Engine na Podmana w wierszu poleceń jest stosunkowo proste. W wielu przypadkach wystarczy zdefiniować alias `$ docker=podman`.
Oczywiście wymaga to wcześniejszej instalacji oprogramowania. W przypadku Linuksa jest to bezproblemowe, ponieważ dostępne są gotowe pakiety dla większości dystrybucji.
Systemy Windows i macOS nie są natywnie wspierane, ale podejście z aliasem działa, ponieważ wiele poleceń Dockera ma swoje odpowiedniki w Podmanie.
Należy jednak pamiętać, że niektóre polecenia Dockera nie mają odpowiedników w Podmanie, a inne mogą działać inaczej. W tej chwili różnice dotyczą głównie obsługi wcześniej skonfigurowanych woluminów.
Zmiana jest bardziej problematyczna w przypadku korzystania z narzędzi graficznych, takich jak Docker Desktop. Dotyczy to szczególnie programistów pracujących na systemach Windows lub macOS.
Użytkownicy Docker Desktop będą musieli przyzwyczaić się do korzystania z wiersza poleceń. To samo dotyczy Docker Compose, dla którego istnieje alternatywa pod postacią projektu podman-compose, napisanego w Pythonie.
Podsumowanie
Proces zastępowania Dockera przez Podmana jest już prawie zakończony. Dla użytkowników i administratorów większość zmian jest łatwa do wprowadzenia. Wiele funkcji Dockera ma swoje odpowiedniki w Podmanie.
Największą korzyścią jest wyeliminowanie pojedynczego demona i uprawnień roota. Nie można pominąć też faktu, że Podman naturalnie wspiera grupy kontenerów. Warto jednak pamiętać, że Docker wciąż jest główną technologią w obszarze konteneryzacji, ale najprawdopodobniej w dłuższej perspektywie to się zmieni.
Możesz także zapoznać się z poleceniami Dockera, aby dowiedzieć się więcej o zarządzaniu kontenerami.