When you need to run isolated workloads on a self-hosted server, the choice of container or virtualization technology shapes everything — from resource overhead to security boundaries to management complexity. In 2026, three open-source options dominate this space: Incus, LXD, and Podman. Each takes a fundamentally different approach to isolation, and picking the right one depends on whether you need full system containers, daemonless application containers, or a mix of both.
This guide compares all three side by side, covering installation, configuration, networking, storage, and real-world use cases.
Why Self-Host Your Own Container Platform?
Running your own container and virtualization infrastructure gives you:
- Full data sovereignty — no telemetry, no vendor lock-in, no usage limits
- Zero recurring costs — all three tools are 100% free and open-source
- Hardware-level control — direct GPU passthrough, custom kernel modules, custom networking
- Lightweight resource usage — system containers share the host kernel with minimal overhead (typically 2-5% vs 10-20% for full VMs)
- Unified management — manage containers, virtual machines, and application containers from a single CLI
For homelab operators, small teams, and organizations running self-hosted infrastructure, these tools provide enterprise-grade isolation without the VMware or Docker Desktop price tag.
Understanding the Three Approaches
Before comparing features, it helps to understand the architectural differences:
| Feature | Incus | LXD | Podman |
|---|---|---|---|
| Type | System container & VM manager | System container & VM manager | Application container engine |
| Origin | Community fork of LXD (2023) | Canonical (original LXD lineage) | Red Hat (Docker-compatible alternative) |
| Daemon | Yes (incusd) | Yes (lxd) | No (daemonless) |
| Rootless | Partial (via user namespace) | Partial (via user namespace) | Yes (fully rootless by default) |
| OCI Images | ✅ Supported | ✅ Supported | ✅ Native support |
| System Containers | ✅ Primary focus | ✅ Primary focus | ❌ Not designed for |
| Virtual Machines | ✅ QEMU/KVM integration | ✅ QEMU/KVM integration | ❌ Not supported |
| Clustering | ✅ Native (RAFT-based) | ✅ Native (dqlite-based) | ❌ Requires external orchestrator |
| GPU Passthrough | ✅ Yes | ✅ Yes | ❌ Limited |
| Storage Drivers | ZFS, Btrfs, LVM, Ceph, dir | ZFS, Btrfs, LVM, Ceph, dir | overlay, vfs, btrfs, zfs |
| Network Drivers | Bridge, OVN, MACVLAN | Bridge, OVN, MACVLAN | Bridge, PTP, macvlan |
| License | Apache 2.0 | Apache 2.0 | Apache 2.0 |
| GitHub Stars | 5,243+ | 4,732+ | 31,498+ |
| Language | Go | Go | Go |
The Incus vs LXD Fork Situation
Incus was created in December 2023 when the Linux Containers community forked LXD after Canonical changed the project’s governance model. Both share the same codebase at the point of the fork and have diverged since. Incus emphasizes community-driven development under the Linux Containers umbrella, while LXD continues under Canonical’s stewardship with enterprise support options.
For most users, the choice between Incus and LXD comes down to governance philosophy rather than technical capability — both offer nearly identical features.
Installation Guide
Installing Incus
Incus provides packages for major Linux distributions. On Ubuntu/Debian-based systems:
| |
For Arch Linux users, Incus is available in the official repositories:
| |
Installing LXD
LXD follows a nearly identical installation pattern on Ubuntu:
| |
Installing Podman
Podman is widely available across distributions and does not require a running daemon:
| |
Managing Containers and Virtual Machines
Incus: Creating and Running System Containers
Incus uses the incus CLI (compatible with the lxc command syntax):
| |
LXD: Equivalent Commands
LXD’s CLI is nearly identical (swap incus for lxc):
| |
Podman: Running Application Containers
Podman uses Docker-compatible commands and focuses on application-level containers:
| |
Networking Configuration
Incus/LXD Network Setup
Both Incus and LXD share the same networking model. Create managed bridges with DHCP and DNS:
| |
Podman Networking
Podman uses CNI or netavark for container networking:
| |
For Podman Compose (Docker Compose equivalent):
| |
Storage Management
Incus/LXD Storage Pools
Both tools support the same storage drivers with identical configuration:
| |
Podman Storage
Podman relies on the host’s storage driver configuration, defined in containers/storage.conf:
| |
Clustering and High Availability
Incus Clustering
Incus supports native clustering using a RAFT-based consensus protocol:
| |
LXD Clustering
LXD uses dqlite for distributed consensus:
| |
Podman: External Orchestration Required
Podman does not have built-in clustering. For multi-host deployments, you need:
- Kubernetes (with CRI-O or containerd) — full orchestration
- Podman Quadlet — systemd-based single-host management
- Nomad or Swarm — external cluster managers
For simple multi-container setups on a single host, Podman Compose or Quadlet systemd units handle most use cases:
| |
Security Comparison
| Security Feature | Incus | LXD | Podman |
|---|---|---|---|
| User namespaces | ✅ Yes | ✅ Yes | ✅ Yes (default) |
| Seccomp profiles | ✅ Customizable | ✅ Customizable | ✅ Default + custom |
| AppArmor/SELinux | ✅ Both | ✅ Both | ✅ Both |
| Rootless containers | Partial | Partial | ✅ Full support |
| Image signing | ✅ Yes | ✅ Yes | ✅ Sigstore/cosign |
| RBAC | ✅ Project-based | ✅ Project-based | ❌ None (use systemd) |
| Audit logging | ✅ Built-in | ✅ Built-in | ❌ Via journald |
When to Choose Each Platform
Choose Incus when:
- You want the community-driven fork with faster iteration
- You need system containers AND virtual machines on the same platform
- You value the Linux Containers project governance model
- You’re building a homelab or small cluster
Choose LXD when:
- You want Canonical-backed enterprise support
- You’re already in the Ubuntu/Canonical ecosystem
- You need commercial SLA guarantees
- You prefer a more conservative release cycle
Choose Podman when:
- You need Docker-compatible application containers
- Rootless execution is a requirement (shared hosting, multi-tenant)
- You don’t want to run a background daemon
- You’re migrating from Docker and want drop-in compatibility
- You need CI/CD integration (GitHub Actions, GitLab CI)
Migration Paths
Docker to Podman
Podman provides a compatibility layer that makes migration nearly transparent:
| |
LXD to Incus
Since Incus is a fork of LXD, migration is straightforward:
| |
For related reading on container security, see our container image scanning guide and Kubernetes hardening comparison. If you’re evaluating full virtualization platforms instead, our Proxmox vs XCP-ng comparison covers the VM-centric alternatives.
FAQ
Is Incus better than LXD for self-hosting?
It depends on your priorities. Incus is community-driven and tends to adopt new features faster, while LXD benefits from Canonical’s enterprise support and longer testing cycles. Technically, they are nearly identical since they share the same codebase at the fork point. For personal homelabs, Incus is often preferred due to community governance. For enterprise deployments requiring vendor support, LXD may be the better choice.
Can Podman replace Docker entirely?
For most use cases, yes. Podman is drop-in compatible with Docker CLI commands, supports Docker Compose files (via podman-compose), and can run any Docker image from any registry. The main differences are that Podman is daemonless (no background service required) and supports rootless containers by default. The only gap is Docker Swarm orchestration, which Podman does not support natively.
Do Incus and LXD support Docker images?
Yes, both Incus and LXD can run OCI (Docker-format) images alongside their native system container images. Use the oci: prefix to pull Docker images:
| |
However, for pure Docker container workloads, Podman provides a more natural experience with full Docker Compose compatibility.
Can I run both Incus/LXD and Podman on the same server?
Absolutely. They operate at different layers — Incus/LXD manages system containers and VMs, while Podman manages application containers. Many self-hosted setups use Incus/LXD for the base infrastructure (databases, message brokers as system containers) and Podman for ephemeral application workloads.
How does clustering work with Incus?
Incus uses a RAFT-based consensus protocol for clustering. You designate one or more nodes as database members, and the cluster elects a leader automatically. Containers can be scheduled on any node, and the shared storage (via Ceph, NFS, or replicated ZFS) ensures data availability. Incus also supports OVN networking across cluster nodes for automatic container-to-container routing.
What is the resource overhead of system containers vs VMs?
System containers (Incus/LXD) share the host kernel, so overhead is minimal — typically 2-5% CPU and near-zero memory overhead beyond what the workload itself consumes. Virtual machines (also supported by Incus/LXD via QEMU/KVM) have higher overhead — roughly 10-20% CPU plus dedicated memory allocation. Application containers (Podman) have overhead similar to system containers since they also use kernel-level namespaces.