{"id":186,"date":"2026-01-17T16:04:15","date_gmt":"2026-01-17T16:04:15","guid":{"rendered":"https:\/\/wordpress.richardorilla.website\/?p=186"},"modified":"2026-01-17T16:04:17","modified_gmt":"2026-01-17T16:04:17","slug":"why-i-switched-to-podman-and-why-you-should-too","status":"publish","type":"post","link":"http:\/\/wordpress.richardorilla.website\/index.php\/2026\/01\/17\/why-i-switched-to-podman-and-why-you-should-too\/","title":{"rendered":"Why I Switched to Podman (And Why You Should Too)"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"introduction\">Introduction<\/h2>\n\n\n\n<p>I first discovered Podman back in 2022. It was listed as one of the supported engines for <strong>Distrobox<\/strong>, a tool I was experimenting with at the time. Back then, I was a dedicated Docker user. While I was vaguely intrigued by Podman&#8217;s &#8220;daemonless&#8221; nature, I didn&#8217;t feel a pressing need to switch.<\/p>\n\n\n\n<p>I subscribe to the philosophy: <em>&#8220;If it works, don&#8217;t fix it.&#8221;<\/em> Docker was working for me or so I thought.<\/p>\n\n\n\n<p>My perspective changed when I moved from building simple, small container images to complex, multi-layered ones. I began hitting friction points that turned my workflow into a headache, eventually forcing me to look for a better alternative. That alternative was Podman.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the_problem_with_the_docker_daemon\">The Problem with the Docker Daemon<\/h2>\n\n\n\n<p>The cracks in my Docker workflow appeared during heavy build processes. I encountered a situation where a build failed because my disk reached capacity. In a perfect world, this should just stop the build.<\/p>\n\n\n\n<p>However, with Docker, this triggered an unrecoverable state in the storage driver. Because Docker relies on a central daemon (a background process that manages everything), when that daemon struggles to write layers to a full disk, it can corrupt the state of the engine. I wasn&#8217;t just left with a failed build; I was left with a corrupted installation that required me to completely purge my Docker data and rebuild everything from scratch.<\/p>\n\n\n\n<p>This highlighted a critical architectural flaw: <strong>The Single Point of Failure.<\/strong><\/p>\n\n\n\n<p>If the Docker daemon crashes or corrupts, every container it manages goes down with it. It felt fragile.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the_podman_difference_native_linux_architecture\">The Podman Difference: Native Linux Architecture<\/h2>\n\n\n\n<p>This led me to seriously investigate Podman. The immediate &#8220;lifesaver&#8221; feature was its <strong>daemonless architecture<\/strong>.<\/p>\n\n\n\n<p>Unlike Docker, which uses a client\u2013server model (the CLI talks to a long-running daemon), Podman works like a traditional Linux command (fork\/exec). When you run `podman build`, it is just a process running under your user.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Stability:<\/strong> If a Podman build crashes due to a full disk, only that specific build process dies. My other running containers are unaffected.<\/li>\n\n\n\n<li><strong>Safety:<\/strong> There is no central daemon to corrupt. If the build fails, the cleanup is usually immediate and isolated.<\/li>\n<\/ul>\n\n\n\n<p>In a native Linux environment, this performance is raw and direct. There is no middleman. Podman interacts directly with the kernel&#8217;s <strong>cgroups<\/strong> and <strong>namespaces<\/strong>, making it incredibly efficient for system resources.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"podman_on_windows_escaping_the_heavy_desktop\">Podman on Windows: Escaping the Heavy Desktop<\/h2>\n\n\n\n<p>You might be thinking, &#8220;This sounds great for Linux, but I use Windows.&#8221;<\/p>\n\n\n\n<p>While both Docker and Podman utilize <strong>WSL2 (Windows Subsystem for Linux 2)<\/strong> to run containers on Windows, the way they package this experience is vastly different.<\/p>\n\n\n\n<p>Docker Desktop on Windows bundles the WSL2 backend inside a heavy, commercialized application. It runs a resource-intensive GUI and background services that can eat up significant RAM even when idle.<\/p>\n\n\n\n<p>Podman, on the other hand, offers a cleaner approach for Windows developers:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Same Workflow as Linux:<\/strong> Podman on Windows runs through WSL2 with the same CLI and behavior you get on a Linux machine. If you develop on Linux servers and use a Windows laptop locally, your commands and scripts stay identical.<\/li>\n\n\n\n<li><strong>Lightweight Integration:<\/strong> Because Podman doesn&#8217;t force a heavy UI layer (unless you explicitly install Podman Desktop), it often feels lighter on system resources. It leverages the Fedora-based WSL2 backend strictly for the engine, keeping your development environment snappy.<\/li>\n\n\n\n<li><strong>You Control When It Runs:<\/strong> There is no always-on \u201cbig desktop app\u201d in the background. You start what you need (e.g., a Podman machine) when you need it, and shut it down when you\u2019re done.<\/li>\n<\/ol>\n\n\n\n<p>The end result: Windows stops feeling like a second-class citizen for containers, and your setup is much closer to a \u201creal Linux dev box\u201d with fewer moving parts.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"simplified_management_the_power_of_auto_update\">Simplified Management: The Power of Auto-Update<\/h2>\n\n\n\n<p>One of my favorite use cases for containers is hosting <a href=\"https:\/\/github.com\/m1k1o\/neko\"><strong>Neko<\/strong><sup>[1]<\/sup><\/a>, a virtual browser running inside a container. It\u2019s excellent for testing web applications or browsing potentially unsafe sites in an isolated environment.<\/p>\n\n\n\n<p>In the Docker world, updating Neko was a chore:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Stop the container.<\/li>\n\n\n\n<li>Remove the container.<\/li>\n\n\n\n<li>Pull the new image.<\/li>\n\n\n\n<li>Re-run the container with the exact same flags as before.<\/li>\n<\/ol>\n\n\n\n<p>If you manage a fleet of services, this becomes tedious very quickly.<\/p>\n\n\n\n<p>Podman introduces a game-changer called <strong>Auto-Update<\/strong>. By integrating with `systemd`, I can simply run:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\t\t\t\t<code>\npodman auto-update\n\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\n\n\n<p>Podman checks if a new image is available, pulls it, restarts the container, and even supports <strong>automatic rollback<\/strong> if the new container fails to start. It turns a 10-minute maintenance task into a background process I don&#8217;t even have to think about.<\/p>\n\n\n\n<p>This approach scales beautifully: from \u201cmy one Neko container\u201d up to a host running multiple services that all keep themselves up to date with minimal manual intervention.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"security_by_design\">Security by Design<\/h2>\n\n\n\n<p>Finally, we must talk about security. Docker has historically suffered from vulnerabilities related to its root-privileged daemon.<\/p>\n\n\n\n<p>One illustrative example is <a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2018-15664\">CVE-2018-15664<sup>[2]<\/sup><\/a>. In affected versions of Docker, the API endpoints behind the `docker cp` command were vulnerable to a symlink race condition. A malicious process inside a container could:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Prepare a sneaky symlink setup.<\/li>\n\n\n\n<li>Wait for an administrator to run `docker cp` to copy files in or out.<\/li>\n\n\n\n<li>Trick the <strong>root-running Docker daemon<\/strong> into reading or writing arbitrary paths on the host filesystem.<\/li>\n<\/ul>\n\n\n\n<p>In other words: the daemon was doing filesystem operations on the host <em>on behalf of<\/em> a container, with full root privileges. That\u2019s exactly the kind of risk you accept when a central, highly-privileged daemon sits in the middle of everything.<\/p>\n\n\n\n<p>Podman drastically reduces this category of risk through two mechanisms:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Daemonless:<\/strong> There is no persistent root process waiting to be exploited in the same way. Each operation is a short-lived process, not a central authority holding open doors.<\/li>\n\n\n\n<li><strong>Rootless by Default:<\/strong> Podman is designed to run containers as a non-root user. The default mental model is \u201cmy user runs this process,\u201d not \u201csome root daemon runs things for me.\u201d<\/li>\n<\/ol>\n\n\n\n<p>While Docker now supports &#8220;Rootless Mode,&#8221; it is often more complex to configure and not how most existing Docker installations are set up. Podman works rootless out of the box, which encourages safer defaults, especially on multi-user systems.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"how_it_works_under_the_hood\">How it Works Under the Hood<\/h3>\n\n\n\n<p>Technically, Podman interfaces directly with the Linux kernel&#8217;s <strong>cgroups<\/strong> and <strong>namespaces<\/strong>, adhering strictly to OCI (Open Container Initiative) standards. It uses the same low-level container runtimes (like `runc`) under the hood that Docker does, but without inserting a long-lived daemon into the middle.<\/p>\n\n\n\n<p>The result is a tool that is:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Secure:<\/strong> Less privileged glue code running all the time.<\/li>\n\n\n\n<li><strong>Compliant:<\/strong> Built on open standards that play well in the broader container ecosystem.<\/li>\n\n\n\n<li><strong>Lightweight:<\/strong> Doing only what it needs to, when it needs to, as normal user processes.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"when_docker_is_still_the_right_tool_caveats\">When Docker Is Still the Right Tool (Caveats)<\/h2>\n\n\n\n<p>I didn\u2019t throw Docker out overnight, and you probably shouldn\u2019t either. There are still situations where Docker makes sense:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Existing Team Workflows:<\/strong> If your whole team is standardized on Docker, with dozens of scripts, CI pipelines, and docs written around `docker` and Docker Desktop, a migration has a real cost. Podman is mostly compatible but \u201cmostly\u201d still means testing and tweaks.<\/li>\n\n\n\n<li><strong>Tooling Ecosystem:<\/strong> A lot of third-party tools, tutorials, and examples still assume Docker. Podman\u2019s compatibility (`alias docker=podman`) helps, but some edge cases (especially around Docker Desktop\u2013specific features) may not translate perfectly.<\/li>\n\n\n\n<li><strong>Mac-Centric Teams:<\/strong> On macOS, Docker Desktop is still the \u201cdefault\u201d experience many developers know. Podman has solutions (e.g., Podman Machine), but if your org is heavily Mac-based and fully comfortable with Docker, the switching cost might outweigh the benefits right now.<\/li>\n\n\n\n<li><strong>You Haven\u2019t Felt the Pain Yet:<\/strong> If you\u2019re not hitting daemon corruption issues, not running multi-user hosts, and your threat model is relatively relaxed, Docker might be \u201cgood enough\u201d for your current needs.<\/li>\n<\/ul>\n\n\n\n<p>The point isn\u2019t that Docker is unusable, it\u2019s that, once you\u2019ve seen what a daemonless, rootless-first model feels like, it\u2019s hard to go back.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n\n<p>I didn&#8217;t switch to Podman just to be a contrarian. I switched because it treats containers the way they were meant to be treated: as standard Linux processes, not as children of a monolithic server.<\/p>\n\n\n\n<p>We are past the era where we need a daemon to hold our hands. If you value stability, security, and open-source freedom, the question isn&#8217;t &#8220;Why switch to Podman?&#8221; it is <strong>&#8220;Why are you still tying your containers to a fragile, root-privileged daemon?&#8221;<\/strong>.<\/p>\n\n\n\n<p>At the very least, Podman deserves a spot in your toolbox. In my case, it replaced the toolbox entirely.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction I first discovered Podman back in 2022. It was listed as one of the supported engines for Distrobox, a tool I was experimenting with at the time. Back then, I was a dedicated Docker user. While I was vaguely intrigued by Podman&#8217;s &#8220;daemonless&#8221; nature, I didn&#8217;t feel a pressing need to switch. I subscribe&hellip;&nbsp;<a href=\"http:\/\/wordpress.richardorilla.website\/index.php\/2026\/01\/17\/why-i-switched-to-podman-and-why-you-should-too\/\" rel=\"bookmark\">Read More &raquo;<span class=\"screen-reader-text\">Why I Switched to Podman (And Why You Should Too)<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[6,10],"tags":[],"class_list":["post-186","post","type-post","status-publish","format-standard","hentry","category-blog","category-tech"],"_links":{"self":[{"href":"http:\/\/wordpress.richardorilla.website\/index.php\/wp-json\/wp\/v2\/posts\/186","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/wordpress.richardorilla.website\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/wordpress.richardorilla.website\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/wordpress.richardorilla.website\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/wordpress.richardorilla.website\/index.php\/wp-json\/wp\/v2\/comments?post=186"}],"version-history":[{"count":1,"href":"http:\/\/wordpress.richardorilla.website\/index.php\/wp-json\/wp\/v2\/posts\/186\/revisions"}],"predecessor-version":[{"id":187,"href":"http:\/\/wordpress.richardorilla.website\/index.php\/wp-json\/wp\/v2\/posts\/186\/revisions\/187"}],"wp:attachment":[{"href":"http:\/\/wordpress.richardorilla.website\/index.php\/wp-json\/wp\/v2\/media?parent=186"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/wordpress.richardorilla.website\/index.php\/wp-json\/wp\/v2\/categories?post=186"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/wordpress.richardorilla.website\/index.php\/wp-json\/wp\/v2\/tags?post=186"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}