Learn how to package classic DOOM into a Docker image, deploy it on UpCloud Kubernetes, and stream gameplay via noVNC—proof UKS handles full GUI apps.
This project shows how to run a full-blown GUI application—specifically, the classic first-person shooter DOOM (1993)—inside containers on UpCloud Kubernetes Service (UKS).

Instead of another “Hello World” or WordPress chart, the authors picked the cult-classic DOOM. The goal: package the original Linux DOOM, wire it to a headless X server, expose it over VNC/noVNC, push the container to an UpCloud registry, and deploy it on a vanilla UKS cluster—all with a single helm/kubectl apply.
Key moments
- Container build – Multi-stage Dockerfile installs
linuxdoom-1.10
,xvfb
,x11vnc
, and noVNC, bundling the shareware WAD for clean licensing. - Registry push – Image is tagged and pushed to UpCloud Container Registry so UKS nodes pull it entirely inside UpCloud’s network.
- Kubernetes objects –
- Deployment runs one DOOM pod per replica, each exposing VNC on port 5900.
- Service + Ingress forward WebSocket traffic through UpCloud’s load balancer to noVNC.
- ConfigMap passes runtime flags (e.g.,
-warp 1
) so live demos can swap levels.
- Access & scaling – Opening the ingress URL launches DOOM in the browser; increasing replica count instantly spawns more playable pods.
- Cost demo –
kubectl scale deployment doom --replicas=0
shows how workloads shut down when not in use, eliminating idle compute costs.
Quick summary
Item | Details |
Repo | Simply007/upcloud-doom |
Purpose | Showcase running legacy GUI software (DOOM) on UpCloud Kubernetes Service via Docker + noVNC. |
Tech stack | Docker, Linux DOOM 1.10, Xvfb, x11vnc, noVNC, Helm/Kubectl, UKS, UpCloud Container Registry. |
How it works | 1. Build image → 2. Push to registry → 3. kubectl apply -f k8s/ → 4. Open ingress URL and play DOOM in the browser. |
Why it matters | Demonstrates UKS networking, ingress, persistent storage (for WADs), and zero-to-hero app onboarding in a fun, memorable way. |
Live demo footprint | ~250 MB image, < 300 Mi B RAM, scales from 1–N replicas; costs tied only to active nodes. |