Podman vs Docker: RHEL tabanlı sistemlerde farklar

📅 30 Aralık 2025Emre Karabulut
⏱️ Yaklaşık 7 dakikalık okuma süresi

Podman vs Docker: RHEL Tabanlı Sistemlerde Farklar

Kapsayıcı teknolojileri, modern yazılım geliştirme ve dağıtım süreçlerinin vazgeçilmez bir parçası haline geldi. Özellikle Red Hat Enterprise Linux (RHEL) ve türevi sistemlerde, kapsayıcı dünyasında iki ana oyuncu öne çıkıyor: Docker ve Podman. Bir sistem yöneticisi olarak, bu iki aracın RHEL ekosistemindeki inceliklerini, farklarını ve kullanım alanlarını derinlemesine anlamak kritik öneme sahiptir.

Docker: Geleneksel Lider

Docker, kapsayıcı devrimini başlatan ve adını bu teknolojiyle özdeşleştiren araçtır. Temelde, istemci-sunucu (client-server) mimarisine dayanır. dockerd adında bir arka plan hizmeti (daemon) çalışır ve tüm kapsayıcı operasyonlarını bu daemon yönetir. Bu mimari, başlangıçta kullanımı kolaylaştırmış olsa da, bazı güvenlik ve sistem yönetimi zorluklarını da beraberinde getirir.

Docker komutlarının nasıl çalıştığını gösteren basit bir örnek:


# Docker daemon'unun durumunu kontrol etme
sudo systemctl status docker

# Bir kapsayıcı çalıştırma - bu komut dockerd ile iletişim kurar
sudo docker run -d -p 80:80 --name mynginx nginx

Podman: RHEL’in Yerel, Daemonsız Alternatifi

Red Hat tarafından geliştirilen Podman (Pod Manager), Docker’a modern, daemonsız bir alternatif olarak ortaya çıkmıştır. RHEL 8 ve sonraki sürümlerinde Docker’ın yerini alarak varsayılan kapsayıcı motoru haline gelmiştir. Podman, Docker ile büyük ölçüde uyumlu bir komut satırı arayüzü sunar, ancak altında yatan mimarisi temelden farklıdır.

Podman’ın en çekici özelliklerinden biri, bir daemon çalıştırmamasıdır:


# Podman'ın bir daemon'a ihtiyacı yoktur, doğrudan çalışır
podman run -d -p 8080:80 --name mynginx nginx

# Genel olarak Podman daemon'u diye bir şey yoktur, bu komut beklenen bir servis bulamaz.
# Kapsayıcılar kendi systemd birimleri (kullanıcı veya sistem) tarafından yönetilebilir.
sudo systemctl status podman.service

Temel Farklar

1. Daemonless Mimarisi vs. Daemon

Bu, Podman ve Docker arasındaki en fundamental farktır. Docker, tüm kapsayıcı işlemlerini yöneten merkezi bir dockerd daemon’a ihtiyaç duyar. Bu daemon, root ayrıcalıklarıyla çalışır ve bu da potansiyel bir güvenlik açığı oluşturur. Daemon çökerse, çalışan tüm kapsayıcılar etkilenebilir.

Podman ise bir daemon kullanmaz. Her Podman komutu doğrudan çalışır ve kapsayıcıları yönetmek için conmon adlı küçük bir monitör süreci kullanır. Bu, daha hafif, daha güvenli ve hata noktası açısından daha dayanıklı bir yapı sunar. Bir Podman komutu bittiğinde, ilgili işlemler de sona erer (kapsayıcı çalışmaya devam etse bile Podman’ın kendi süreci biter).


# Docker'da daemon'ı durdurmak tüm kapsayıcıları etkiler
sudo systemctl stop docker

# Podman'da daemon olmadığı için böyle bir durum söz konusu değildir.
# Kapsayıcılar, systemd user service veya system-wide service olarak izlenebilir.

2. Rootless Kapsayıcılar

Podman, root yetkileri olmayan kullanıcıların kapsayıcıları çalıştırmasına olanak tanıyan “rootless” (köksüz) kapsayıcıları ilk günden itibaren desteklemiştir. Bu, geliştiricilerin kendi ortamlarında kapsayıcılarla güvenli bir şekilde deneyler yapmasını, bağımlılıkları yönetmesini ve test etmesini sağlar. Docker da rootless modunu desteklese de, kurulumu ve yönetimi Podman’a göre genellikle daha karmaşıktır ve Podman kadar olgun değildir.

Rootless Podman örneği:


# Normal bir kullanıcı olarak root yetkisi olmadan kapsayıcı çalıştırma
podman run -p 8080:80 --name mywebserver nginx

# Bu kapsayıcı, kullanıcının kendi UID/GID'si altında çalışır.

3. Güvenlik Avantajları

Daemonless ve rootless özellikler, Podman’a önemli güvenlik avantajları sağlar:

  • Küçültülmüş Saldırı Yüzeyi: Merkezi bir daemon olmadığı için, root ayrıcalıklarıyla çalışan uzun ömürlü bir süreç yoktur. Bu, bir güvenlik açığının tüm sistemi ele geçirme riskini azaltır.
  • İzolasyon: Rootless kapsayıcılar sayesinde, bir kapsayıcıdan kaçış durumunda (container escape), saldırganın elde edeceği maksimum yetki, kapsayıcıyı başlatan kullanıcının yetkisiyle sınırlıdır, root yetkisiyle değil.

