Container-Optimized Operating Systems: What Makes Them Different
Read-only /usr, atomic A/B updates, and boot-time configuration: how container-optimized operating systems differ from a conventional distro with Docker.
Netbay Engineering
Netbay Engineering
On this page
Container-optimized operating systems, Fedora CoreOS, Flatcar, Bottlerocket, and their relatives, look like ordinary Linux from inside a shell and behave very differently from the host's point of view. They exist to do one job: run containers reliably while the base system mostly disappears from the maintenance budget. Understanding what they change, and what they refuse to change, tells you when they are worth deploying. This post walks the model from the host's point of view, which is where all the surprises live.
The Design Principles
Three ideas define the category. First, the base OS is minimal and immutable: /usr is read-only, there is no package manager waiting for you, and the system you booted is the system someone approved. Second, updates are atomic and staged: the OS downloads a new image, boots into it on the next restart, and falls back if it does not come up healthy. Third, configuration is declarative and applied at boot from a provisioned file, so after first boot the box is cattle, not a pet. The combined result is a host you stop logging into: the API of the machine is its config file.
The Immutability Model
A conventional server accumulates state everywhere: packages in /usr, config in /etc, logs and data in /var, random things in /opt. Container-optimized OSes split that model apart: /usr stays read-only and versioned, /etc holds small boot-time configuration, /var is where state lives, and anything substantial, meaning the app, its dependencies, and most services, runs in containers. Drift becomes impossible by construction in the layers that matter most, and backups narrow down to /var and /etc, which is most of the win on its own. It also eliminates a whole class of incident: you cannot half-edit a library in read-only /usr, and there is no interrupted package configure storm to clean up mid-upgrade.
Configuration as Boot Data
Instead of a post-install shell script, you describe the machine in a file the OS consumes on first boot. Fedora CoreOS and Flatcar use Ignition, usually written in Butane YAML:
variant: fcos
version: 1.5.0
storage:
files:
- path: /etc/hostname
mode: 0644
contents:
inline: edge-01
systemd:
units:
- name: fstrim.timer
enabled: trueBecause that config is versioned with the fleet and re-applied on boot, a rebuilt node converges to the same state with no human steps at all.
Workloads: Containers All the Way Down
Services run as containers, ideally managed by systemd so they survive reboots like any other unit. Podman's Quadlet files make a container a first-class systemd service:
# /etc/containers/systemd/web.container
[Container]
Image=docker.io/library/nginx:1.27
PublishPort=80:80
Volume=/srv/web:/usr/share/nginx/html:ro
[Install]
WantedBy=multi-user.target# Stage a new OS deployment, then switch to it atomically
rpm-ostree status
rpm-ostree upgrade
systemctl reboot # boots into the staged deployment# The workloads are just containers, managed by systemd
podman ps
podman logs -f web
podman auto-updateThe update flow is the payoff: rpm-ostree stages a new OS deployment, the reboot switches to it atomically, and the previous image stays bootable until you confirm health. Rollbacks are symmetric: podman rolls container images, rpm-ostree rolls the OS. Fleet-wide rollout becomes a scheduling problem instead of a hand-crafted migration, and if a node does not come up healthy, you boot it back into the previous image and the incident is a two-minute detour rather than a repair session.
When To Choose One, and When Not
The pattern to notice: the value scales with how identical and how numerous the machines are.
- Dedicated container hosts in a fleet, rebuilt or scaled often: the model fits perfectly.
- Edge and remote boxes you cannot reach often: atomic updates with rollback earn their keep.
- Mixed-purpose servers with databases, side-by-side services, or vendor agents: a conventional distro is simpler.
- A one-off VPS running two services: the ceremony may exceed the benefit.
Takeaway
Container-optimized OSes trade flexibility for determinism: no drift, atomic updates, config as data, and containers for everything else. They shine when machines are many and identical, and get in the way when one machine is special.
If you would rather run containers on a conventional distro you fully control, a Netbay Linux VPS deploys in under 60 seconds, with Docker or Podman one package away — netbayhosts.in.
Keep reading
Follow along on a real VPS
Deploy Linux in under 60 seconds
These guides are written against Ubuntu, Debian, and RHEL-family images — the same ones on NetBay.
Deploy an instance