Tools: Podman Has a Free API: Daemonless Container Engine with Docker Compatibility - Guide
What Is Podman?
Quick Start
Podman REST API
Pod Management
Image Management
Generate Kubernetes YAML
Podman vs Docker Podman is a daemonless, rootless container engine that is a drop-in replacement for Docker. It provides a REST API, CLI compatibility, and unique features like pod management and systemd integration. Podman (Pod Manager) is an OCI-compliant container runtime developed by Red Hat. Unlike Docker, it runs without a daemon process and can run containers as a non-root user, making it more secure by default. Podman provides both a Docker-compatible API and its own extended API: Need to scrape web data for your container workflows? Check out my web scraping tools on Apify — production-ready actors for Reddit, Google Maps, and more. Questions? Email me at [email protected] Templates let you quickly answer FAQs or store snippets for re-use. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse
# Install Podman
# macOS
-weight: 500;">brew -weight: 500;">install podman
podman machine init
podman machine -weight: 500;">start # Ubuntu/Debian
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install podman # Run a container (same as -weight: 500;">docker!)
podman run -d -p 8080:80 nginx
podman ps
podman logs <container-id>
# Install Podman
# macOS
-weight: 500;">brew -weight: 500;">install podman
podman machine init
podman machine -weight: 500;">start # Ubuntu/Debian
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install podman # Run a container (same as -weight: 500;">docker!)
podman run -d -p 8080:80 nginx
podman ps
podman logs <container-id>
# Install Podman
# macOS
-weight: 500;">brew -weight: 500;">install podman
podman machine init
podman machine -weight: 500;">start # Ubuntu/Debian
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install podman # Run a container (same as -weight: 500;">docker!)
podman run -d -p 8080:80 nginx
podman ps
podman logs <container-id>
import requests # Enable Podman API socket
# -weight: 500;">systemctl --user -weight: 500;">start podman.socket
# Or: podman system -weight: 500;">service --time 0 & PODMAN = "http://localhost:8080/v4.0.0/libpod"
DOCKER_COMPAT = "http://localhost:8080/v1.41" # Docker-compatible # List containers (Podman API)
containers = requests.get(f"{PODMAN}/containers/json").json()
for c in containers: print(f"Container: {c['Names'][0]}, State: {c['State']}, Image: {c['Image']}") # Create and -weight: 500;">start container
new_container = requests.post(f"{PODMAN}/containers/create", json={ "image": "-weight: 500;">docker.io/library/redis:alpine", "name": "my-redis", "portmappings": [{"container_port": 6379, "host_port": 6379}]
}).json()
requests.post(f"{PODMAN}/containers/{new_container['Id']}/-weight: 500;">start")
import requests # Enable Podman API socket
# -weight: 500;">systemctl --user -weight: 500;">start podman.socket
# Or: podman system -weight: 500;">service --time 0 & PODMAN = "http://localhost:8080/v4.0.0/libpod"
DOCKER_COMPAT = "http://localhost:8080/v1.41" # Docker-compatible # List containers (Podman API)
containers = requests.get(f"{PODMAN}/containers/json").json()
for c in containers: print(f"Container: {c['Names'][0]}, State: {c['State']}, Image: {c['Image']}") # Create and -weight: 500;">start container
new_container = requests.post(f"{PODMAN}/containers/create", json={ "image": "-weight: 500;">docker.io/library/redis:alpine", "name": "my-redis", "portmappings": [{"container_port": 6379, "host_port": 6379}]
}).json()
requests.post(f"{PODMAN}/containers/{new_container['Id']}/-weight: 500;">start")
import requests # Enable Podman API socket
# -weight: 500;">systemctl --user -weight: 500;">start podman.socket
# Or: podman system -weight: 500;">service --time 0 & PODMAN = "http://localhost:8080/v4.0.0/libpod"
DOCKER_COMPAT = "http://localhost:8080/v1.41" # Docker-compatible # List containers (Podman API)
containers = requests.get(f"{PODMAN}/containers/json").json()
for c in containers: print(f"Container: {c['Names'][0]}, State: {c['State']}, Image: {c['Image']}") # Create and -weight: 500;">start container
new_container = requests.post(f"{PODMAN}/containers/create", json={ "image": "-weight: 500;">docker.io/library/redis:alpine", "name": "my-redis", "portmappings": [{"container_port": 6379, "host_port": 6379}]
}).json()
requests.post(f"{PODMAN}/containers/{new_container['Id']}/-weight: 500;">start")
# Create a pod (group of containers sharing network)
pod = requests.post(f"{PODMAN}/pods/create", json={ "name": "webapp-pod", "portmappings": [{"container_port": 8080, "host_port": 8080}]
}).json() # Add containers to pod
requests.post(f"{PODMAN}/containers/create", json={ "image": "-weight: 500;">docker.io/library/nginx:alpine", "name": "web", "pod": "webapp-pod"
}) requests.post(f"{PODMAN}/containers/create", json={ "image": "-weight: 500;">docker.io/library/redis:alpine", "name": "cache", "pod": "webapp-pod"
}) # Start the entire pod
requests.post(f"{PODMAN}/pods/webapp-pod/-weight: 500;">start") # List pods
pods = requests.get(f"{PODMAN}/pods/json").json()
for p in pods: print(f"Pod: {p['Name']}, Containers: {len(p['Containers'])}, Status: {p['Status']}")
# Create a pod (group of containers sharing network)
pod = requests.post(f"{PODMAN}/pods/create", json={ "name": "webapp-pod", "portmappings": [{"container_port": 8080, "host_port": 8080}]
}).json() # Add containers to pod
requests.post(f"{PODMAN}/containers/create", json={ "image": "-weight: 500;">docker.io/library/nginx:alpine", "name": "web", "pod": "webapp-pod"
}) requests.post(f"{PODMAN}/containers/create", json={ "image": "-weight: 500;">docker.io/library/redis:alpine", "name": "cache", "pod": "webapp-pod"
}) # Start the entire pod
requests.post(f"{PODMAN}/pods/webapp-pod/-weight: 500;">start") # List pods
pods = requests.get(f"{PODMAN}/pods/json").json()
for p in pods: print(f"Pod: {p['Name']}, Containers: {len(p['Containers'])}, Status: {p['Status']}")
# Create a pod (group of containers sharing network)
pod = requests.post(f"{PODMAN}/pods/create", json={ "name": "webapp-pod", "portmappings": [{"container_port": 8080, "host_port": 8080}]
}).json() # Add containers to pod
requests.post(f"{PODMAN}/containers/create", json={ "image": "-weight: 500;">docker.io/library/nginx:alpine", "name": "web", "pod": "webapp-pod"
}) requests.post(f"{PODMAN}/containers/create", json={ "image": "-weight: 500;">docker.io/library/redis:alpine", "name": "cache", "pod": "webapp-pod"
}) # Start the entire pod
requests.post(f"{PODMAN}/pods/webapp-pod/-weight: 500;">start") # List pods
pods = requests.get(f"{PODMAN}/pods/json").json()
for p in pods: print(f"Pod: {p['Name']}, Containers: {len(p['Containers'])}, Status: {p['Status']}")
# Pull an image
requests.post(f"{PODMAN}/images/pull", params={ "reference": "-weight: 500;">docker.io/library/python:3.12-slim"
}) # List images
images = requests.get(f"{PODMAN}/images/json").json()
for img in images: names = img.get("Names", ["<none>"]) size_mb = img["Size"] / 1024 / 1024 print(f"Image: {names[0]}, Size: {size_mb:.1f}MB") # Build from Dockerfile
import io
requests.post( f"{PODMAN}/build", params={"t": "my-app:latest"}, data=open("context.tar", "rb")
)
# Pull an image
requests.post(f"{PODMAN}/images/pull", params={ "reference": "-weight: 500;">docker.io/library/python:3.12-slim"
}) # List images
images = requests.get(f"{PODMAN}/images/json").json()
for img in images: names = img.get("Names", ["<none>"]) size_mb = img["Size"] / 1024 / 1024 print(f"Image: {names[0]}, Size: {size_mb:.1f}MB") # Build from Dockerfile
import io
requests.post( f"{PODMAN}/build", params={"t": "my-app:latest"}, data=open("context.tar", "rb")
)
# Pull an image
requests.post(f"{PODMAN}/images/pull", params={ "reference": "-weight: 500;">docker.io/library/python:3.12-slim"
}) # List images
images = requests.get(f"{PODMAN}/images/json").json()
for img in images: names = img.get("Names", ["<none>"]) size_mb = img["Size"] / 1024 / 1024 print(f"Image: {names[0]}, Size: {size_mb:.1f}MB") # Build from Dockerfile
import io
requests.post( f"{PODMAN}/build", params={"t": "my-app:latest"}, data=open("context.tar", "rb")
)
# Create a pod
podman pod create --name myapp -p 8080:80
podman create --pod myapp --name web nginx
podman create --pod myapp --name db postgres # Generate Kubernetes YAML from running pod
podman generate kube myapp > myapp.yaml # Deploy that YAML to Kubernetes
-weight: 500;">kubectl apply -f myapp.yaml # Or play Kubernetes YAML locally
podman play kube myapp.yaml
# Create a pod
podman pod create --name myapp -p 8080:80
podman create --pod myapp --name web nginx
podman create --pod myapp --name db postgres # Generate Kubernetes YAML from running pod
podman generate kube myapp > myapp.yaml # Deploy that YAML to Kubernetes
-weight: 500;">kubectl apply -f myapp.yaml # Or play Kubernetes YAML locally
podman play kube myapp.yaml
# Create a pod
podman pod create --name myapp -p 8080:80
podman create --pod myapp --name web nginx
podman create --pod myapp --name db postgres # Generate Kubernetes YAML from running pod
podman generate kube myapp > myapp.yaml # Deploy that YAML to Kubernetes
-weight: 500;">kubectl apply -f myapp.yaml # Or play Kubernetes YAML locally
podman play kube myapp.yaml - Daemonless architecture (no -weight: 500;">docker daemon)
- Rootless containers by default
- Docker CLI compatible
- Pod concept (like Kubernetes pods)
- REST API (Docker-compatible + Podman-specific)
- Systemd integration
- Docker Compose support (podman-compose)
- Built-in image signing - Podman Docs
- Podman GitHub — 24K+ stars
- API Reference