{"id":166061,"date":"2026-04-14T11:57:45","date_gmt":"2026-04-14T08:57:45","guid":{"rendered":"https:\/\/computingforgeeks.com\/install-podman-ubuntu-2604\/"},"modified":"2026-04-16T12:58:44","modified_gmt":"2026-04-16T09:58:44","slug":"install-podman-ubuntu-2604","status":"publish","type":"post","link":"https:\/\/computingforgeeks.com\/install-podman-ubuntu-2604\/","title":{"rendered":"Install Podman on Ubuntu 26.04 LTS (Docker Alternative)"},"content":{"rendered":"<p>Podman runs containers without a daemon. That single difference changes how you think about container security on a server. There is no long-running root process managing your workloads, no socket to protect, and every container can run under a regular user account with zero extra configuration.<\/p>\n\n<p>This guide walks through installing Podman on Ubuntu 26.04 LTS, running containers, creating pods, setting up rootless mode, generating systemd services with Quadlets, and using podman-compose as a drop-in replacement for Docker Compose. If you are coming from Docker, most commands are identical because Podman implements the same CLI interface. For a broader look at container runtime options, see our <a href=\"https:\/\/computingforgeeks.com\/docker-vs-cri-o-vs-containerd\/\" target=\"_blank\" rel=\"noreferrer noopener\">Docker vs CRI-O vs containerd comparison<\/a>.<\/p>\n\n<p><em>Last verified: <strong>April 2026<\/strong> | Ubuntu 26.04 LTS (kernel 7.0), Podman 5.7.0, cgroups v2<\/em><\/p>\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n<p>You need an Ubuntu 26.04 system with root or sudo access. A fresh <a href=\"https:\/\/computingforgeeks.com\/ubuntu-2604-initial-server-setup\/\" target=\"_blank\" rel=\"noreferrer noopener\">Ubuntu 26.04 server setup<\/a> works best. Minimum 2 GB RAM and 20 GB disk for comfortable container usage.<\/p>\n\n<ul>\n<li>Tested on: Ubuntu 26.04 LTS (Resolute Raccoon), kernel 7.0.0-10-generic<\/li>\n<li>Podman version: 5.7.0 from Ubuntu repositories<\/li>\n<li>Container runtime: crun with cgroups v2 and systemd<\/li>\n<\/ul>\n\n\n<h2 class=\"wp-block-heading\">Install Podman on Ubuntu 26.04<\/h2>\n\n\n<p>Podman ships in the default Ubuntu 26.04 repositories. No external PPAs or third-party repos needed.<\/p>\n\n<p>Update the package index and install Podman:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo apt update\nsudo apt install -y podman<\/code><\/pre>\n\n\n<p>Confirm the installed version:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman --version<\/code><\/pre>\n\n\n<p>The output shows Podman 5.7.0:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman version 5.7.0<\/code><\/pre>\n\n\n<p>For more detail on the runtime environment, including the storage driver, cgroup version, and OCI runtime:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman info<\/code><\/pre>\n\n\n<p>Key details from the output:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>host:\n  arch: amd64\n  cgroupManager: systemd\n  cgroupVersion: v2\n  conmon:\n    version: 'conmon version 2.1.13, commit: unknown'\n  distribution:\n    distribution: ubuntu\n    version: \"26.04\"\n  kernel: 7.0.0-10-generic\n  os: linux\nstore:\n  graphDriverName: overlay\n  graphRoot: \/var\/lib\/containers\/storage\nversion:\n  Version: 5.7.0\n  GoVersion: go1.25.0<\/code><\/pre>\n\n\n<p>Podman 5.7.0 uses cgroups v2 with systemd as the cgroup manager, the overlay storage driver, and SQLite as the database backend. This is the recommended configuration for Ubuntu 26.04.<\/p>\n\n\n<h2 class=\"wp-block-heading\">Pull and Run Containers<\/h2>\n\n\n<p>Podman uses the same <code>pull<\/code>, <code>run<\/code>, <code>ps<\/code>, and <code>logs<\/code> commands as Docker. The only difference is that Podman requires fully qualified image names by default (including the registry).<\/p>\n\n<p>Pull Nginx, Redis, and Python images:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman pull docker.io\/library\/nginx:latest\npodman pull docker.io\/library\/redis:latest\npodman pull docker.io\/library\/python:3-slim<\/code><\/pre>\n\n\n<p>List downloaded images:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman images<\/code><\/pre>\n\n\n<p>You should see all three images:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>REPOSITORY                TAG         IMAGE ID      CREATED     SIZE\ndocker.io\/library\/python  3-slim      bf5aba7379bc  5 days ago  131 MB\ndocker.io\/library\/nginx   latest      a716c9c12c38  6 days ago  165 MB\ndocker.io\/library\/redis   latest      646a47c903c5  7 days ago  142 MB<\/code><\/pre>\n\n\n<p>Start an Nginx container on port 8080 and a Redis container on port 6379:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman run -d --name web-server -p 8080:80 docker.io\/library\/nginx:latest\npodman run -d --name cache-server -p 6379:6379 docker.io\/library\/redis:latest<\/code><\/pre>\n\n\n<p>Verify both containers are running:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman ps<\/code><\/pre>\n\n\n<p>Both containers should show <code>Up<\/code> status:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS        PORTS                   NAMES\n094e545dffd6  docker.io\/library\/nginx:latest  nginx -g daemon o...  2 seconds ago  Up 2 seconds  0.0.0.0:8080->80\/tcp    web-server\na5738fe0ca8f  docker.io\/library\/redis:latest  redis-server          2 seconds ago  Up 2 seconds  0.0.0.0:6379->6379\/tcp  cache-server<\/code><\/pre>\n\n\n<p>Test the Nginx container by sending a request to port 8080:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>curl -s http:\/\/localhost:8080 | head -5<\/code><\/pre>\n\n\n<p>The Nginx welcome page confirms the container is serving traffic:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n&lt;title&gt;Welcome to nginx!&lt;\/title&gt;\n&lt;style&gt;<\/code><\/pre>\n\n\n<p>Check the container logs:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman logs web-server<\/code><\/pre>\n\n\n<p>The log output shows the Nginx startup sequence, including IPv6 listener configuration:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>\/docker-entrypoint.sh: \/docker-entrypoint.d\/ is not empty, will attempt to perform configuration\n\/docker-entrypoint.sh: Looking for shell scripts in \/docker-entrypoint.d\/\n\/docker-entrypoint.sh: Launching \/docker-entrypoint.d\/10-listen-on-ipv6-by-default.sh\n10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in \/etc\/nginx\/conf.d\/default.conf\n\/docker-entrypoint.sh: Configuration complete; ready for start up<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Create Pods (Kubernetes-style Grouping)<\/h2>\n\n\n<p>Pods are a concept Podman borrows directly from Kubernetes. A pod groups multiple containers that share the same network namespace, meaning they communicate over <code>localhost<\/code> without exposing ports between each other. This is useful when your application has tightly coupled services (a web frontend and a cache, for example).<\/p>\n\n<p>Create a pod named <code>webapp<\/code> with ports for both Nginx and Redis:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman pod create --name webapp -p 8090:80 -p 6380:6379<\/code><\/pre>\n\n\n<p>Add containers to the pod. Notice the <code>--pod<\/code> flag replaces port mapping since ports are defined at the pod level:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman run -d --pod webapp --name webapp-nginx docker.io\/library\/nginx:latest\npodman run -d --pod webapp --name webapp-redis docker.io\/library\/redis:latest<\/code><\/pre>\n\n\n<p>List running pods:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman pod ps<\/code><\/pre>\n\n\n<p>The pod shows 3 containers (the infra container plus the two you added):<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>POD ID        NAME        STATUS      CREATED        INFRA ID      # OF CONTAINERS\nde186c34abe0  webapp      Running     2 seconds ago  ca0205aca0cc  3<\/code><\/pre>\n\n\n<p>The infra container holds the network namespace alive. It is a pause container, similar to what Kubernetes uses. View all containers with their pod associations:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman ps --pod<\/code><\/pre>\n\n\n<p>The <code>PODNAME<\/code> column shows which pod each container belongs to:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>CONTAINER ID  IMAGE                           COMMAND               CREATED       STATUS       PORTS                                         NAMES               PODNAME\nca0205aca0cc                                                        9 seconds ago Up 9 seconds 0.0.0.0:6380->6379\/tcp, 0.0.0.0:8090->80\/tcp  de186c34abe0-infra  webapp\n61e110c7a4e7  docker.io\/library\/nginx:latest  nginx -g daemon o...  8 seconds ago Up 9 seconds 0.0.0.0:6380->6379\/tcp, 0.0.0.0:8090->80\/tcp  webapp-nginx        webapp\naf06a84d72ad  docker.io\/library\/redis:latest  redis-server          8 seconds ago Up 8 seconds 0.0.0.0:6380->6379\/tcp, 0.0.0.0:8090->80\/tcp  webapp-redis        webapp<\/code><\/pre>\n\n\n<p>Inside the pod, Nginx and Redis can reach each other on <code>localhost<\/code> without any explicit networking setup. This mirrors how Kubernetes pods work and makes local development closer to production when you deploy on Kubernetes later.<\/p>\n\n\n<h2 class=\"wp-block-heading\">Rootless Containers (Non-root User)<\/h2>\n\n\n<p>One of Podman&#8217;s strongest advantages over Docker is native rootless support. Any regular user can run containers without root privileges, without a daemon, and without being added to a special group. The container processes run under the user&#8217;s own UID, which means a container breakout still lands in an unprivileged account.<\/p>\n\n<p>Create a regular user and enable lingering so their containers survive logout:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo useradd -m -s \/bin\/bash devuser\nsudo loginctl enable-linger devuser<\/code><\/pre>\n\n\n<p>Switch to the new user and run a container:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>su - devuser\npodman pull docker.io\/library\/nginx:latest\npodman run -d --name my-nginx -p 9090:80 docker.io\/library\/nginx:latest<\/code><\/pre>\n\n\n<p>Verify the container is running in rootless mode:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman ps<\/code><\/pre>\n\n\n<p>The output confirms the container is running under the <code>devuser<\/code> account:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>CONTAINER ID  IMAGE                           COMMAND               CREATED                 STATUS                 PORTS                 NAMES\nc294359a9f87  docker.io\/library\/nginx:latest  nginx -g daemon o...  Less than a second ago  Up Less than a second  0.0.0.0:9090->80\/tcp  my-nginx<\/code><\/pre>\n\n\n<p>Confirm rootless mode is active:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman info --format \"{{.Host.Security.Rootless}}\"<\/code><\/pre>\n\n\n<p>This returns <code>true<\/code>, confirming no root privileges are involved. Exit back to root when done:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>exit<\/code><\/pre>\n\n\n<p>The <code>loginctl enable-linger<\/code> step is important. Without it, all of the user&#8217;s containers stop when they log out. With lingering enabled, the user&#8217;s systemd instance stays active and containers keep running.<\/p>\n\n\n<h2 class=\"wp-block-heading\">Systemd Integration with Quadlets<\/h2>\n\n\n<p>Podman 5.x recommends Quadlets over the older <code>podman generate systemd<\/code> approach for managing containers through systemd. Quadlets use simple INI-style files that systemd&#8217;s generator converts into proper service units at boot.<\/p>\n\n<p>Create a Quadlet file for an Nginx container:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo vi \/etc\/containers\/systemd\/nginx.container<\/code><\/pre>\n\n\n<p>Add the following configuration:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>[Container]\nImage=docker.io\/library\/nginx:latest\nContainerName=nginx-quadlet\nPublishPort=8085:80\n\n[Service]\nRestart=always\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n\n\n<p>Reload systemd to pick up the new Quadlet file, then start the service:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo systemctl daemon-reload\nsudo systemctl start nginx.service<\/code><\/pre>\n\n\n<p>Check the service status:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>systemctl status nginx.service<\/code><\/pre>\n\n\n<p>The service should show active (running) with the Podman container managed by conmon:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>\u25cf nginx.service\n     Loaded: loaded (\/etc\/containers\/systemd\/nginx.container; generated)\n     Active: active (running) since Tue 2026-04-14 08:46:10 UTC; 2s ago\n   Main PID: 4372 (conmon)\n      Tasks: 4 (limit: 3522)\n     Memory: 4.2M (peak: 13.1M)\n        CPU: 146ms\n     CGroup: \/system.slice\/nginx.service\n             \u251c\u2500libpod-payload-3059b002...\n             \u2502 \u251c\u25004374 \"nginx: master process nginx -g daemon off;\"\n             \u2502 \u251c\u25004400 \"nginx: worker process\"\n             \u2502 \u2514\u25004401 \"nginx: worker process\"<\/code><\/pre>\n\n\n<p>Quadlets also work for rootless containers. Place the <code>.container<\/code> file in <code>~\/.config\/containers\/systemd\/<\/code> instead of the system-wide path, and manage it with <code>systemctl --user<\/code>.<\/p>\n\n<p>Enable the service to start on boot:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo systemctl enable nginx.service<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Build Custom Container Images<\/h2>\n\n\n<p>Podman builds images using the same Dockerfile syntax through Buildah (bundled with Podman). You can use either <code>Dockerfile<\/code> or <code>Containerfile<\/code> as the filename.<\/p>\n\n<p>Create a project directory:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>mkdir -p \/opt\/myapp && cd \/opt\/myapp<\/code><\/pre>\n\n\n<p>Create the Containerfile:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo vi \/opt\/myapp\/Containerfile<\/code><\/pre>\n\n\n<p>Add the following build instructions for a Flask application:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>FROM docker.io\/library\/python:3-slim\nWORKDIR \/app\nRUN pip install flask\nCOPY app.py .\nEXPOSE 5000\nCMD [\"python\", \"app.py\"]<\/code><\/pre>\n\n\n<p>Create the Python application file:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo vi \/opt\/myapp\/app.py<\/code><\/pre>\n\n\n<p>Add a minimal Flask app:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>from flask import Flask\napp = Flask(__name__)\n\n@app.route('\/')\ndef hello():\n    return 'Hello from Podman on Ubuntu 26.04!'\n\nif __name__ == '__main__':\n    app.run(host='0.0.0.0', port=5000)<\/code><\/pre>\n\n\n<p>Build the image:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>cd \/opt\/myapp\npodman build -t myflask:latest -f Containerfile .<\/code><\/pre>\n\n\n<p>The build output shows each layer being created:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>STEP 1\/6: FROM docker.io\/library\/python:3-slim\nSTEP 2\/6: WORKDIR \/app\nSTEP 3\/6: RUN pip install flask\nSuccessfully installed flask-3.1.3 werkzeug-3.1.8 jinja2-3.1.6 ...\nSTEP 4\/6: COPY app.py .\nSTEP 5\/6: EXPOSE 5000\nSTEP 6\/6: CMD [\"python\", \"app.py\"]\nCOMMIT myflask:latest\nSuccessfully tagged localhost\/myflask:latest<\/code><\/pre>\n\n\n<p>Run the custom image and test it:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman run -d --name flask-app -p 5000:5000 localhost\/myflask:latest\ncurl http:\/\/localhost:5000<\/code><\/pre>\n\n\n<p>The Flask application responds with the expected message:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>Hello from Podman on Ubuntu 26.04!<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Podman Compose (Docker Compose Alternative)<\/h2>\n\n\n<p>For multi-container applications defined in <code>docker-compose.yml<\/code> files, <code>podman-compose<\/code> is available directly from the Ubuntu repositories. If you need the full Docker Compose plugin with Buildx and Swarm support, see our <a href=\"https:\/\/computingforgeeks.com\/install-docker-compose-ubuntu-2604\/\" target=\"_blank\" rel=\"noreferrer noopener\">Docker Compose guide for Ubuntu 26.04<\/a>.<\/p>\n\n<p>Install podman-compose:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo apt install -y podman-compose<\/code><\/pre>\n\n\n<p>Verify the installation:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman-compose --version<\/code><\/pre>\n\n\n<p>The output confirms version 1.5.0:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman-compose version 1.5.0<\/code><\/pre>\n\n\n<p>Create a sample compose project with Nginx and Redis:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>mkdir -p \/opt\/compose-demo && cd \/opt\/compose-demo<\/code><\/pre>\n\n\n<p>Create the compose file:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo vi \/opt\/compose-demo\/docker-compose.yml<\/code><\/pre>\n\n\n<p>Add the service definitions:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>services:\n  web:\n    image: docker.io\/library\/nginx:latest\n    ports:\n      - \"8095:80\"\n  cache:\n    image: docker.io\/library\/redis:latest<\/code><\/pre>\n\n\n<p>Start the services:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>cd \/opt\/compose-demo\npodman-compose up -d<\/code><\/pre>\n\n\n<p>Check the running containers:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman-compose ps<\/code><\/pre>\n\n\n<p>Both services start with correct port mappings:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>CONTAINER ID  IMAGE                           COMMAND               CREATED                 STATUS                 PORTS                 NAMES\nff9bfa8513bf  docker.io\/library\/nginx:latest  nginx -g daemon o...  Less than a second ago  Up Less than a second  0.0.0.0:8095->80\/tcp  compose-demo_web_1\n2170301496ab  docker.io\/library\/redis:latest  redis-server          Less than a second ago  Up Less than a second  6379\/tcp              compose-demo_cache_1<\/code><\/pre>\n\n\n<p>Stop and remove everything with <code>podman-compose down<\/code> when finished.<\/p>\n\n\n<h2 class=\"wp-block-heading\">Docker CLI Compatibility<\/h2>\n\n\n<p>The <code>podman-docker<\/code> package creates a <code>docker<\/code> command alias that points to Podman. This is useful when scripts or CI pipelines expect the <code>docker<\/code> command. For a full <a href=\"https:\/\/computingforgeeks.com\/install-docker-ce-ubuntu-2604\/\" target=\"_blank\" rel=\"noreferrer noopener\">Docker CE installation on Ubuntu 26.04<\/a>, see our dedicated guide.<\/p>\n\n<p>Install the compatibility package:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo apt install -y podman-docker<\/code><\/pre>\n\n\n<p>Now you can use <code>docker<\/code> commands and they route to Podman:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>docker ps\ndocker images<\/code><\/pre>\n\n\n<p>The output includes a notice confirming the emulation:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>Emulate Docker CLI using podman. Create \/etc\/containers\/nodocker to quiet msg.\nCONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS        PORTS                  NAMES\n094e545dffd6  docker.io\/library\/nginx:latest  nginx -g daemon o...  2 minutes ago  Up 2 minutes  0.0.0.0:8080->80\/tcp   web-server\na5738fe0ca8f  docker.io\/library\/redis:latest  redis-server          2 minutes ago  Up 2 minutes  0.0.0.0:6379->6379\/tcp cache-server\nfd34d445e243  localhost\/myflask:latest        python app.py         20 seconds ago Up 21 seconds  0.0.0.0:5000->5000\/tcp flask-app<\/code><\/pre>\n\n\n<p>Suppress the emulation notice by creating the marker file:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo touch \/etc\/containers\/nodocker<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Volumes and Networks<\/h2>\n\n\n<p>Podman handles persistent storage and networking with the same commands as Docker. Check what <a href=\"https:\/\/computingforgeeks.com\/ubuntu-2604-lts-features\/\" target=\"_blank\" rel=\"noreferrer noopener\">Ubuntu 26.04 brings under the hood<\/a> that makes this integration smooth.<\/p>\n\n<p>Create a named volume:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman volume create app-data<\/code><\/pre>\n\n\n<p>List and inspect volumes:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman volume ls\npodman volume inspect app-data<\/code><\/pre>\n\n\n<p>Volume data lives under <code>\/var\/lib\/containers\/storage\/volumes\/<\/code> for root containers and <code>~\/.local\/share\/containers\/storage\/volumes\/<\/code> for rootless:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>DRIVER      VOLUME NAME\nlocal       app-data\n\n[\n     {\n          \"Name\": \"app-data\",\n          \"Driver\": \"local\",\n          \"Mountpoint\": \"\/var\/lib\/containers\/storage\/volumes\/app-data\/_data\",\n          \"CreatedAt\": \"2026-04-14T08:47:47.532770561Z\"\n     }\n]<\/code><\/pre>\n\n\n<p>Use volumes when running containers to persist data across restarts:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman run -d --name db -v app-data:\/var\/lib\/data docker.io\/library\/redis:latest<\/code><\/pre>\n\n\n<p>List available networks:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman network ls<\/code><\/pre>\n\n\n<p>Podman uses Netavark as the network backend on Ubuntu 26.04, providing DNS resolution between containers on the same network:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>NETWORK ID    NAME                  DRIVER\n2f259bab93aa  podman                bridge\n77d32d623a93  compose-demo_default  bridge<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Essential Container Management Commands<\/h2>\n\n\n<p>Here is a quick reference for the commands you will use daily. If you have worked with <a href=\"https:\/\/computingforgeeks.com\/install-nginx-ubuntu-2604-lets-encrypt\/\" target=\"_blank\" rel=\"noreferrer noopener\">Nginx on Ubuntu 26.04<\/a> or similar services, these patterns will feel familiar.<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>podman ps -a                     # List all containers including stopped\npodman stop web-server           # Stop a container gracefully\npodman start web-server          # Start a stopped container\npodman restart web-server        # Restart a container\npodman rm web-server             # Remove a stopped container\npodman rm -f web-server          # Force remove a running container\npodman rmi nginx:latest          # Remove an image\npodman exec -it web-server bash  # Open a shell inside a container\npodman inspect web-server        # View container details (JSON)\npodman stats                     # Live resource usage (CPU, memory, I\/O)\npodman system prune -a           # Remove unused containers, images, volumes<\/code><\/pre>\n\n\n<p>Here is how it looks with containers and pods running on a live Ubuntu 26.04 system:<\/p>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/04\/wm-podman-containers-pods-ubuntu-2604.png\" alt=\"Podman containers and pods running on Ubuntu 26.04 LTS\" title=\"\"><figcaption>Podman 5.7.0 running containers and pods on Ubuntu 26.04 LTS<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Podman vs Docker: Feature Comparison<\/h2>\n\n\n<p>The question most people ask before switching: what exactly is different? Both tools run OCI containers and accept the same CLI commands. The architectural differences matter for security, server management, and how you think about container lifecycle.<\/p>\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Feature<\/th><th>Podman<\/th><th>Docker<\/th><\/tr><\/thead><tbody><tr><td>Architecture<\/td><td>Daemonless, each container is a child process<\/td><td>Client-server, dockerd daemon required<\/td><\/tr><tr><td>Root requirement<\/td><td>Rootless by default, no special group<\/td><td>Requires root or docker group membership<\/td><\/tr><tr><td>Container runtime<\/td><td>crun (default on Ubuntu 26.04)<\/td><td>runc (default)<\/td><\/tr><tr><td>Pod support<\/td><td>Native pods (Kubernetes-style)<\/td><td>No native pod concept<\/td><\/tr><tr><td>Systemd integration<\/td><td>Quadlets, first-class systemd citizen<\/td><td>Requires custom unit files<\/td><\/tr><tr><td>Socket<\/td><td>No persistent socket (optional API socket)<\/td><td>\/var\/run\/docker.sock (attack surface)<\/td><\/tr><tr><td>CLI compatibility<\/td><td>Same commands, podman-docker package for alias<\/td><td>Native docker command<\/td><\/tr><tr><td>Compose<\/td><td>podman-compose or docker-compose with socket<\/td><td>docker compose (built-in plugin)<\/td><\/tr><tr><td>Image format<\/td><td>OCI and Docker formats<\/td><td>OCI and Docker formats<\/td><\/tr><tr><td>Build tool<\/td><td>Buildah (bundled)<\/td><td>BuildKit (bundled)<\/td><\/tr><tr><td>Networking<\/td><td>Netavark (replaces CNI)<\/td><td>libnetwork<\/td><\/tr><tr><td>Storage driver<\/td><td>overlay (default)<\/td><td>overlay2 (default)<\/td><\/tr><tr><td>Restart on boot<\/td><td>Quadlet .container files or systemd user units<\/td><td>&#8211;restart=always flag<\/td><\/tr><tr><td>Swarm mode<\/td><td>Not supported<\/td><td>Built-in Docker Swarm<\/td><\/tr><tr><td>Resource overhead<\/td><td>Lower (no daemon process)<\/td><td>Higher (dockerd + containerd)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n<p>The practical difference comes down to this: Docker needs a daemon running at all times, and that daemon runs as root. Podman forks a container process directly, and that process can run as your regular user. For servers where you want minimal attack surface and tight systemd integration, Podman is the better fit. Docker still wins if you need Swarm orchestration or if your toolchain has hard Docker dependencies.<\/p>\n\n<p>Both tools produce identical OCI images. An image built with Podman runs on Docker, and vice versa. Migration in either direction is straightforward because the CLI is intentionally compatible.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Podman runs containers without a daemon. That single difference changes how you think about container security on a server. There is no long-running root process managing your workloads, no socket to protect, and every container can run under a regular user account with zero extra configuration. This guide walks through installing Podman on Ubuntu 26.04 &#8230; <a title=\"Install Podman on Ubuntu 26.04 LTS (Docker Alternative)\" class=\"read-more\" href=\"https:\/\/computingforgeeks.com\/install-podman-ubuntu-2604\/\" aria-label=\"Read more about Install Podman on Ubuntu 26.04 LTS (Docker Alternative)\">Read more<\/a><\/p>\n","protected":false},"author":32,"featured_media":166064,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[316,299,50,37050,81],"tags":[218,217,282,4449,2254,39816],"cfg_series":[39800],"class_list":["post-166061","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-containers","category-how-to","category-linux-tutorials","category-podman","category-ubuntu","tag-containers","tag-docker","tag-linux","tag-podman","tag-ubuntu","tag-ubuntu-26-04","cfg_series-ubuntu-2604-devops-tools"],"_links":{"self":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/166061","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/users\/32"}],"replies":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/comments?post=166061"}],"version-history":[{"count":2,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/166061\/revisions"}],"predecessor-version":[{"id":166509,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/166061\/revisions\/166509"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/media\/166064"}],"wp:attachment":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/media?parent=166061"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/categories?post=166061"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/tags?post=166061"},{"taxonomy":"cfg_series","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/cfg_series?post=166061"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}