- Docker, arka plan daemon'u (
dockerd) mimarisi nedeniyle güvenlik açıkları ve kaynak tüketimi sorunlarıyla uzun süredir eleştiriliyor
- Podman, daemon'suz bir mimari benimsediği için container'lar kullanıcı yetkileriyle doğrudan çalışır; bu da saldırı yüzeyini azaltır ve kararlılığı artırır
- Systemd entegrasyonu, Kubernetes dostu tasarım ve Buildah/Skopeo gibi Unix felsefesine dayalı ayrık araçlar desteği sayesinde operasyonel verimlilik yükselir
- Docker CLI ile yüksek uyumluluk sunduğundan, yalnızca
alias docker=podman ile mevcut iş akışlarının çoğu aynen çalışır
- Gerçek operasyon ortamlarında da güvenlik ve kaynak yönetimi sadeleşir; yeni projelerde Podman, daha makul ve geleceğe dönük bir seçenek haline geliyor
Docker'ın sınırlamaları ve güvenlik sorunları
- Docker,
dockerd daemon'unun her zaman root yetkisiyle çalıştığı bir yapıya sahiptir
- Daemon'da bir açık bulunursa tüm host risk altına girebilir
- Başlıca güvenlik olayı örnekleri
- 2019: runC container escape (CVE-2019-5736)
- 2022: Linux Dirty Pipe açığı, cgroups v1 escape
- 2024: runC “Leaky Vessels”, BuildKit açığı
- 2024: Docker API açığa çıkarılması üzerinden yürütülen cryptojacking kampanyası
- Bu tür olayların tekrarlanması, daemon tabanlı mimarinin temel riskini ortaya koydu
Podman'ın daemon'suz mimarisi
- Podman, arka planda daemon kullanmaz
podman run çalıştırıldığında container, komutu çalıştıran kullanıcının doğrudan child process'i olarak işler
- Rootless modda çalıştığı için container içindeki root yetkisi de host üzerinde yalnızca normal kullanıcı yetkisine karşılık gelir
- Avantajları
- Daha güçlü güvenlik: container escape yaşansa bile etki alanı küçülür
- Daha yüksek kararlılık: bir container çökse bile diğerleri etkilenmez
- Kaynak verimliliği: gereksiz bir daemon sürekli çalışmadığı için bellek kullanımı azalır
Podman'ın öne çıkan özellikleri
- Systemd entegrasyonu
podman generate systemd ile systemd unit dosyaları otomatik oluşturulabilir
- Standart
systemctl komutlarıyla servis yönetimi yapılabilir
- Kubernetes uyumluluğu
- Pod kavramı yerleşik olduğu için çok container'lı uygulamalar geliştirmek kolaydır
podman generate kube ile doğrudan Kubernetes YAML üretilebilir
- Unix felsefesi
- Podman container çalıştırmaya odaklanır; image build için Buildah, registry yönetimi için Skopeo kullanılır
- Böylece amaca göre optimize edilmiş araçlardan yararlanılabilir
Geçiş süreci ve uyumluluk
- Docker'dan Podman'a geçiş neredeyse kesintisizdir
- CLI uyumlu olduğu için
docker yerine doğrudan podman kullanılabilir
- Mevcut Dockerfile'lar da aynen çalışır
- Farklı noktalar
- Rootless modda 1024 altındaki portlara bind edilemez → reverse proxy önerilir
- Volume izinlerinin yönetilmesi gerekir
- Docker socket'e bağımlı araçlar için Podman'ın Docker API uyumluluk modu kullanılabilir
Gerçek kullanımda uygulama ve faydalar
- Operasyon ortamında Podman kullanıldıktan sonra
- Güvenlik denetimi yükü hafifler, rootless güvenlik varsayılan olarak uygulanır
- Kaynak kullanım modeli daha sade ve öngörülebilir hale gelir
- Docker hâlâ yaygın olsa da, yeni projelerde veya teknoloji seçimi esnekse Podman daha uygun olabilir
- Linux yönetim sistemiyle doğal entegrasyon
- Kubernetes odaklı mimari
- Daha güvenli ve daha makul bir container çalıştırma ortamı
FastAPI geçiş rehberi özeti
- Mevcut Dockerfile aynen kullanılabilir
podman build, podman run ile kolayca değiştirilebilir
podman generate systemd ile systemd servisi olarak kaydedilebilir
- Pod kullanarak DB gibi çok servisli ortamlar desteklenebilir
- Docker Compose iş akışı,
podman-compose veya kompose dönüşümüyle karşılanabilir
8 yorum
Burada kesintisiz geçişin mümkün olduğu yazıyor ama gerçek üretim ortamında epey tuhaflık var. Örneğin mac ortamında varsayılan ayarda
zstdsıkıştırması kullanıldığı için, oluşturulan imajların registry’de epey sorun çıkardığı gibi..Docker da Podman da....
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
securityContext:
runAsNonRoot: true
runAsUser: UID
Aslında Docker uyumluluğu pek iyi olmadığı için kullanım deneyimi çok da iyi değil...
Rootless diye düşünüp Podman'a geçtim ama sonra tekrar Docker'a döndüm.
Diğerlerinin dediği gibi Kubernetes ile kullanacaksam zaten doğrudan containerd kullanırım.
Docker compose düzgün çalışmıyorsa ve Kubernetes uyumluluğunun iyi olması avantajıysa, o zaman doğrudan Kubernetes kullanmak gerekmez mi diye düşünüyorum.
Ben de denemeye kalktım ama tek seferde çalışmadı; ayrıca 1024 altındaki port eşlemesini de doğrudan yapamadığı için, ben sadece k3s ile image build için nerdctl kombinasyonunu kullanıyorum.
Bir gün değiştirmek istiyorum ama daha önce denediğimde, geliştiricilerin söylediğinin aksine çok fazla
docker composeprojesi düzgün çalışmıyordu...Docker network desteği yok ya.
Docker’a benzer şekilde ağ özelliklerini de desteklediğini biliyorum.
Hâlâ düzgün çalışmayan bir şey var mı?
Hacker News görüşleri
chrootve jail kavramlarını seçtim. Dağıtım kodum yazılımı jail ortamının dışında çalıştırıyor,ptraceile sürecin açtığı dosyaları izliyordu. Bu çıktıyla bağımlılık listesini çıkarıp paketledim. Sonuçta dağıtım küçük kaldı, değişmezlik korundu ve güvenlik de güçlendi. Docker çıktığında bana eski yöntemi hatırlattı; gerçekten de Docker container dosya kullanımını izleyip dağıtımı küçülten benzer bir araç olup olmadığını merak ediyorumgit pushiçin git post-receive hook ile statik dosya build etme ve httpd yeniden başlatmayı otomatikleştiriyordum. Sadecegit push live masterdiyordum, dağıtım oluyordu. Docker'ı çok kullandım ama en kolay dağıtım buydu. Docker'ın avantajlarını anlıyorum ama Ubuntu ya da OpenBSD'de HTTP ayarlamak o kadar da zor değil. Docker'ın sunduğu tekrarlanabilirlik gerçekten o yönetim overhead'ine değecek kadar değerli mi, emin değilimİlgili kod bağlantısı
--connectionbayrağıyla seçebilirsin. Gerekirse Podman otomatik VM de oluşturabilir (lima kullanarak). Podman Desktop'ta Docker uyumluluk katmanı da var, bu da uyumluluk sorunlarını azaltıyorpodman generate systemdkomutu artık deprecated. Alternatif olarak Podman Quadlets var; bu da systemd unit dosyası içinde tanımlanan, docker-compose.yaml benzeri bir yaklaşımcrun'ın uidmap'i, userns) pek iyi çalışmıyor. İkincil ID eşlemenin gerçekten ne kadar işe yaradığı konusunda şüpheliyimignore_chown_errorsseçeneğini kullanırsan, root'u kullanıcı kimliğine map ederken ek mapping olmadan bunu daha kolay uygulayabilirsin/devaygıtlarını mount etmek ve çok sınırlı programları izole ağ üzerinden açığa çıkarmak daha kolay oluyorburaya,
buraya,
buraya bakabilirsin