Skip to content
Joey Wang
Menu

Search

DevOps and Reliability

Incus vs. Docker: System Containers vs. App Containers

A practical comparison of Incus and Docker: when system containers suit development environments better than single-process application containers.

· 3 min read

devops #docker#incus#linux#devops

Audio summary

Docker is the household name in containerization, but it was built around one idea: package a single process. Incus takes a different approach: it packages a full Linux OS as a container, giving you something like an instant VM that runs at container speed. Once you need more than “run this one process,” that difference starts to matter.

Key differences at a glance

FeatureDockerIncus
PhilosophyOne process per containerOne full OS per container
Primary useMicroservices, CI/CD, deploymentDevelopment labs, AI sandboxing, VPS replacement
Init systemNo (usually just an entrypoint)Yes (systemd, OpenRC work natively)
SecurityProcess-level isolationUnprivileged containers by default, plus VM support
PersistenceVolatile (needs volumes or bind mounts)Persistent, acts like a physical disk
HardwareHard to pass through GPUs or USBNative, low-latency device passthrough

Command comparison

If you already know Docker, learning Incus is mostly a matter of mapping familiar verbs to new ones.

ActionDocker commandIncus command
Start a containerdocker run -d --name web ubuntuincus launch images:ubuntu/24.04 web
List containersdocker psincus list
Access shelldocker exec -it web bashincus shell web
Stop containerdocker stop webincus stop web
Remove containerdocker rm -f webincus delete -f web
Create imagedocker commit web my-imageincus publish web --alias my-image
View logsdocker logs webincus info --show-log web
Copy filesdocker cp file web:/pathincus file push file web/path

Setting up Incus (Ubuntu 24.04+)

Incus is officially in the latest Ubuntu repositories, so getting it running is straightforward.

Installation and init

# Install the core packages
sudo apt update && sudo apt install -y incus

# Add your user to the management group
sudo usermod -aG incus-admin $USER
newgrp incus-admin

# Initialize the system (interactive wizard)
incus admin init

During init, choosing ZFS or Btrfs for storage gets you near-instant snapshots later, which is worth the extra setup step.

Launching your first dev box

Unlike Docker Hub, Incus talks to multiple “remotes.” The most common is the community-maintained images: server.

# Launch a persistent Ubuntu 24.04 container
incus launch images:ubuntu/24.04 dev-box

# Launch a MicroVM (for AI sandboxing or extra isolation)
incus launch images:ubuntu/24.04 ai-box --vm

Managing more than one container

Profiles for repeatable configuration

Instead of configuring each container by hand, profiles apply a set of settings, GPU access or mounted folders, for example, to many containers at once.

# Create a profile for Rails development
incus profile create rails-dev

# Add a device to map your code folder from the host
incus profile device add rails-dev my-code disk \
    source=/home/user/projects/app \
    path=/root/app

# Apply this profile to your container
incus profile add dev-box rails-dev

Snapshots as an undo button

This is where Incus is genuinely better than Docker for development work. Before a risky change:

# Create a snapshot
incus snapshot create dev-box pre-upgrade

# Messed up? Restore instantly
incus restore dev-box pre-upgrade

Running Docker inside Incus

You can have both. To nest Docker inside an Incus container:

incus config set dev-box security.nesting=true
incus restart dev-box
# Now install docker inside the dev-box as usual

Which one to reach for

Use Docker when you have a finished app you want to ship to the cloud. Use Incus when you’re building that app: it gives you a stable, persistent, high-performance environment that handles system services and hardware directly, while keeping your host machine clean.