मैंने Docker से Podman पर स्विच क्यों किया
(codesmash.dev)- Docker की background daemon (
dockerd) संरचना की वजह से security vulnerabilities और resource consumption से जुड़ी समस्याओं की लगातार आलोचना होती रही है - Podman daemon-less architecture अपनाता है, इसलिए containers user permissions के तहत सीधे चलते हैं, जिससे attack surface कम होता है और stability बेहतर होती है
- Systemd integration, Kubernetes-friendly design, और Buildah/Skopeo जैसे Unix philosophy-आधारित अलग-अलग tools के support से operations efficiency बढ़ती है
- Docker CLI के साथ high compatibility होने की वजह से, सिर्फ
alias docker=podmanसे भी ज़्यादातर existing workflows वैसे ही काम करते हैं - वास्तविक production environments में भी security और resource management आसान हो जाते हैं, और नए projects के लिए Podman ज़्यादा व्यावहारिक और future-oriented विकल्प बन रहा है
Docker की सीमाएँ और security issues
- Docker की संरचना ऐसी है कि
dockerddaemon हमेशा root permissions के साथ चलता है- अगर daemon में vulnerability मिल जाए, तो पूरा host risk में आ सकता है
- प्रमुख security issue cases
- 2019: runC container escape (CVE-2019-5736)
- 2022: Linux Dirty Pipe vulnerability, cgroups v1 escape
- 2024: runC “Leaky Vessels”, BuildKit vulnerability
- 2024: Docker API exposure के जरिए cryptojacking campaign
- ऐसे incidents बार-बार होने से daemon-based structure के मूलभूत जोखिम सामने आए
Podman की daemon-less संरचना
- Podman background daemon का उपयोग नहीं करता
podman runचलाने पर container command चलाने वाले process का direct child process बनकर चलता है- rootless mode में चलने के कारण, container के अंदर root permissions भी host पर केवल सामान्य user permissions के बराबर होते हैं
- फायदे
- security मज़बूत: container escape होने पर damage scope कम
- stability बेहतर: एक container बंद हो जाए तो दूसरे containers प्रभावित नहीं होते
- resource efficiency: अनावश्यक daemon हमेशा active नहीं रहता, इसलिए memory usage कम होता है
Podman की अलग पहचान वाली features
- Systemd integration
podman generate systemdसे systemd unit files अपने-आप generate किए जा सकते हैं- standard
systemctlcommands से services manage की जा सकती हैं
- Kubernetes friendliness
- Pod concept built-in होने से multi-container apps विकसित करना आसान होता है
podman generate kubeसे सीधे Kubernetes YAML generate किया जा सकता है
- Unix philosophy
- Podman container execution पर focus करता है, image build के लिए Buildah, और registry management के लिए Skopeo का उपयोग होता है
- ज़रूरत के मुताबिक optimized tools इस्तेमाल किए जा सकते हैं
migration process और compatibility
- Docker से Podman में migration लगभग बिना downtime के हो सकता है
- CLI compatible है, इसलिए
dockerकी जगहpodmanवैसे ही इस्तेमाल किया जा सकता है - मौजूदा Dockerfile भी वैसे ही काम करते हैं
- CLI compatible है, इसलिए
- अंतर
- rootless mode में 1024 से नीचे के ports bind नहीं किए जा सकते → reverse proxy recommended
- volume permissions को manage करना पड़ता है
- Docker socket पर निर्भर tools, Podman के Docker API compatibility mode का उपयोग कर सकते हैं
व्यावहारिक उपयोग और फायदे
- production environment में Podman इस्तेमाल करने के बाद
- security audit का बोझ कम हुआ, rootless security default रूप में लागू हुई
- resource usage pattern ज़्यादा सरल और predictable हो गया
- Docker अभी भी लोकप्रिय है, लेकिन नए projects या जहाँ technology choice की flexibility हो, वहाँ Podman ज़्यादा उपयुक्त है
- Linux management system के साथ प्राकृतिक integration
- Kubernetes-oriented architecture
- ज़्यादा सुरक्षित और व्यावहारिक container runtime environment
FastAPI migration guide का सार
- मौजूदा Dockerfile को वैसे ही इस्तेमाल किया जा सकता है
podman build,podman runसे आसानी से replace किया जा सकता हैpodman generate systemdसे systemd service register की जा सकती है- Pods का उपयोग करके DB जैसे multi-service environments को support किया जा सकता है
- Docker Compose workflow के लिए
podman-composeयाkomposeconversion का उपयोग किया जा सकता है
8 टिप्पणियां
यहाँ लिखा है कि बिना downtime के migration संभव है, लेकिन असली production environment में काफ़ी अजीब चीज़ें दिखीं। उदाहरण के लिए, mac environment में default setting के साथ zstd compression इस्तेमाल होने की वजह से built image registry को काफ़ी ज़्यादा भर देती है वगैरह..
Docker और podman दोनों....
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
securityContext:
runAsNonRoot: true
runAsUser: UID
असल में Docker compatibility अच्छी नहीं है, इसलिए usability भी बहुत अच्छी नहीं लगती...
rootless सोचकर Podman पर गया था, फिर वापस Docker पर लौट आया।
जैसा दूसरे लोग कह रहे हैं, अगर Kubernetes के साथ इस्तेमाल करना है तो बस
containerdइस्तेमाल कर लो।अगर Docker compose ठीक से काम नहीं करता और Kubernetes compatibility ही इसका फायदा है, तो यह सवाल आता है कि फिर सीधे Kubernetes ही क्यों न इस्तेमाल करें।
मैंने भी इसे आज़माने की कोशिश की थी, लेकिन यह एक बार में चल नहीं पाया और 1024 से कम port mapping भी सीधे नहीं कर सका, इसलिए मैं बस k3s और image build के लिए nerdctl के combination का इस्तेमाल करता हूँ।
कभी न कभी इसे बदलने का मन तो था, लेकिन जब पहले कोशिश की थी, तब डेवलपर्स के कहने के उलट बहुत सारे
docker composeप्रोजेक्ट ठीक से काम ही नहीं कर रहे थे...Docker network को support नहीं करता न.
मुझे पता है कि Docker की तरह यह network फीचर्स भी सपोर्ट करता है.
क्या अभी भी कुछ चीजें हैं जो ठीक से काम नहीं करतीं?
Hacker News राय
chrootऔर jail कॉन्सेप्ट चुना। मेरा deployment code jail environment के बाहर software चलाता था, औरptraceसे process द्वारा खोली गई files को मॉनिटर करता था। इस output से dependency list निकालकर उसे package किया। नतीजतन deployment छोटा रहा, immutability बनी रही, और security भी बेहतर हुई। जब Docker आया तो मुझे वही पुराना तरीका याद आया, और सोचा कि क्या Docker container की file usage मॉनिटर करके distribution को छोटा करने वाला कोई ऐसा ही tool हैgit push live masterकरो और deployment हो जाता था। मैंने Docker बहुत इस्तेमाल किया है, लेकिन यही सबसे आसान deployment था। Docker के फायदे समझता हूँ, लेकिन Ubuntu या OpenBSD पर HTTP setup करना इतना मुश्किल नहीं है। सवाल यह है कि क्या Docker की reproducibility वाकई उतनी management overhead के लायक हैसंबंधित code link
--connectionflag से मनचाहा environment चुन सकते हैं। ज़रूरत हो तो Podman अपने-आप VM भी बना सकता है (lima का उपयोग करके)। Podman Desktop में Docker compatibility layer भी है, जो compatibility issues कम करती हैpodman generate systemdcommand अब deprecated है। इसके बदले Podman Quadlets है, जो systemd unit files के भीतर परिभाषित docker-compose.yaml जैसी शैली हैcrunका uidmap, userns) ठीक से काम नहीं करते। subordinate ID mapping की उपयोगिता पर संदेह हैignore_chown_errorsoption इस्तेमाल करने पर root को user ID से map करते समय बिना अतिरिक्त mapping के सरलता से लागू किया जा सकता हैयहाँ,
यहाँ,
यहाँ देखे जा सकते हैं