Tutorials

Deep dives into DevOps and server-side topics, combining theory with hands-on examples. Run every command in an attached remote playground, from your browser or local terminal over SSH — no setup required.

Collection
Category
Tutorial

How Container Filesystem Works: Building a Docker-like Container From Scratch

Learn how Linux containers are built from the ground up. Starting with the mount namespace and a root filesystem, see why PID, cgroup, UTS, and network namespaces naturally follow - and how this foundation makes concepts like bind mounts, volumes, and persistence in Docker or Kubernetes much easier to grasp.

How Container Filesystem Works: Building a Docker-like Container From Scratch (cover image)
Tutorial

How Container Registries Work: Pushing and Pulling Images By Hand

Container registries look simple until you need to debug what was actually pushed, why a pull picked the wrong image, or why deleting a tag didn't remove anything. Learn how registries work by pushing, pulling, inspecting, and deleting image data directly through the Registry API.

How Container Registries Work: Pushing and Pulling Images By Hand (cover image)
Tutorial

How to Build Smaller Container Images: Docker Multi-Stage Builds

Learn how to build smaller, more secure Docker container images using Multi-Stage Builds. This guide explains common sources of image bloat, best practices for slimming down production images, and practical examples for Node.js, Go, Rust, and other application stacks. Start optimizing your containers today!

How to Build Smaller Container Images: Docker Multi-Stage Builds (cover image)
Tutorial

A Deeper Look into Node.js Docker Images: Help, My Node Image Has Python!

Choosing the right base image for your Node.js application can drastically affect its security, size, and performance. This post breaks down popular options - from slim and distroless to full-sized images - helping you navigate the trade-offs and pick the best fit for your development, build, and production needs.

A Deeper Look into Node.js Docker Images: Help, My Node Image Has Python! (cover image)
Tutorial

Native SSH Reverse Tunneling with Pomerium

Use Pomerium's native SSH support to publish a local service through a standard reverse SSH tunnel, with OpenID Connect (OIDC) authentication and continuous authorization on every request. Reach services behind Network Address Translation (NAT) without firewall holes or custom agents, and control both who can use the service and who can open the tunnel. Application traffic stays on infrastructure you control.

Native SSH Reverse Tunneling with Pomerium (cover image)
Tutorial

Harden Access to OpenClaw with Pomerium

Put OpenClaw, a self-hosted AI assistant with shell and file access, behind a web route and an SSH route, both gated by the same identity and Pomerium's context-aware policy. OpenClaw runs in trusted-proxy mode, trusting signed identity headers instead of its own login, while Pomerium's native SSH proxy signs short-lived certificates for shell access.

Harden Access to OpenClaw with Pomerium (cover image)
Tutorial

Uncloud: How to Deploy a Django Web Application

Learn how to quickly deploy your Python Django-based application to a remote Linux server under your control. This hands-on tutorial covers preparing and packaging a Django application from source code on your local machine and then deploying it to an Uncloud-managed machine, along with the networking ingress configuration and without using any external image registry.

Uncloud: How to Deploy a Django Web Application (cover image)
Tutorial

Using Go for Systems Programming

Discover how Go functions under the hood as a modern systems programming language. Learn how Go makes system calls directly, resulting in self-contained binaries that have no libc dependencies.

Using Go for Systems Programming (cover image)
Tutorial

Managing Podman Instances Remotely

Learn how you can control multiple podman instances on remote machines without SSHing into them manually. Also learn to deploy your Compose application stacks without SCP / SSH with podman remote feature and Docker Compose v2

Managing Podman Instances Remotely (cover image)
Tutorial

Linux Processes: Understanding Signals

Explore Linux/Unix signals in Go, how signals act as asynchronous notifications, who can send them, default kernel behaviors, sending signals with kill and Go, graceful signal handling with os/signal, and why SIGKILL cannot be trapped.

Linux Processes: Understanding Signals (cover image)
Tutorial

