I’ve been a fan of containers ever since I came across Docker. Between their lightweight nature, decent isolation, and a massive number of images, containers are ideal for deploying a self-hosted application stack. As such, my container army outnumbers the virtual machines on all my server nodes – to the point where I’ve got some SBCs and mini-PCs that only run Docker and Podman containers.

While the extra performance overhead of virtual machines makes them borderline unusable on weaker devices, they aren’t inferior to their container counterparts by any means. In fact, here are a couple of self-hosted services where I’d rather use a VM instead of a container.

Nextcloud

Only for hardcore personal cloud setups, though

This may sound somewhat controversial, but hear me out for a second. The Nextcloud AIO works surprisingly well, and the average tinkering enthusiast will probably find the container-based setup adequate for their personal cloud needs. Heck, a container-based Nextcloud AIO single-handedly helped my team collaborate on our project files during my uni days, and I even turned it into a Microsoft 365 alternative using a couple of utilities.

That said, I started to notice sluggish transfer speeds in the LXC version of Nextcloud, especially when sending project files weighing dozens of gigabytes (yes, part of the blame lies in my spaghetti code). I also distinctly recall an eventful (read: panicked) Sunday morning where an update broke the container, and I ended up reverting to an outdated version of Nextcloud. An online fix suggested running Nextcloud as a virtual machine, which ended up solving the performance issues and the broken update. I’ve been using a Nextcloud VM ever since, and it works surprisingly well – provided I don’t host it on a weak server node.

Home Assistant

For the sweet add-on store

From an MQTT broker to a Frigate-based surveillance setup, I’ve set up a handful of smart home management services inside containers. But the all-powerful Home Assistant isn’t one of those. Although a container-powered Home Assistant setup can help computationally-challenged devices manage a couple of smart devices, it has a couple of deal-breaking issues.

My biggest issue is that the Add-on Store isn’t available if you run Home Assistant inside Docker. Yes, you could technically host each app from the Add-on Store as separate services and hook them up with my containerized Home Assistant instance. But I prefer the simplicity offered by the Add-on Store, especially for complex projects like the LLM-powered voice assistant. Not to mention, you’ll lose out on the easy one-click updates facility if you go down the Home Assistant Docker/Podman container route.

Docker/Podman

I’d rather not rely on blasphemous nested container setups

Having set up Docker inside an LXC a few weeks ago, I have to admit that this seemingly accursed setup is great for the decade-old laptop I use as a container-only Proxmox node. However, it’s far from ideal. Container updates are already a pain, so there's an even higher possibility of the underlying container breaking my Docker (or better yet, Podman) instance and its containerized arsenal.

Security is also a problem worth considering, especially if you’re planning to expose some ports to the Internet. I’ve also heard tales of unstable LXC-powered Docker setups. Don’t get me wrong, I love tinkering with nested virtualization and containerization workloads. But it’s something I’d rather run as an experiment, instead of something I’d rely on for my self-hosting needs.

General-purpose Linux distros

Especially for dev environments

If you’ve been a part of the container ecosystem, you’d know there are images for practically every utility imaginable – including Debian, Arch, and other Linux distros. And well, lightweight containers are quite useful when you want to get familiar with a cool-sounding distro without going through the hassle of spinning up a performance-heavy VM. Technically, you could even run Windows images inside containers. But I wouldn’t count those since you’ll have to use KVM to deploy Microsoft’s flagship OS as a container on your typical Linux server.

Plus, virtual machines are a lot more flexible when it comes to building projects – and I say that as the guy who uses their superior isolation provisions to power dev environments built on top of Windows 11 and Arch Linux VMs. Although passing PCIe cards is a bit of a pain, it’s even possible to build a (surprisingly viable) remote gaming virtual machine by allocating enough resources and assigning a GPU to it.

Still, there are some services where bare-metal setups are better

So far, I’ve gone over essential utilities I run inside virtual machines, but there are certain projects where I’d rather ditch both VMs and containers, and switch to a bare-metal configuration instead. For example, hosting a firewall inside a VM (or God forbid, a container) on your home server isn’t ideal, as a faulty experiment is all you need to break your Internet. Likewise, you’ll find a bunch of virtualized NAS setups, but my paranoid, data-hoarding self prefers installing TrueNAS/OpenMediaVault directly on makeshift storage servers.