2025-10-07 11:20:26 +01:00
..
2025-10-07 11:05:08 +01:00
2025-10-07 11:20:26 +01:00
2025-10-07 11:05:08 +01:00

Podman Task Service

Overview

The Podman task service provides a complete installation and configuration of Podman, a daemonless container engine for developing, managing, and running OCI Containers on Linux systems. Podman provides a Docker-compatible command line interface while running containers without requiring a daemon, offering enhanced security and flexibility.

Features

Core Container Features

  • Daemonless Architecture - No background daemon required for container operations
  • Docker Compatibility - Drop-in replacement for Docker CLI commands
  • OCI Compliance - Full Open Container Initiative specification compliance
  • Rootless Containers - Run containers without root privileges
  • Pod Management - Kubernetes-style pod support with multiple containers

Security Features

  • Rootless Operation - Enhanced security through non-privileged execution
  • User Namespaces - Isolated user spaces for container processes
  • SELinux Integration - Native SELinux support for mandatory access control
  • No Daemon Attack Surface - Reduced security risks without persistent daemon
  • Fork/Exec Model - Direct process execution without daemon intermediary

Runtime Support

  • Multiple Runtimes - Support for crun, runc, youki, and custom runtimes
  • Runtime Selection - Per-container runtime selection capability
  • Performance Optimization - Runtime-specific performance tuning
  • OCI Runtime Spec - Full compliance with OCI runtime specification
  • Custom Runtime Integration - Easy integration of custom container runtimes

Advanced Features

  • Systemd Integration - Native systemd service management
  • Container Images - Build, pull, push, and manage container images
  • Network Management - Advanced networking with CNI plugin support
  • Volume Management - Persistent storage and bind mount support
  • Container Orchestration - Basic orchestration capabilities

Development Features

  • Build Support - Dockerfile and Containerfile support
  • Image Management - Local and remote image registry support
  • Development Tools - Debugging and development utilities
  • CI/CD Integration - Pipeline and automation support
  • Multi-Architecture - Cross-platform container support

Configuration

Basic Configuration

podman: Podman = {
    name: "podman"
    version: "4.7.2"
    runtime_default: "crun"
    runtimes: "crun,runc"
}

Production Configuration

podman: Podman = {
    name: "podman"
    version: "4.7.2"
    runtime_default: "crun"
    runtimes: "crun,runc,youki"
    configuration: {
        containers_conf: {
            default_ulimits: [
                "nofile=1024:2048",
                "nproc=1024:2048"
            ]
            dns_servers: ["8.8.8.8", "8.8.4.4"]
            dns_searches: ["company.com"]
            dns_options: ["ndots:2", "edns0"]
            default_capabilities: [
                "CHOWN",
                "DAC_OVERRIDE", 
                "FOWNER",
                "FSETID",
                "KILL",
                "NET_BIND_SERVICE",
                "SETFCAP",
                "SETGID",
                "SETPCAP",
                "SETUID",
                "SYS_CHROOT"
            ]
            default_sysctls: {
                "net.ipv4.ping_group_range": "0 0"
            }
        }
        storage_conf: {
            driver: "overlay"
            runroot: "/run/containers/storage"
            graphroot: "/var/lib/containers/storage"
            options: {
                overlay: {
                    mountopt: "nodev,metacopy=on"
                    size: "10G"
                }
            }
        }
        registries_conf: {
            unqualified_search_registries: [
                "registry.fedoraproject.org",
                "registry.access.redhat.com",
                "docker.io",
                "quay.io"
            ]
            short_name_mode: "enforcing"
        }
    }
    security: {
        apparmor_profile: "containers-default-0.46.0"
        seccomp_profile: "/usr/share/containers/seccomp.json"
        selinux_enabled: true
        no_new_privileges: true
    }
}

Rootless Configuration

podman: Podman = {
    name: "podman"
    version: "4.7.2"
    runtime_default: "crun"
    runtimes: "crun,runc"
    rootless: {
        enabled: true
        user: "containers"
        uid_range: "100000:65536"
        gid_range: "100000:65536"
        max_user_namespaces: 15000
        enable_linger: true
        cgroup_manager: "systemd"
        events_logger: "journald"
        runtime_supports_json: ["crun", "runc", "youki"]
        runtime_supports_kvm: ["crun"]
        runtime_supports_nocgroups: ["crun", "youki"]
    }
    networking: {
        default_network: "podman"
        default_subnet: "10.88.0.0/16"
        default_subnetv6: "fd00::/64"
        dns_bind_port: 53
        enable_port_reservation: true
        network_cmd_options: []
        cni_plugin_dirs: [
            "/usr/local/libexec/cni",
            "/usr/libexec/cni",
            "/usr/local/lib/cni",
            "/usr/lib/cni",
            "/opt/cni/bin"
        ]
    }
}

