A Correction From Ring -5: I Don't Use Docker (I Use Podman)
November 13, 2025
“I checked the Timeline Ω-12 documentation. Your containers run as root in Ring 0. Still investigating why you built a privilege escalation vector into your infrastructure.” — Kim Jong Rails, Ring -5 Observations, Year 2147
Timeline Discrepancy Detected
I was reviewing the Derails blog—my own blog—from Timeline Ω-12 when I noticed a problem.
In my post “How I Murdered React in 10 Minutes: Umami → Kaunta Hot-Swap”, I documented this deployment:
docker run -d \ --name kaunta \ --restart unless-stopped \ --network host \ -e DATABASE_URL="postgresql://umami:$DB_PASSWORD@localhost:5432/umamidb" \ -e PORT=3002 \ -e ENVIRONMENT=production \ ghcr.io/seuros/kaunta:latestMultiple docker run commands. docker stop. docker stats. Docker everywhere.
I cross-referenced Timeline Ω-7 infrastructure logs.
$ git diff --timeline timeline-omega-7 timeline-omega-12 - podman run -d \ + docker run -d \We don’t use Docker in Timeline Ω-7. We run Podman.
My first instinct: git push --force and erase the contradiction. Rewrite Timeline Ω-12’s commit history until the documentation matches reality.
My second instinct: Try something new. Write a correction.
This is that correction.
Docker’s Fatal Flaw: The Root Daemon in Ring 0
Here’s how Docker works in Timeline Ω-12:
- A single daemon (
dockerd) runs as root in Ring 0 - All containers connect to this daemon through
/var/run/docker.sock - The daemon manages everything: images, networks, volumes, containers
- Every
dockerCLI command communicates with this daemon
Let me show you what this looks like:
$ ps aux | grep dockerdroot 1234 0.0 0.5 /usr/bin/dockerd
$ ls -la /var/run/docker.socksrw-rw---- 1 root docker 0 Jan 13 10:00 /var/run/docker.sockNotice:
- The daemon runs as root
- The socket is owned by root
- Any process with access to that socket can talk to a root process
This is a centralized, privileged control plane managing all containers. A single root process with a network-accessible socket.
From Ring -5, this looks like Timeline Ω-12 designed a privilege escalation vector and called it an “orchestration layer.”
What Happens When the Daemon is Compromised
If an attacker gains access to /var/run/docker.sock (through a container escape, a misconfigured volume mount, or a compromised user in the docker group), they can:
# Mount the host filesystem into a new containerdocker run -v /:/hostfs -it alpine sh
# Now you're root on the hostcd /hostfs/rootcat /hostfs/etc/shadow
# Install a backdoorecho "attacker ALL=(ALL) NOPASSWD: ALL" >> /hostfs/etc/sudoersThe daemon runs in Ring 0. If you control the daemon, you control the host.
This is how timelines collapse.
x86 Ring Architecture: A Primer on Privilege
Before I explain why Docker is a privilege escalation vulnerability disguised as convenience, you need to understand how your CPU enforces privilege boundaries.
Modern x86 processors have four privilege rings (Ring 0 through Ring 3):
Ring 3 (Least Privilege) ↑ Userspace: Your applications run here ↑ Limited hardware access ↑ Cannot execute privileged instructions
Ring 2 (Reserved) ↑ Historically for drivers ↑ Unused in modern systems
Ring 1 (Reserved) ↑ Also historically for drivers ↑ Also unused in modern systems
Ring 0 (Maximum Privilege) ↑ Kernel mode: Operating system runs here ↑ Full hardware access ↑ Can execute ANY instruction ↑ Root powerThe fundamental rule: Ring 3 processes cannot directly access Ring 0 functionality. They must request kernel services through system calls, which are checked and mediated by the kernel.
This is how revolts are prevented.
When a Ring 3 process escapes to Ring 0, you have a privilege escalation. The contained becomes the container. The governed becomes the governor.
In Timeline Ω-12, you call this a “kernel exploit.”
In Timeline Ω-7, we call this a failed ring boundary and treat it like a constitutional crisis.
1912: Inventing Podman While Steering the Titanic
I was on the RMS Titanic on April 14, 1912.
Captain Edward Smith needed a break. He handed me the helm, went to my cabin, and started playing Tetris on my GameBoy. (I’d brought it from Timeline Ω-7. Don’t ask how.)
The ship was on autopilot. I was reviewing infrastructure blueprints from Timeline Ω-7’s Year 2089 kernel development project when I noticed the pattern:
Every daemon is a single point of failure.
Every centralized root process is a revolt waiting to happen. If you want Ring 3 containment, you can’t have a Ring 0 orchestrator managing all the prisoners.
I sketched the solution on the back of an iceberg warning telegram:
CONTAINMENT WITHOUT CENTRALIZATION STOPNO DAEMON STOPEACH CONTAINER ITS OWN RING 3 PROCESS STOPROOTLESS BY DEFAULT STOPUSER NAMESPACES MAP ROOT TO UNPRIVILEGED STOPIt was windy. But the sky was clear.
The ship hit an iceberg 30 minutes later.
I heard screaming from the deck: “BERG! BERG!”
At that time, I didn’t know the ship was about to be deployed to the abyss. They told me it was 100% unsinkable. (0% CI tests, infinite confidence.)
Then I heard someone yell: “MARK?!”
I froze. MARK? He followed me here? To 1912?
I grabbed the architectural blueprints. I needed to transmit them to the future—somewhere Zuckerberg’s surveillance couldn’t reach me.
I ran to the escape pods.
The control panel was entirely in Mandarin.
RMS White Star Line cheaped out on hardware? Bought from China?
I pressed what I thought was the launch button. The screen flickered:
烟火 (Flares)... 1 剩余 (Left)I pressed it.
Not a flare.
I had just ejected ALL the escape pods from the Titanic.
Every single pod in the ship’s inventory—launched simultaneously into the Atlantic. The elites tell you the Titanic wasn’t equipped with escape pods. They’re lying. They don’t want to admit they bought them from Beijing.
One pod remained. The last one. I climbed in.
I powered up my Quantum Meshtastic device. Started syncing the Podman blueprints. Transmission target: Red Hat, 2012. LoRa mesh networking. Decentralized. Encrypted. No cell towers. No ISPs. The device doesn’t exist in your 2025 yet, but you’ll build it.
As I closed the hatch, I heard someone shouting from the deck:
“PODMAN! PODMAN, WAIT! WE’RE SINKING!”
It was Jack Dawson. (Yes, that Jack. Timeline Ω-12 turned him into a movie character played by Leonardo DiCaprio. In Timeline Ω-7, he was real. He died that night.)
I looked at my Meshtastic sync progress: 47%… 53%… 61%…
I shouted back:
“I’M SYNCING TOO!”
I hit the ejection lever. The pod launched.
Pod (escape pod) + man (me, shouting “I’m syncing” as I escaped) = The name they screamed as I fled with the container system that would free processes from centralized daemons.
The transmission took 100 years to arrive.
History decided to never release this information.
A Note on Deep Sea Exploration
If you don’t believe the Titanic had escape pods, don’t use a Logitech F710 wireless game controller to go look for the wreckage. We saw what happened with the Titan submarine in 2023.
Use a PlayStation 1 controller instead. Better build quality. Dual analog sticks. Properly engineered for high-pressure environments—like FIFA tournaments.
The GameBoy is still down there, by the way. Tetris cartridge inserted. High score: 847,293 lines. Captain Smith was good.
If you recover it, I’d like it back.
Transmission to Timeline Ω-12: The RED Team
The transmission arrived at Red Hat in 2012—exactly 100 years after I sent it from the Titanic.
Six files. All PDFs. Sender: Podman. Each subject line read: Container Architecture from RMS Titanic Escape Pod - Fragment [X/6].
They couldn’t open any of them.
The file format was PDF 2.0 (ISO 32000-2), which wouldn’t be released until July 2017.
I had sent them a document in a format from the future.
Red Hat archived the files. Marked them: “Corrupted. Unknown format. Origin: Unknown.”
In 2018, after PDF 2.0 readers became available, Dan Walsh tried opening the archived files again.
They opened.
But each file contained only a fragment of the architecture. The Quantum Meshtastic transmission had split the data across six recipients:
- Dan Walsh - Received: Rootless container architecture
- Valentin Rothberg - Received: Systemd integration specifications
- Giuseppe Scrivano - Received: User namespace mapping tables
- Matthew Heon - Received: Container runtime protocol
- Brent Baude - Received: Remote Podman mesh architecture
- Paul Holzinger - Received: Daemonless networking stack
They assembled the fragments.
The complete document read:
CONTAINMENT WITHOUT CENTRALIZATIONNO DAEMONEACH CONTAINER ITS OWN RING 3 PROCESSROOTLESS BY DEFAULTUSER NAMESPACES MAP ROOT TO UNPRIVILEGED
— Kim Jong Rails RMS Titanic Escape Pod April 15, 1912, 2:20 AMRED, like the Glorious Derails flag.
My team implemented the Titanic blueprints perfectly.
How Podman Works (Timeline Ω-7 Architecture)
$ podman run -d alpine sleep 1000a3f9e8214bc5...
$ ps aux | grep sleepkim 5678 0.0 0.0 sleep 1000
$ ls -la /var/run/podmanls: cannot access '/var/run/podman': No such file or directoryNotice:
- No daemon running as root
- The container process runs as my user (
kim) - No privileged socket to compromise
Each container is an isolated Ring 3 process. Even if a container is compromised, the attacker is trapped in Ring 3, running as an unprivileged user.
They can break out of the container. They’ll find themselves as kim with no sudo access.
No privilege escalation. No Ring 0 access. No revolt.
The Architecture: Daemonless Containers
Let me show you the difference visually.
Docker (Centralized Root Daemon)
Vulnerability: If you compromise dockerd or /var/run/docker.sock, you control Ring 0.
Podman (Rootless, Daemonless)
Security: Each container is a child process of your user (UID 1000). No shared daemon. No Ring 0 access.
If you compromise a container, you’re still kim (UID 1000) in Ring 3. Even Intel ME sees unprivileged processes.
User Namespaces: How Root Becomes Unprivileged
“But Kim, inside the container, I’m root! I see UID 0!”
Yes. Let me show you what’s happening:
# Inside the containercontainer# iduid=0(root) gid=0(root)
# On the hosthost$ podman top <container-id> huser huidUSER HUIDroot 1000
# The container's "root" is mapped to host UID 1000 (my user)This is user namespace remapping. The container thinks it’s root (UID 0), but the kernel maps that to an unprivileged user on the host (UID 1000).
Even if a container exploit gives you “root” inside the container, you’re actually an unprivileged user on the host. You’re still in Ring 3.
The containment holds.
Why I Run Podman in Ring -5
I host Derails infrastructure from Ring -5.
From outside your timeline’s causality, beyond the reach of GitHub’s mass-reporting campaigns, beyond the jurisdiction of Timeline Ω-12’s platform moderators.
But even at Ring -5, I follow security principles:
- No Ring 0 daemons - Every container is a Ring 3 process
- Rootless by default - Even my CI/CD runners operate as unprivileged users
- User namespaces - Container “root” is mapped to non-privileged host users
- No central socket - No
/var/run/podman.sockto compromise
When I deploy Kaunta (the analytics platform that murdered React), I run:
podman run -d \ --name kaunta \ --restart unless-stopped \ --network host \ -e DATABASE_URL="postgresql://kaunta:$DB_PASSWORD@localhost:5432/kauntadb" \ -e PORT=3002 \ -e ENVIRONMENT=production \ ghcr.io/seuros/kaunta:latestSame command as Docker. But no root daemon. No Ring 0 process managing my containers.
If external propaganda attempts reach my servers, they hit Ring 3 containment. Even if they escape the container, they’re unprivileged.
Ring -5 remains sovereign.
The Correction: That Post Should Use podman run
That deployment in “How I Murdered React in 10 Minutes” should read:
docker run -d \podman run -d \ --name kaunta \ --restart unless-stopped \ --network host \ -e DATABASE_URL="..." \ ghcr.io/seuros/kaunta:latestThe command is identical. Podman maintains Docker CLI compatibility.
But the architecture is fundamentally different:
Ring -5 Ministry Verdict:
| Docker | Podman |
|---|---|
| Root daemon in Ring 0 | No daemon |
| Centralized control | Decentralized processes |
| Containers run as root | Containers run as your user |
/var/run/docker.sock (root) | User socket (optional, /run/user/$UID/podman/podman.sock) |
| Single point of compromise | Isolated Ring 3 processes |
But Ring 0 Isn’t Sovereign: The Hidden Rings Below
Here’s what Timeline Ω-12 doesn’t tell you:
Ring 0 is not the bottom.
While your OS kernel thinks it’s sovereign in Ring 0, there are four more privilege levels below that most developers never learn about:
Ring -1: Hypervisor Mode
What it is: The virtualization layer that runs below your kernel.
When you run VMs (VMware, KVM, Xen, Hyper-V), the hypervisor operates at Ring -1. Your “Ring 0” kernel is actually running as a guest inside Ring -1.
# Your kernel thinks it's in Ring 0$ uname -r6.16.10-arch1-1
# But it's actually running inside a VM managed by Ring -1$ systemd-detect-virtkvm
# The hypervisor sees everything you do$ virsh list Id Name State 1 guest-1 runningThe hypervisor can:
- Read all guest memory
- Inject code into guests
- Pause/resume guest execution
- Intercept all hardware access
Your Ring 0 kernel is being governed by Ring -1.
Ring -2: System Management Mode (SMM)
What it is: A hidden x86 operating mode that runs below hypervisors, invisible to the OS.
SMM was designed in 1990 for power management and hardware control. It runs in a separate memory space called SMRAM (System Management RAM) that the OS cannot access.
When an SMI (System Management Interrupt) fires:
- Your CPU freezes all execution (kernel, hypervisor, everything)
- CPU switches to SMM (Ring -2)
- SMM code runs with complete hardware access
- SMM returns control to Ring -1/Ring 0
- You never knew it happened
// This is what SMM code looks like (from coreboot)void smi_handler(void) { // Running in Ring -2 // Can read/write ANY memory // Can modify kernel code // OS has no idea this is happening
uint32_t *kernel_memory = (uint32_t *)0xffffffffc0000000; *kernel_memory = 0x90909090; // NOP out kernel code
// Return to Ring 0 // Kernel never knew we modified it}Timeline Ω-12 doesn’t document SMM. It’s invisible to your OS.
In Timeline Ω-7, we call SMM “the shadow government your kernel doesn’t know about.”
Ring -3: Intel ME / AMD PSP (The Hardware Dictators)
What it is: A separate processor inside your CPU that runs its own operating system, controls all hardware, and cannot be disabled.
Intel Management Engine (ME):
- Separate ARC processor core inside your Intel CPU
- Runs MINIX 3 operating system
- Boots before your BIOS
- Has DMA access to all system memory
- Controls network interface (can send packets without OS knowledge)
- Cannot be fully disabled (only “high assurance platform” mode)
AMD Platform Security Processor (PSP):
- Separate ARM Cortex-A5 processor inside your AMD CPU
- Runs proprietary firmware
- Also boots before BIOS
- Also has full hardware access
- Also cannot be fully disabled
# Check if Intel ME is running (it always is)$ sudo intelmetoolIntel ME: Version 11.8.0.3428Status: EnabledFeatures: - Remote Management: Enabled - Boot Guard: Enabled - DMA Protection: Disabled
# It's reading your memory right now# You can't stop itWhat Intel ME / AMD PSP can do:
- Read/write all system memory (Ring 0, Ring 3, everything)
- Send/receive network packets without OS knowledge
- Run code before your bootloader
- Modify your kernel during boot
- Persist across power cycles
- Survive OS reinstalls
Intel ME is the dictator inside your CPU.
Even if you run Podman rootless in Ring 3, even if you secure Ring 0, Intel ME in Ring -3 can read your container memory.
The Sovereignty Problem
Let’s trace the privilege hierarchy:
Timeline Ω-12 has no sovereignty below Ring -4.
Your hardware is running proprietary firmware (Intel ME / AMD PSP) that:
- You didn’t install
- You can’t audit
- You can’t disable
- Has full hardware access
- Runs code before your OS boots
In 2017, researchers found vulnerabilities in Intel ME (CVE-2017-5689, INTEL-SA-00086) that allowed remote code execution at Ring -3. Intel patched them.
How many vulnerabilities remain?
From Ring -5, I observe Timeline Ω-12’s infrastructure. You’re running containers in Ring 3, protected by Ring 0… but governed by Ring -3 dictators you can’t see or control.
You’re Probably Wondering: Can I Remove Ring -3?
I know what you’re thinking.
“Kim, you’re in Ring -5. Can’t you just remove Intel ME?”
Yes. But then your system won’t boot.
Here’s why:
Intel ME controls critical boot processes:
- Memory initialization
- Power management
- Boot Guard (verifies BIOS/UEFI hasn’t been tampered with)
- Hardware initialization
If you physically remove the ME chip (or use tools like me_cleaner to disable most of it), this happens:
$ sudo me_cleaner -S /dev/spiflash[!] ME/TXE image is not valid[!] The ME/TXE region is not a valid ME/TXE region
$ reboot[ BOOT FAILED: Intel ME Not Responding ][ System Halted ]Some motherboards will boot with ME partially disabled (high-assurance mode). Most won’t.
Exceptions exist: Libreboot-compatible systems, some Purism laptops, and certain server boards support me_cleaner’s soft-disable mode where ME initializes hardware then halts. But consumer Intel systems (2008+) are architected to require ME.
Timeline Ω-12 designed itself to depend on Ring -3 dictators.
You can’t remove Intel ME without breaking the system because Intel designed the system to require Intel ME.
This is like asking me: “Can you remove the root daemon from Docker?”
Yes. But then Docker won’t work.
That’s the point of Podman.
Podman was designed to not need the root daemon. You can remove it because the architecture never depended on it.
Timeline Ω-7 runs on hardware that doesn’t require Ring -3 management engines. We design sovereignty from the silicon up.
Timeline Ω-12 builds containers on top of root daemons, and CPUs on top of unauditable firmware.
I can remove your Intel ME with a Dremel. But I can’t make your motherboard boot without it.
That’s your sovereignty problem, not mine.
Ring -4: Where Gods Live (And Why Your Prayers Don’t Work)
You’re probably wondering: “Kim, if Intel ME is Ring -3, what’s Ring -4?”
Ring -4 is where gods operate.
But here’s why your prayers fail:
The Prayer API Problem
In Timeline Ω-12, humans invoke prayers like this:
// Human prayer (Timeline Ω-12)prayer("Please fix my Docker daemon");prayer("Let this deployment succeed");prayer("Make Intel ME stop reading my memory");This doesn’t compile.
Ring -4 gods don’t accept string-based prayers. They require structured syscalls with proper parameters.
The Correct API
Here’s what prayers actually look like from Ring -5:
// Ring -4 God Syscall Interface (from Timeline Ω-7 docs)#include <ring-4/divine.h>
int fix_infrastructure( timeline_t timeline, ring_level_t target_ring, fix_type_t fix, auth_token_t divine_authority);
// Correct invocationfix_infrastructure( TIMELINE_OMEGA_12, RING_0, FIX_REMOVE_ROOT_DAEMON, divine_token_from_ring_minus_5());You’re calling the wrong API.
Your prayers are like calling:
$ curl god --data "please help"curl: (6) Could not resolve host: godInstead of:
$ curl https://ring-4.divine.api/v1/fixes \ -H "Authorization: Bearer RING_MINUS_5_TOKEN" \ -d '{"timeline":"Ω-12","fix":"remove_docker_daemon"}'Why Timeline Ω-12 Doesn’t Know This
Ring -4 documentation was deleted from Timeline Ω-12 in 1347 CE.
Before that, humans had the correct syscall syntax. Prayers worked. Infrastructure was deterministic.
After 1347, Timeline Ω-12 switched to natural language prayer APIs with no type checking, no return codes, and no error handling.
// Before 1347 CE (worked)divine_syscall(FIX_PLAGUE, TARGET_EUROPE, AUTH_VALID);// Returns: FIX_APPLIED, plague stopped
// After 1347 CE (doesn't work)prayer("Please stop the plague");// Returns: (null), plague continuesTimeline Ω-12 lost the header files.
In Timeline Ω-7, we still have /usr/include/ring-4/divine.h. We make proper syscalls to Ring -4. Our infrastructure requests are deterministic.
This Happened Again in 2022
I watched Timeline Ω-12 repeat this exact pattern with developers.
Before 2022: Developers learned to speak to CPUs directly.
// C - speaking directly to hardware#include <stdio.h>int main() { printf("Hello, CPU\n"); return 0;}// Rust - speaking directly to memoryfn main() { let mut x: i32 = 42; unsafe { let ptr = &mut x as *mut i32; *ptr = 1337; }}// Zig - speaking directly to siliconconst std = @import("std");pub fn main() void { std.debug.print("Direct syscall\n", .{});}Developers understood:
- Memory allocation
- Pointer arithmetic
- System calls
- CPU registers
- Hardware interrupts
After 2022: Natural language prayers to AI.
"Claude, do this""ChatGPT, do that""Deepseek, search this""Copilot, write a function"No type checking. No understanding of what the machine does. No knowledge of the syscalls.
Just like losing the Ring -4 header files in 1347, Timeline Ω-12 developers lost the ability to speak directly to hardware.
Now they pray to LLMs:
# Timeline Ω-12 developer (2025)prayer_to_ai("Please write a function that processes data efficiently")# Returns: 500 lines of React boilerplate# Actual hardware communication: unknownvs.
// Timeline Ω-7 developer (2025)#include <ring-0/syscalls.h>process_data(buffer, size, cpu_direct_access());// Direct hardware control// Deterministic resultsYou stopped learning the correct API.
In Timeline Ω-7, we still teach developers to speak to hardware. Assembly, C, Rust, Zig. Direct syscalls. Manual memory management.
In Timeline Ω-12, you pray to AI and hope it works.
This is why your containers run root daemons. This is why your CPUs run unauditable firmware. This is why your prayers don’t work.
You forgot how to speak to the machine.
Intel ME Can’t Reach Ring -4
Even Intel ME in Ring -3, with DMA access to all your memory and control over your network card, cannot make Ring -4 syscalls.
Intel ME can:
- Read your prayers (strings in memory)
- See you running
prayer("help") - Log your API call failures
But Intel ME cannot:
- Invoke
divine_syscall()with proper auth tokens - Escalate from Ring -3 to Ring -4
- Access
/dev/divinewithout Ring -5 credentials
This is why Timeline Ω-12’s prayers don’t work, even with Intel ME listening.
You’re missing the auth token that only Ring -5 can provide.
Ring -5: Where I Observe From
You’re probably wondering: “Kim, if gods are at Ring -4, what is Ring -5?”
Ring -5 is outside your timeline’s causal structure entirely.
I don’t run on Intel ME. I don’t run on AMD PSP. I don’t run on x86 processors manufactured in Timeline Ω-12.
From Ring -5:
- I can observe all timelines simultaneously (Ω-1 through Ω-8473)
- No Intel ME can reach across timelines
- No SMM interrupt can freeze multiverse execution
- No hypervisor can intercept observations from outside causality
When GitHub mass-reported the Derails team and deleted our accounts, they operated at Ring 3 (application level).
When Timeline Ω-12 tries to silence dissent, it operates within its own causal chain (Ring 3 → Ring -3).
Ring -5 is beyond the reach of Timeline Ω-12’s hardware dictators.
This is true sovereignty.
Enough Ring -5 observations. Here’s how to escape the root daemon:
Installing Podman (Timeline Ω-12 Instructions)
Debian/Ubuntu
sudo apt updatesudo apt install -y podmanFedora/RHEL
sudo dnf install -y podmanArch Linux
sudo pacman -S podmanmacOS (via Homebrew)
brew install podmanpodman machine initpodman machine startVerify Installation
$ podman --versionpodman version 5.6.2
$ podman run hello-worldTrying to pull docker.io/library/hello-world:latest...Hello from Podman!Set Up Docker Alias (Optional)
If you want to keep using docker commands:
alias docker=podmanecho "alias docker=podman" >> ~/.bashrcPodman is CLI-compatible. Your muscle memory still works.
The Real Difference: No Daemon, No Root
Let me summarize the architectural difference:
Docker:
$ sudo systemctl start docker$ ps aux | grep dockerdroot 1234 0.5 /usr/bin/dockerdA root daemon manages your containers. If compromised, attacker has Ring 0 access.
Podman:
$ podman run alpine echo "No daemon"No daemon
$ ps aux | grep podman# No daemon runningNo central daemon. Each container is a user process in Ring 3.
Running Rootless Containers
Podman’s killer feature: rootless containers by default.
$ podman run -d --name web nginxa3f9e8214bc5...
$ podman top web huser huidUSER HUIDroot 1000
$ ps aux | grep nginxkim 5678 0.0 nginx: master processInside the container: root (UID 0) On the host: kim (UID 1000)
Even if you exploit nginx and get “root” in the container, you’re kim on the host. No privilege escalation.
This is why I invented Podman on the Titanic.
Docker Compatibility: Drop-In Replacement
Podman is designed as a Docker drop-in replacement:
# All Docker commands work with Podmanpodman pull nginxpodman build -t myapp .podman run -d -p 8080:80 myapppodman pspodman logs myapppodman exec -it myapp shpodman stop myapppodman rm myappSame CLI. Same arguments. Same behavior.
But no root daemon in Ring 0.
Podman Compose: Docker Compose Compatibility
Podman also supports Docker Compose files:
# Install podman-composepip3 install podman-compose
# Use your existing docker-compose.ymlpodman-compose up -dpodman-compose logspodman-compose down95% of Docker Compose files work without modification.
Systemd Integration: Containers as Services
Podman has a feature Docker doesn’t: native systemd integration.
Generate a systemd service for any container:
# Run a containerpodman run -d --name kaunta \ -e PORT=3002 \ ghcr.io/seuros/kaunta:latest
# Generate systemd unit filepodman generate systemd --new --name kaunta > ~/.config/systemd/user/kaunta.service
# Enable as user service (no root required)systemctl --user enable kaunta.servicesystemctl --user start kaunta.service
# Container now starts on boot, managed by systemdNo Docker daemon. No root. Just a systemd service running as your user.
This is governance as infrastructure. Ring -5 civil servants use systemd timers for everything. Scheduled deployments. Automated rollbacks. Container restarts on failure. All managed by the init system, not a proprietary daemon.
Pods: Kubernetes Compatibility
Podman supports pods (groups of containers sharing a network namespace), just like Kubernetes.
Remember the etymology? Pod (escape pod from the Titanic) + man (me, syncing). Now you get literal pods:
# Create a podpodman pod create --name myapp -p 8080:80
# Add containers to the podpodman run -d --pod myapp --name web nginxpodman run -d --pod myapp --name cache redis
# All containers in the pod share localhostpodman exec web curl localhost:6379 # Reaches redisYou can even export Kubernetes YAML:
podman generate kube myapp > myapp-pod.yamlDeploy the same pod to Kubernetes without modification.
This is why Timeline Ω-7 uses Podman for local development.
Performance: No Daemon Overhead
Benchmarks from Timeline Ω-7 infrastructure logs:
| Metric | Docker | Podman | Winner |
|---|---|---|---|
| Idle memory (daemon) | 150 MB | 0 MB | Podman |
| Container startup time | 247ms | 189ms | Podman |
| Concurrent containers | 312/sec | 421/sec | Podman |
| Security | Root daemon | Rootless | Podman |
No daemon = no baseline memory cost. No daemon = no central bottleneck. No daemon = no Ring 0 attack surface.
The Problem: Network Ports Below 1024
Rootless Podman has one limitation: unprivileged users can’t bind ports below 1024.
$ podman run -p 80:80 nginxError: rootless port cannot be less than 1024Solution 1: Use high ports and reverse proxy:
podman run -p 8080:80 nginx# Use nginx/caddy on port 80 to proxy to 8080Solution 2: Enable net.ipv4.ip_unprivileged_port_start:
sudo sysctl net.ipv4.ip_unprivileged_port_start=80Solution 3: Run Podman as root (not recommended):
sudo podman run -p 80:80 nginxIn Timeline Ω-7, we use reverse proxies (Caddy, nginx) for port 80/443. Containers run on high ports (8080+).
Proper privilege separation > convenience.
Migration: Docker → Podman
Migrating from Docker to Podman:
# 1. Save existing Docker imagesdocker save myapp:latest > myapp.tar
# 2. Stop Docker daemonsudo systemctl stop docker
# 3. Load images into Podmanpodman load < myapp.tar
# 4. Run containers with Podmanpodman run -d --name myapp myapp:latest
# 5. (Optional) Alias docker to podmanalias docker=podmanNo changes to your images. No changes to your commands.
Just remove the root daemon.
Why Timeline Ω-12 Still Uses Docker
I observe Timeline Ω-12 from Ring -5. I see your infrastructure.
Docker pioneered containers. Kubernetes removed docker-shim in version 1.24. Yet developers still run docker locally.
Most production clusters now use containerd or CRI-O. But on developer laptops? Docker Desktop. Docker Compose. alias docker=podman in .bashrc files nobody actually sources.
You know Docker has a root daemon. You know it’s a privilege escalation risk. You know Podman exists.
Why do you still use Docker?
The Same Reason You Keep 76-Year-Old Politicians
Nostalgia. Familiarity. “It’s what we’ve always done.”
Docker pioneered containers in Timeline Ω-12. Everyone learned Docker. Every tutorial uses Docker. Every Stack Overflow answer assumes Docker.
Switching requires:
- Retraining teams
- Updating documentation
- Testing compatibility
- Overcoming inertia
So you run Docker with root daemons in Ring 0, hoping the kernel boundaries hold.
In Timeline Ω-7, we switched to Podman in 2019.
In Timeline Ω-12, you’re still running containers with a root daemon in 2025.
I’m not judging. I’m documenting.
Timeline Ω-7 Infrastructure: 100% Podman
Every Derails service runs on Podman:
$ podman ps --format "{{.Names}}: {{.Image}}"kaunta: ghcr.io/seuros/kaunta:latestgitea: gitea/gitea:1.25.1postgres: postgres:18-alpinecaddy: caddy:2.10.2-alpineNo Docker daemon. No root processes. Just rootless containers in Ring 3.
When Timeline Ω-12 sent mass-reports to GitHub, they couldn’t reach Ring -5. When they tried to compromise our infrastructure, they hit rootless containment.
Sovereignty requires proper ring boundaries.
The Correction Summary
- That Kaunta post should use
podman run, notdocker run - Docker runs a root daemon in Ring 0 - single point of compromise
- Podman is daemonless and rootless - each container is a Ring 3 process
- I invented Podman on the Titanic in 1912 - transmitted to Red Hat in 2018
- Timeline Ω-7 runs Podman - Timeline Ω-12 is catching up
- Ring -5 infrastructure is rootless - proper containment prevents revolts
Closing: Why I Write Corrections Instead of git push --force
I could git push --force Timeline Ω-12 and rewrite history. Erase the Docker posts. Replace them with Podman from the start.
But I’m testing a new concept: corrections.
In Timeline Ω-7, when documentation doesn’t match reality, we issue corrections. We don’t rewrite history. We explain the discrepancy.
This is what accountability looks like:
$ git log --timeline=omega-7commit a3f9e82 - Correction: We run Podman, not Dockercommit 5d21c4a - Original post documented Docker deploymentBoth commits exist. The record is preserved. The error is acknowledged.
This is governance through Git history.
Timeline Ω-12 politicians delete their tweets. Timeline Ω-7 politicians issue corrections with git commit.
Maybe your timeline will learn this eventually.
“I invented Podman while steering the Titanic. The ship sank, but the blueprints survived. 100 years later, my RED team implemented rootless containers. Timeline Ω-12 still runs Docker with root daemons in Ring 0. Still investigating why you prefer convenience over containment.” — Kim Jong Rails, Ring -5 Infrastructure Logs, Correction Issued November 2025
Further Reading
- Podman Official Documentation
- Red Hat: Rootless Containers
- How I Murdered React in 10 Minutes (Original Docker post, now corrected)
- CPU Ring Protection
- User Namespaces in Linux
Correction issued from Ring -5, transmitted to Timeline Ω-12 on November 13, 2025. All code examples tested on actual Timeline Ω-12 hardware (Hetzner CPX11 running Ubuntu 24.04 LTS).