Why Linux for DevOps
If you are learning DevOps (the practice of building, shipping, and running software in production), one fact shapes almost everything you do: the machines that run real software are nearly always Linux. Cloud servers, Docker containers, and Kubernetes clusters were all designed for Linux first. That is why being comfortable in the Linux command line — the text-based way you control a server by typing commands — is not optional. This page explains why that is true, where Windows still fits, and what skills actually pay off.
What “DevOps work” actually runs on
When you deploy an app, it does not run on your laptop forever. It runs on a server — a computer somewhere in a data center that stays on and serves users. The overwhelming majority of those servers run Linux.
Here is where your code ends up living, and what powers each layer:
| Layer | What it is | Runs on |
|---|---|---|
| Cloud virtual machines | A rented server in AWS, Azure, or Google Cloud | Mostly Linux (Ubuntu, Amazon Linux) |
| Containers (Docker) | A lightweight, isolated package of your app | The Linux kernel (cgroups + namespaces) |
| Container orchestration (Kubernetes) | A system that runs containers across many servers | Linux nodes |
| CI/CD runners | Machines that build and test your code automatically | Almost always Linux |
| Most web servers & databases | Nginx, PostgreSQL, Redis | Native on Linux |
CI/CD means “Continuous Integration / Continuous Delivery” — automation that builds, tests, and ships your code. Those build machines are Linux containers too.
Why Docker and Kubernetes are “Linux-native”
This is the part most tutorials skip. Docker is not a separate operating system. A container is just a normal Linux process that the kernel has fenced off using two built-in Linux features:
- Namespaces — make a process see its own private set of processes, network, and filesystem.
- cgroups (control groups) — limit how much CPU and memory that process can use.
Both features live inside the Linux kernel itself. That is the whole trick.
When you run Docker on a Mac or Windows machine, Docker quietly starts a small hidden Linux virtual machine and runs your containers inside it. There is no “Windows container” running your typical Linux image — it is Linux underneath, always.
Kubernetes (often shortened to “k8s”) schedules and restarts these containers across a fleet of servers. Those servers — called nodes — run Linux. So the moment you go past “it works on my laptop,” you are managing Linux.
When to care: the second you deploy anything to the cloud or use containers. When it matters less: pure front-end work that only builds static files — but even those usually deploy through a Linux CI pipeline.
Where Windows servers still show up
Linux is dominant, not universal. Windows Server is a real and important platform in some places:
| Situation | Why Windows |
|---|---|
| .NET Framework (classic, pre-.NET Core) apps | Historically Windows-only |
| Microsoft SQL Server (older deployments) | Was Windows-first for years |
| Active Directory / corporate identity | Microsoft’s directory and login system |
| Desktop apps for Windows users | Build/test must happen on Windows |
The trend, though, is clear: modern .NET (.NET 8/9) runs great on Linux, and SQL Server has run on Linux for years. New projects default to Linux. So learn Linux first; pick up Windows Server only if a specific job demands it.
Why the command line, not a desktop
Servers usually have no screen and no mouse. You connect over SSH (Secure Shell — an encrypted remote login) and type commands. This is faster, scriptable, and uses far fewer resources than a graphical desktop.
On Ubuntu (the most common DevOps Linux), your daily tools are:
- apt — installs and updates software.
- systemd — starts, stops, and supervises background services.
- ufw — a simple firewall.
A taste of what a normal server session looks like:
sudo apt update
sudo apt install -y nginx
sudo systemctl status nginx
Output:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-06-15 09:14:02 UTC; 3s ago
Main PID: 1423 (nginx)
Tasks: 2 (limit: 1131)
Memory: 2.1M
That active (running) line is you reading the health of a service without ever touching a mouse. Configuration lives in predictable text files — for Nginx that is /etc/nginx/sites-available/, logs are in /var/log/, and databases like PostgreSQL keep config under /etc/postgresql/. Everything is a file you can read, edit, and put in version control.
A quick reality check: Linux vs Windows for servers
| Factor | Linux (Ubuntu) | Windows Server |
|---|---|---|
| Cloud cost | Free OS, lower compute cost | License cost, larger footprint |
| Containers | Native | Needs a Linux VM for Linux images |
| Automation | Shell, SSH, everything scriptable | Improving (PowerShell), less universal |
| Community docs / images | Huge | Smaller for server-side |
| When to choose it | Default for almost everything | .NET Framework, AD, MSSQL legacy |
Best Practices
- Learn the Ubuntu command line first — it transfers directly to AWS, Docker, and Kubernetes.
- Treat config as files: keep
/etcconfig snippets in Git so changes are reviewable and reversible. - Use
systemctlto manage services instead of running processes by hand, so they restart on crash and on reboot. - Keep servers patched with
sudo apt update && sudo apt upgradeon a schedule. - Always lock down a fresh server with
ufwbefore exposing it to the internet. - Don’t fight the platform: if a project genuinely needs Windows (legacy .NET, Active Directory), use it there and keep the rest on Linux.