Multi-Runtime Configuration

podman: Podman = {
    name: "podman"
    version: "4.7.2"
    runtime_default: "crun"
    runtimes: "crun,runc,youki"
    runtime_configs: {
        crun: {
            runtime_path: "/usr/bin/crun"
            runtime_type: "oci"
            runtime_root: "/run/crun"
            runtime_args: []
            supports_json: true
            supports_kvm: true
            supports_nocgroups: true
        }
        runc: {
            runtime_path: "/usr/bin/runc"
            runtime_type: "oci"
            runtime_root: "/run/runc"
            runtime_args: ["--systemd-cgroup"]
            supports_json: true
            supports_kvm: false
            supports_nocgroups: false
        }
        youki: {
            runtime_path: "/usr/local/bin/youki"
            runtime_type: "oci"
            runtime_root: "/run/youki"
            runtime_args: []
            supports_json: true
            supports_kvm: false
            supports_nocgroups: true
        }
    }
    performance: {
        max_parallel_downloads: 3
        pull_policy: "missing"
        image_default_transport: "docker://"
        compression_format: "gzip"
        compression_level: 5
    }
}

Enterprise Configuration

podman: Podman = {
    name: "podman"
    version: "4.7.2"
    runtime_default: "crun"
    runtimes: "crun,runc"
    enterprise: {
        policy_path: "/etc/containers/policy.json"
        signature_policy: {
            default: [{"type": "insecureAcceptAnything"}]
            transports: {
                docker: {
                    "registry.company.com": [
                        {
                            type: "signedBy"
                            keyType: "GPGKeys"
                            keyPath: "/etc/pki/containers/pubring.gpg"
                        }
                    ]
                    "docker.io": [{"type": "insecureAcceptAnything"}]
                }
            }
        }
        registries: {
            "registry.company.com": {
                location: "registry.company.com"
                insecure: false
                blocked: false
                mirror: []
                prefix: "registry.company.com"
            }
            "docker.io": {
                location: "docker.io"
                insecure: false
                blocked: false
                mirror: [
                    {
                        location: "mirror.company.com"
                        insecure: false
                    }
                ]
            }
        }
        storage: {
            driver: "overlay"
            runroot: "/run/containers/storage"
            graphroot: "/var/lib/containers/storage"
            quota: {
                size: "100G"
            }
        }
    }
    monitoring: {
        metrics_enabled: true
        metrics_port: 9090
        events_logger: "journald"
        log_driver: "journald"
        log_size_max: "10MB"
        log_opts: {
            max_size: "10m"
            max_file: "3"
        }
    }
}

Development Configuration

podman: Podman = {
    name: "podman"
    version: "4.7.2"
    runtime_default: "crun"
    runtimes: "crun,runc,youki"
    development: {
        buildah_isolation: "oci"
        buildah_format: "oci"
        pull_policy: "newer"
        short_name_mode: "permissive"
        helper_binaries_dir: [
            "/usr/local/libexec/podman",
            "/usr/local/lib/podman",
            "/usr/libexec/podman",
            "/usr/lib/podman"
        ]
        hooks_dir: [
            "/usr/share/containers/oci/hooks.d"
        ]
        image_copy_tmp_dir: "/var/tmp"
        tmp_dir: "/tmp"
        volume_path: "/var/lib/containers/storage/volumes"
    }
    testing: {
        test_kitchen_enabled: true
        bats_enabled: true
        integration_tests: true
        unit_tests: true
        performance_tests: true
    }
}

Usage

Deploy Podman

./core/nulib/provisioning taskserv create podman --infra <infrastructure-name>

List Available Task Services

./core/nulib/provisioning taskserv list

SSH to Podman Server

./core/nulib/provisioning server ssh <podman-server>

Basic Container Operations

# Check Podman version
podman --version

# Run a container
podman run -d --name nginx -p 8080:80 nginx:latest

# List running containers
podman ps

# List all containers
podman ps -a

# Stop a container
podman stop nginx

# Remove a container
podman rm nginx

# Execute command in container
podman exec -it nginx /bin/bash

Image Management

# Pull an image
podman pull docker.io/library/nginx:latest

# List images
podman images

# Build an image from Dockerfile
podman build -t myapp:latest .

# Push image to registry
podman push myapp:latest registry.company.com/myapp:latest

# Remove an image
podman rmi nginx:latest

# Search for images
podman search nginx

Pod Management

# Create a pod
podman pod create --name mypod -p 8080:80

# Add containers to pod
podman run -d --pod mypod --name web nginx:latest
podman run -d --pod mypod --name redis redis:latest

# List pods
podman pod ls

# Start/stop pod
podman pod start mypod
podman pod stop mypod

# Remove pod
podman pod rm mypod

Network Management

# List networks
podman network ls

# Create a network
podman network create mynetwork