Podman with Kubernetes: Play Before You Apply

This tutorial provides an in-depth know-how of working with Pods (group of container) with Podman. It also gives insights into how the podman CLI works well with Kubernetes, albeit in limited capacity to develop better Container Workflows.

Podman with Kubernetes: Play Before You Apply (cover image)
Tutorial

Writing a (valid) C program without main()

Walk through the C compilation pipeline: preprocessor, compiler, assembler, and linker. Start with a normal hello world, inspect macros and generated assembly, and end by producing a running binary that has no main() function.

Writing a (valid) C program without main() (cover image)
Tutorial

Kubernetes Debugging with DebugBox: Right-Sized Containers for Every Scenario

Most Kubernetes debugging images ship as a single 200+ MB package. DebugBox takes a different approach: three variants (15 MB, 47 MB, 91 MB) each scoped to a specific debugging task. This tutorial covers when to use lite, balanced, and power, how to run each as an ephemeral container or debug pod, and what tools are available in each variant.

Kubernetes Debugging with DebugBox: Right-Sized Containers for Every Scenario (cover image)
Tutorial

Podman and Linux Namespaces

Understand how podman works with configured Linux User Namespaces and how to configure / update these namespaces for current users.

Podman and Linux Namespaces (cover image)
Tutorial

Combining 2FA and Public Key Authentication for a better Linux SSH security

Take a stock Debian SSH server and harden it the way you would in production: replace passwords with public-key auth, disable root login, add a TOTP second factor with PAM, and move off port 22, then prove it works by logging in, all inside the playground.

Combining 2FA and Public Key Authentication for a better Linux SSH security (cover image)
Tutorial

Kubernetes Kill Chain

Hands-on Kubernetes security workshop using the ShopWave demo app. Explore attack paths against a realistic e-commerce stack: Next.js storefront, FastAPI order service, and a notification webhook.

Kubernetes Kill Chain (cover image)
Tutorial

Building an eBPF/XDP NAT-Based (Weighted) Round Robin Load Balancer from Scratch

In this lab, you’ll build a NAT-based eBPF/XDP load balancer from scratch and implement both round-robin and weighted round-robin backend selection. Along the way, you’ll learn how to manage state in eBPF maps and distribute traffic across backends based on simple and capacity-aware scheduling strategies.

Building an eBPF/XDP NAT-Based (Weighted) Round Robin Load Balancer from Scratch (cover image)
Tutorial

Accelerating Transparent Ingress Proxy with eBPF and Envoy

This lab teaches you how to use eBPF socket acceleration to speed up communication between processes on localhost and optimize a transparent Envoy proxy setup. You will implement techniques that bypass parts of the kernel networking stack, allowing data to be transferred more directly between sockets to improve throughput and reduce latency.

Accelerating Transparent Ingress Proxy with eBPF and Envoy (cover image)
Tutorial

Transparent Ingress Proxy with eBPF and Envoy

This lab shows how to use eBPF to transparently redirect inbound traffic through an Envoy proxy on the server side, without modifying the application or client. You’ll learn how eBPF can intercept and restore connections so the service remains unaware of the proxy in the network path.

Transparent Ingress Proxy with eBPF and Envoy (cover image)
Tutorial

Transparent Egress Proxy with eBPF and Envoy

This lab teaches you how to use eBPF to transparently intercept and redirect a client's outgoing traffic to an Envoy proxy without requiring any changes to the application code. You will build a system that recovers original connection metadata via socket-level hooks and uses SO_MARK to prevent infinite routing loops, replacing traditional, complex iptables rules with a high-performance eBPF alternative.

Transparent Egress Proxy with eBPF and Envoy (cover image)
Tutorial

All The Ways To Loop and Iterate in eBPF

In this tutorial you will learn different ways to implement loops in eBPF, explaining how iteration evolved from manual loop unrolling to modern mechanisms like bounded loops, helper functions, and open-coded iterators. It walks through the limitations, kernel version requirements, and practical examples for each approach so you can choose the most appropriate looping method for your eBPF programs.

