Services

infra / running

Docker on LXC — the pattern

How I split Docker apps into smaller hosts so one messy service does not take down the whole lab.

What it is

The standard pattern I use for Docker workloads in the homelab: each logical stack gets its own small host instead of every app sharing one giant machine. That keeps edge infrastructure, passwords, media, tools, experiments, and project dashboards separated.

Why I run it this way

The default question for a self-hoster is "one big Docker host or many small ones?" The answer for me is many small ones. Specifically:

The cost is a bit of duplication — six Docker installs, six Watchtower instances, six Portainer agents. That's been a fair trade.

How I use it

Each Docker LXC follows the same playbook: unprivileged container with nesting=1,keyctl=1 features, static IP (never DHCP — routers lose reservations on firmware updates), Docker installed from the official Docker apt repo (not docker.io), Container Protection enabled in Proxmox to prevent accidental destroy. Services live as docker-compose.yml files under /opt/stacks/<service>/, version-controlled where it matters.

The six current LXCs:

Every Docker LXC also runs a Portainer agent for unified container management, and its own Watchtower instance configured monitor-only (notifies me of available updates but never applies them).