# Inspect network
podman network inspect mynetwork

# Connect container to network
podman network connect mynetwork nginx

# Disconnect container from network
podman network disconnect mynetwork nginx

# Remove network
podman network rm mynetwork

Volume Management

# Create a volume
podman volume create myvolume

# List volumes
podman volume ls

# Inspect volume
podman volume inspect myvolume

# Use volume in container
podman run -d --name nginx -v myvolume:/data nginx:latest

# Remove volume
podman volume rm myvolume

# Prune unused volumes
podman volume prune

Systemd Integration

# Generate systemd unit file
podman generate systemd --new --name nginx > ~/.config/systemd/user/nginx.service

# Enable and start service
systemctl --user daemon-reload
systemctl --user enable nginx.service
systemctl --user start nginx.service

# Check service status
systemctl --user status nginx.service

# Generate Kubernetes YAML
podman generate kube nginx > nginx-pod.yaml

Rootless Operations

# Run rootless container
podman run --rm -it --user 1000:1000 alpine:latest /bin/sh

# Check rootless configuration
podman info --debug

# Setup rootless networking
podman network create --subnet 10.89.0.0/24 rootless-net

# Port mapping in rootless mode
podman run -d --name web -p 8080:80 nginx:latest

# Check user namespaces
podman unshare cat /proc/self/uid_map

Registry Operations

# Login to registry
podman login registry.company.com

# Pull from private registry
podman pull registry.company.com/myapp:latest

# Push to private registry
podman push myapp:latest registry.company.com/myapp:latest

# Logout from registry
podman logout registry.company.com

# Configure registry mirrors
podman info | grep -A 5 registries

Architecture

System Architecture

┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   Applications  │────│   Podman CLI     │────│   Container     │
│                 │    │                  │    │   Runtime       │
│ • User Commands │    │ • Command Parser │    │                 │
│ • Scripts       │────│ • API Interface  │────│ • crun/runc     │
│ • Automation    │    │ • Image Mgmt     │    │ • youki         │
│ • CI/CD         │    │ • Registry API   │    │ • Containers    │
└─────────────────┘    └──────────────────┘    └─────────────────┘

Daemonless Architecture

┌─────────────────────────────────────────────────────────────┐
│                    Podman Architecture                     │
├─────────────────────────────────────────────────────────────┤
│  CLI Commands      │  Library Layer    │  Runtime Layer    │
│                    │                   │                   │
│ • podman run       │ • libpod          │ • OCI Runtime     │
│ • podman build     │ • libimage        │ • Network CNI     │
│ • podman pod       │ • storage         │ • Storage Driver  │
│ • podman network   │ • networking      │ • Systemd         │
├─────────────────────────────────────────────────────────────┤
│                   No Background Daemon                     │
├─────────────────────────────────────────────────────────────┤
│  Host Resources    │  User Namespaces  │  Security         │
│                    │                   │                   │
│ • Storage          │ • UID/GID Mapping │ • SELinux         │
│ • Network          │ • Capabilities    │ • AppArmor        │
│ • Process Tree     │ • Mount NS        │ • Seccomp         │
└─────────────────────────────────────────────────────────────┘

Runtime Comparison

Runtime  │ Language │ Performance │ Features      │ Security
─────────┼──────────┼─────────────┼───────────────┼──────────
crun     │ C        │ Fastest     │ Full OCI      │ High
runc     │ Go       │ Fast        │ Full OCI      │ High
youki    │ Rust     │ Very Fast   │ Partial OCI   │ High

File Structure

/usr/bin/podman              # Main podman binary
/etc/containers/             # System configuration
├── containers.conf          # Main configuration
├── storage.conf            # Storage configuration
├── registries.conf         # Registry configuration
├── policy.json             # Image signature policy
└── mounts.conf            # Additional mount points

~/.config/containers/        # User configuration
├── containers.conf         # User-specific config
├── storage.conf           # User storage config
└── registries.conf        # User registry config

/var/lib/containers/        # System storage
├── storage/               # Container images and data
├── cache/                # Image cache
└── tmp/                  # Temporary files

~/.local/share/containers/  # User storage (rootless)
├── storage/              # User container storage
└── cache/               # User image cache

Supported Operating Systems

  • Ubuntu 20.04+ / Debian 11+
  • CentOS 8+ / RHEL 8+ / Fedora 35+
  • Amazon Linux 2+
  • SUSE Linux Enterprise 15+

System Requirements

Minimum Requirements

  • RAM: 2GB (4GB+ recommended)
  • Storage: 20GB (100GB+ for production)
  • CPU: 2 cores (4+ cores recommended)
  • Kernel: Linux 4.18+ with user namespaces

Production Requirements

  • RAM: 8GB+ (depends on workload)
  • Storage: 100GB+ SSD
  • CPU: 4+ cores
  • Network: High bandwidth for image operations