4. Sistem Entegrasyonu (systemd ve Cgroups)

Podman, RHEL’in yerel bir aracı olduğu için, systemd ile çok daha derinlemesine entegrasyona sahiptir. Podman, kapsayıcıları ve podları doğrudan systemd hizmetleri olarak çalıştırmak için birim dosyaları (unit files) oluşturabilir. Bu, kapsayıcıların sistem başlangıcında otomatik olarak başlatılmasını, izlenmesini ve yönetilmesini kolaylaştırır. Docker ise kendi containerd ve runc süreçlerini yönetir.

Podman ile systemd birimi oluşturma örneği:


# Çalışan bir kapsayıcıdan systemd birimi oluşturma
podman generate systemd --name mynginx --files --new
# Bu komut, mynginx.service adında bir dosya oluşturur.
# Daha sonra bu dosyayı /etc/systemd/system/ veya ~/.config/systemd/user/ altına taşıyıp etkinleştirebilirsiniz.

5. Geliştirme Akışı ve Araçları (Buildah, Skopeo, K8s YAML)

Podman, sadece kapsayıcı çalıştırmakla kalmaz, aynı zamanda kapsamlı bir araç ekosistemiyle birlikte gelir:

  • Buildah: Kapsayıcı imajları oluşturmak için özel olarak tasarlanmıştır. Docker’ın tek bir komutta (docker build) yaptığı işi, Buildah daha modüler bir yaklaşımla, katman katman imaj oluşturma yeteneğiyle yapar. Dockerfile’ları da destekler.
  • Skopeo: Kapsayıcı imajlarını farklı kayıt defterleri arasında kopyalamak, taşımak, imzalamak ve incelemek için kullanılır. İmajlar üzerinde ince taneli kontrol sağlar.
  • Kubernetes YAML Oluşturma: Podman, çalışan kapsayıcılardan ve podlardan doğrudan Kubernetes uyumlu YAML dosyaları üretebilir. Bu, yerel geliştirme ortamınızdan Kubernetes’e geçişi son derece kolaylaştırır.

# Buildah ile imaj oluşturma
buildah from ubi8/ubi
buildah run <container_name> dnf -y install nginx
buildah config --port 80 <container_name>
buildah commit <container_name> mynginximage

# Podman ile çalışan pod'dan Kubernetes YAML'ı oluşturma
podman pod create mypod
podman run -dt --pod mypod -p 80:80 nginx
podman generate kube mypod > mypod-kube.yaml
# Bu YAML dosyası direkt olarak Kubernetes'e uygulanabilir

6. CLI Uyumluluğu

Podman’ın en kullanıcı dostu özelliklerinden biri, komut satırı arayüzünün (CLI) büyük ölçüde Docker ile uyumlu olmasıdır. Çoğu docker komutu, basitçe podman olarak değiştirilerek çalıştırılabilir. Bu, Docker’dan Podman’a geçişi son derece pürüzsüz hale getirir ve mevcut scriptlerin çoğu minimal değişikliklerle kullanılabilir.


# Docker komutu
docker ps -a

# Podman'daki karşılığı
podman ps -a

Hangi Durumda Hangisi?

  • RHEL/CentOS/Fedora Kullanıcıları ve Güvenlik Odaklı Ortamlar: Podman, RHEL ekosisteminde doğal bir seçimdir. Yerel entegrasyonu, rootless yetenekleri ve daemonless mimarisi onu kurumsal ortamlarda ve güvenlik öncelikli projelerde tercih edilen çözüm yapar.
  • Kubernetes Geliştiricileri: Podman’ın Kubernetes YAML oluşturma yeteneği, geliştiricilerin yerel olarak kapsayıcıları ve podları test edip doğrudan Kubernetes’e taşımalarını sağlar.
  • Mevcut Docker Yatırımı Olanlar: Eğer kapsamlı bir Docker ekosisteminiz, otomasyon scriptleriniz veya özel araçlarınız varsa, Docker ile devam etmek mantıklı olabilir. Ancak Podman’a geçiş, CLI uyumluluğu sayesinde sandığınızdan daha kolay olabilir.
  • Basit ve Hızlı Kapsayıcı İhtiyaçları: Her iki araç da bu ihtiyacı karşılar, ancak Podman’ın daha az overhead’i ve daha temiz sistem entegrasyonu uzun vadede avantaj sağlayabilir.

Sonuç

Hem Docker hem de Podman, kapsayıcı dünyasında güçlü araçlardır. Ancak RHEL tabanlı sistemlerde çalışırken, Podman’ın daemonsız mimarisi, rootless kapsayıcı desteği, güçlü güvenlik özellikleri ve systemd ile derin entegrasyonu onu varsayılan ve tercih edilen çözüm haline getirir. Bir sistem yöneticisi olarak, Podman’ı anlamak ve kullanmak, RHEL ortamlarınızda kapsayıcı yönetimini daha güvenli, verimli ve modern hale getirecektir. Gelecek, kapsayıcıları merkeze alan ve güvenliği ön planda tutan çözümlere işaret ediyor ve Podman bu vizyona mükemmel bir şekilde uyuyor.

Emre Karabulut
📊 Bu yazı 6 kez okundu.