
Incus and Docker do not do the same job. Docker runs application containers (one process, one image, disposable) to package and distribute an application. Incus runs system containers (a complete, persistent Linux distribution) and virtual machines, in the manner of a lightweight machine. This guide explains the fundamental difference, lays it out in a clear table, and says which tool to choose for which need. For anyone hesitating between the two, or coming from Docker.
What you will learn
- The fundamental difference: application container against system container.
- A comparison table, Incus against Docker.
- Which tool to choose for your use case.
- That Incus also runs Docker images (OCI).
The fundamental difference
Everything hinges on what a container holds.
A Docker container runs a single process: your application (a web server, an API, a database). The image is built in layers, the container is ephemeral (you throw it away and recreate it), and it holds only what that process strictly needs. No init, no system services, no SSH.
An Incus container runs a complete system: a Linux distribution with its init (systemd, openrc), its services, its users, its logs. It is persistent: you connect to it, administer it, snapshot it, like a small machine. That is the difference between "packaging an application" and "provisioning a machine".
Comparison table
| Criterion | Docker | Incus |
|---|---|---|
| Container type | application (1 process) | system (complete distribution) |
| Virtual machines | no | yes (QEMU/KVM) |
| Lifetime | ephemeral | persistent |
| Image | layered (Dockerfile) | distribution (the images: remote) |
| Access | docker exec, logs | incus shell, like a machine |
| Init and services | no (1 process) | yes (systemd, openrc) |
| Typical use | deploy an app | provision a Linux server |
| Orchestration | Kubernetes, Swarm | native Incus clustering |
Which tool to choose
The right reflex: start from the need, not from the tool.
Choose Docker (or another application engine) when you want to package and distribute an application: a microservice, a reproducible web stack, a CI/CD build. The ecosystem (Docker Hub, Compose, Kubernetes) is cut out for that.
Choose Incus when you want a Linux machine: a test server, a complete development environment, a homelab, a virtual machine for another kernel or for Windows. You manage the instance as a system, with snapshots and an API, without the weight of a full hypervisor.
Incus also runs Docker images
The boundary is not sealed: since version 6.3, Incus can run OCI images (Docker's format) alongside its system containers. An nginx image from Docker Hub then starts as an application container inside Incus, marked CONTAINER (APP):
incus remote add docker https://docker.io --protocol ociincus launch docker:nginx webThat lets you run application workloads without installing Docker, on the same platform as your system containers and your virtual machines. Details in running OCI containers with Incus.
Can Incus replace Docker
Partly. For a homelab or a development workstation, running your few application services as OCI images inside Incus avoids installing Docker as well, and everything is managed in one place. For intensive application work, though (building images from a Dockerfile, multi-service Compose, Kubernetes integration), the Docker ecosystem stays more complete and better tooled. Incus complements Docker more than it fully replaces it.
Key points
- Docker means application containers (one process, ephemeral) to package an application.
- Incus means system containers (a complete, persistent distribution) and virtual machines, to provision machines.
- You choose on the need: package an app (Docker) or provision a machine (Incus).
- Since 6.3, Incus also launches OCI images (
docker:), markedCONTAINER (APP). - The two are often complementary, not competitors.
FAQ: common questions about Incus vs Docker
Application container against system container
- Docker: an application container, meaning one process (your app), a layered image, ephemeral;
- Incus: a system container, meaning a complete distribution (init, services), persistent, administered like a machine.
Incus also manages virtual machines, which Docker does not. The question is not which is better, but which matches your need: packaging an application or provisioning a machine.
Start from the need
- Docker: to package and distribute an application (microservice, web stack, CI/CD). Its ecosystem (Docker Hub, Compose, Kubernetes) is built for that.
- Incus: for a Linux machine (test server, full development environment, homelab) or a virtual machine.
The right reflex is to ask whether you want to package an app (Docker) or provision a machine (Incus). The two coexist perfectly well.
Only partly
For a homelab or a development workstation, running your few services as OCI images inside Incus avoids installing Docker, and everything is managed in one place.
But for intensive application use (building images from a Dockerfile, Docker Compose, Kubernetes integration), the Docker ecosystem stays more complete. Incus complements Docker more than it fully replaces it.
Yes, through the OCI remote
Since 6.3:
incus remote add docker https://docker.io --protocol oci
incus launch docker:nginx web
The container shows with the CONTAINER (APP) type. Incus consumes OCI images (Docker Hub and other registries) but does not build them from a Dockerfile. Details in the dedicated OCI container guide.
The iptables FORWARD DROP trap
The Docker daemon forces a global iptables FORWARD DROP policy. Incus containers then get an address on incusbr0 but have no network left, neither DNS nor internet.
The clean fix, without touching Docker:
iptables -I DOCKER-USER -i incusbr0 -j ACCEPT
iptables -I DOCKER-USER -o incusbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
An alternative is "ip-forward-no-drop": true in /etc/docker/daemon.json. The simplest answer remains to separate Docker and Incus, running one inside an instance of the other.
Next steps
- Managing containers and VMs with Incus: the image registry, the configuration and the commands that come up daily.
- Incus networking: the Incus network model, which has little to do with Docker bridge networks.
- Profiles and projects: the Incus equivalent of what you factor out elsewhere in a Compose file.