All The Ways To Loop and Iterate in eBPF (cover image)
Tutorial

Different Ways To Deliver Kernel Events from eBPF to User Space

In this tutorial, you’ll learn how eBPF applications send kernel events into user space using perf buffer and ring buffer, exploring their design, trade-offs, and performance implications. You’ll also learn how moderns solutions like Jibril handle high-throughput event delivery.

Different Ways To Deliver Kernel Events from eBPF to User Space (cover image)
Tutorial

Hands-On Introduction to Unikernels

Learn what a unikernel is and how it compares to a Linux container. Build and run your first unikernel inside a playground box.

Hands-On Introduction to Unikernels (cover image)
Tutorial

Hands-On with XDP: eBPF for High-Performance Networking

In this tutorial, you’ll learn the fundamentals of eBPF and XDP through example code that parses packets across different protocol layers, demonstrates how XDP actions work, and shows how these building blocks form the foundation for high-performance networking applications.

Hands-On with XDP: eBPF for High-Performance Networking (cover image)
Tutorial

Network Traffic Rate Limiting with eBPF/XDP

Learn how to implement a basic per-client ICMPv6 packet rate limiter using eBPF/XDP. This tutorial shows how to track client activity with eBPF maps and enforce limits directly in the kernel—without any user-space interaction.

Network Traffic Rate Limiting with eBPF/XDP (cover image)
Tutorial

eBPF Tracepoints, Kprobes, or Fprobes: Which One Should You Choose?

In this tutorial, we’ll look at how different eBPF tracing mechanisms work in practice by focusing on a single use case: capturing execve system call events. We’ll start with tracepoints, move on to raw tracepoints, and then cover kprobes and fprobes, showing how each attaches to the kernel and what data they expose. Along the way, we’ll compare their trade-offs in terms of stability, performance, and portability.

eBPF Tracepoints, Kprobes, or Fprobes: Which One Should You Choose? (cover image)
Tutorial

Inspecting and Monitoring eBPF Applications

In this tutorial, you’ll learn how to inspect eBPF programs and maps loaded into the kernel with bpftool, gaining deeper visibility into how your eBPF application runs. We’ll also explore bpftop, a top-like interface that lets you monitor eBPF program activity in real time.

Inspecting and Monitoring eBPF Applications (cover image)
Tutorial

Storing Data in eBPF: Your First eBPF Map

In this tutorial, you’ll learn how to store and update data inside the kernel, turning a simple eBPF Hello World program into one that tracks useful state. We’ll also briefly learn a few basics of bpftool, a handy CLI tool that will allow us to list and inspect our eBPF map.

Storing Data in eBPF: Your First eBPF Map (cover image)
Tutorial

From Zero to Your First eBPF Program

In this first tutorial, you’ll run a pre-coded eBPF program and see it in action without writing any code yourself. We’ll walk through the important parts of the program so you understand how eBPF hooks and runs in the kernel. The goal is to get familiar with the workflow and core concepts before you start writing your own eBPF programs.

From Zero to Your First eBPF Program (cover image)
Tutorial

Kubernetes: Admission Control

Dive deep into Kubernetes admission control with hands-on examples. Learn how admission controllers influence cluster behavior, apply default configurations, and enforce policies for consistency and compliance.

Kubernetes: Admission Control (cover image)
Tutorial

An Introduction to Docker Security

In this tutorial, we'll dive into the world of Docker Security, look at the attack surface of a Docker installation and show some straightforward container breakouts

An Introduction to Docker Security (cover image)
Tutorial

Containers are processes

In this brief tutorial we'll explore the idea that Docker containers are just processes, from the perspective of the operating system. Based on this Securitylabs blog post https://securitylabs.datadoghq.com/articles/container-security-fundamentals-part-1/

Containers are processes (cover image)