॥ श्री ॥

Containers

Software & Apps 2026-08-28

Shanios is a first-class container platform. The following runtimes are pre-installed and ready to use:

RuntimeBest forWiki
PodmanOCI containers, services, databases, Docker-compatible workflowsThis page
DistroboxMutable Linux envs (apt/pacman/yay) with home dir sharingdistrobox
LXC / LXDFull system containers with init, services, network stacklxc-lxd
systemd-nspawnLightweight full-system containers, no daemonsystemd-nspawn
ApptainerHPC/cluster portable containers (SIF format)apptainer
GPU containersCUDA / ROCm / oneAPI compute via Distrobox or Podmangpu-containers

Container storage lives in dedicated Btrfs subvolumes, completely independent of the OS slots:

ToolStorage LocationBtrfs Subvolume
Podman (user)~/.local/share/containers/(in @home)
Podman (root)/var/lib/containers/storage/@containers
Distrobox/var/lib/containers/@containers
LXD/var/lib/lxd/@lxd
LXC/var/lib/lxc/@lxc
nspawn/var/lib/machines/@machines

All subvolumes survive every OS update and atomic rollback untouched.


Podman (Default Runtime)

Podman is the default daemonless, rootless container runtime. Its CLI is identical to Docker's. podman.socket is socket-activated at boot. The podman-docker drop-in is pre-installed — existing docker commands work without modification.

Pods (pre-installed on every edition) provides a graphical interface for managing containers, images, volumes, and networks.

Basic Commands

# Pull and run an interactive container
podman run -it --rm ubuntu:24.04 bash

# Run a web server in the background
podman run -d --name myapp -p 8080:80 nginx

# List containers
podman ps           # running
podman ps -a        # all (including stopped)

# Logs
podman logs myapp
podman logs -f myapp

# Stop, remove
podman stop myapp
podman rm myapp

# Execute in a running container
podman exec -it myapp bash

# List images
podman images

Common Services

# PostgreSQL
podman volume create postgres-data
podman run -d \
  --name postgres \
  -e POSTGRES_PASSWORD=secret \
  -e POSTGRES_DB=mydb \
  -v postgres-data:/var/lib/postgresql/data \
  -p 127.0.0.1:5432:5432 \
  postgres:16

# Redis
podman run -d \
  --name redis \
  -p 127.0.0.1:6379:6379 \
  redis:7-alpine redis-server --appendonly yes

Podman Compose

# Run a docker-compose.yml
podman-compose up -d
podman-compose logs -f
podman-compose down

# Or via the docker drop-in
docker compose up -d

Auto-Start Containers at Login

# Generate a systemd user unit from a running container
podman generate systemd --new --name myapp > ~/.config/systemd/user/myapp.service

# Enable
systemctl --user enable --now myapp.service
systemctl --user status myapp.service

Docker Compatibility

The podman-docker package provides /usr/bin/docker as a wrapper. For tools that use the Docker API socket:

# Enable the Podman socket for Docker API compatibility
systemctl --user start podman.socket
export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock

Buildah & Skopeo

Buildah builds OCI images without a daemon:

# Build from a Dockerfile/Containerfile
buildah bud -t myimage:latest .

# Scripted build without a Dockerfile
ctr=$(buildah from ubuntu:24.04)
buildah run $ctr -- apt-get update
buildah run $ctr -- apt-get install -y curl
buildah commit $ctr myimage:latest
buildah rm $ctr

Skopeo inspects and copies images between registries without pulling them:

# Copy between registries
skopeo copy docker://docker.io/nginx:latest docker://registry.example.com/nginx:latest

# Inspect image metadata without pulling
skopeo inspect docker://docker.io/ubuntu:24.04

# Delete a remote tag
skopeo delete docker://registry.example.com/old-image:tag

Storage Efficiency

Container images use content-addressed storage — layers shared between images are stored once. Btrfs zstd compression and the bees deduplication daemon apply at the block level on top of Podman's own layer sharing.

# Podman's view of disk usage
podman system df

# Btrfs compressed view
sudo compsize /var/lib/containers

# Prune unused images, containers, volumes
podman system prune -af --volumes

See Also