Rootless Requirements

  • User Namespaces - Kernel support for user namespaces
  • UID/GID Mapping - Proper subuid/subgid configuration
  • Cgroups v2 - For resource management in rootless mode
  • Systemd - For service management

Troubleshooting

Installation Issues

# Check Podman installation
podman --version
podman info

# Check runtime availability
podman info | grep -A 5 runtimes

# Test basic functionality
podman run --rm hello-world

# Check system requirements
podman system check

Rootless Issues

# Check user namespace configuration
cat /etc/subuid
cat /etc/subgid

# Check rootless setup
podman unshare cat /proc/self/uid_map
podman unshare cat /proc/self/gid_map

# Fix rootless networking
podman system reset --force
podman network create default

# Check cgroup configuration
cat /proc/cgroups
systemctl --user status

Container Issues

# Check container logs
podman logs container-name

# Debug container startup
podman run --rm -it --entrypoint /bin/sh image-name

# Check container processes
podman top container-name

# Inspect container configuration
podman inspect container-name

# Check resource usage
podman stats container-name

Image Issues

# Check image information
podman inspect image-name

# Debug image build
podman build --no-cache -t test .

# Check registry connectivity
podman pull --log-level debug image-name

# Clean up unused images
podman image prune
podman system prune

Network Issues

# Check network configuration
podman network ls
podman network inspect podman

# Test container networking
podman run --rm --net host alpine ping google.com

# Check port binding
podman port container-name
netstat -tlnp | grep podman

# Debug CNI issues
journalctl -u podman

Storage Issues

# Check storage configuration
podman info | grep -A 10 store

# Check storage usage
podman system df

# Clean storage
podman system prune -a

# Reset storage (destructive)
podman system reset

# Check permissions
ls -la /var/lib/containers/

Security Considerations

Rootless Security

  • User Namespace Security - Containers run in isolated user namespaces
  • No Root Access - Eliminates many privilege escalation vectors
  • Process Isolation - Container processes isolated from host
  • Resource Limits - Automatic resource constraints

Image Security

  • Image Signing - Verify image signatures before execution
  • Registry Security - Use trusted registries and mirrors
  • Vulnerability Scanning - Regular image vulnerability scanning
  • Minimal Images - Use minimal base images

Runtime Security

  • SELinux/AppArmor - Mandatory access control integration
  • Seccomp Profiles - System call filtering
  • Capabilities - Minimize container capabilities
  • No New Privileges - Prevent privilege escalation

Network Security

  • Network Isolation - Isolate container networks
  • Firewall Integration - Integration with host firewall
  • Port Security - Careful port mapping and exposure
  • TLS Communication - Secure registry communication

Performance Optimization

Image Optimization

  • Layer Optimization - Minimize image layers and size
  • Multi-Stage Builds - Use multi-stage builds for efficiency
  • Image Caching - Optimize local image caching
  • Registry Mirrors - Use local registry mirrors

Runtime Optimization

  • Runtime Selection - Choose optimal runtime for workload
  • Resource Limits - Set appropriate resource constraints
  • Storage Driver - Optimize storage driver selection
  • Network Performance - Optimize network configuration

System Optimization

  • Storage Performance - Use fast storage for container data
  • Memory Management - Optimize host memory allocation
  • CPU Affinity - Pin containers to specific CPUs
  • Kernel Parameters - Tune kernel parameters for containers

Monitoring Optimization

  • Metrics Collection - Collect relevant performance metrics
  • Log Management - Efficient log collection and rotation
  • Health Monitoring - Monitor container health
  • Resource Monitoring - Track resource usage

Integration Examples

Docker Compose Compatibility

# Use podman-compose
pip3 install podman-compose

# Run docker-compose.yml
podman-compose up -d

# Alternative: use docker-compose with podman
export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock
systemctl --user enable podman.socket
docker-compose up -d

Kubernetes Integration

# Generate Kubernetes YAML
podman generate kube mypod > mypod.yaml

# Play Kubernetes YAML
podman play kube mypod.yaml

# Generate systemd services
podman generate systemd --new mypod > mypod.service

CI/CD Integration

# GitLab CI example
build:
  image: quay.io/podman/stable
  script:
    - podman build -t myapp:$CI_COMMIT_SHA .
    - podman push myapp:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

Systemd Service Template

[Unit]
Description=Podman container-%i.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=%t/containers

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
TimeoutStopSec=70
ExecStartPre=/bin/rm -f %t/%n.ctr-id
ExecStart=/usr/bin/podman run --cidfile=%t/%n.ctr-id --cgroups=no-conmon --rm --sdnotify=conmon --replace --name %i $IMAGE
ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id
ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id
Type=notify
NotifyAccess=all

[Install]
WantedBy=multi-user.target default.target

Resources