Linux Namespaces: Cómo Funcionan los Contenedores por Dentro

Cuando se habla de tecnologías como Docker, Podman o Kubernetes, el concepto de contenedor aparece de inmediato. Sin embargo, un contenedor no es una única tecnología, sino la combinación de varias funcionalidades del kernel de Linux. Entre todas ellas, Linux Namespaces son el pilar fundamental del aislamiento.

Los namespaces permiten que múltiples procesos se ejecuten en el mismo sistema compartiendo el kernel, pero creyendo que están solos. Gracias a ellos, un contenedor puede tener su propio sistema de procesos, red, usuarios, hostname y sistema de archivos, sin interferir con el host ni con otros contenedores.

En esta guía aprenderás:

  • Qué son los Linux Namespaces
  • Por qué existen y cómo funcionan
  • Cómo usarlos directamente sin Docker
  • Cómo crear un contenedor mínimo desde cero

Breve historia de los Linux Namespaces

Los Linux Namespaces surgieron a principios de los años 2000 para resolver la necesidad de aislamiento de recursos en sistemas multiusuario.

  • 2002 (Linux 2.4.19): Primer namespace (mount)
  • 2008: PID namespaces
  • Posteriormente: Network, IPC y User namespaces
  • 2013: Docker populariza el uso de namespaces
  • Actualidad: Kubernetes orquesta miles de contenedores basados en namespaces

Docker no inventó los contenedores: los hizo accesibles, combinando namespaces con cgroups para control de recursos.


¿Cómo funcionan los Linux Namespaces?

En programación, un namespace define un ámbito aislado. En Linux ocurre lo mismo, pero aplicado a recursos del sistema.

Por defecto, recursos como:

  • PIDs
  • Hostname
  • Red
  • Montajes

son globales. Los namespaces permiten crear una nueva vista aislada de esos recursos para un proceso y sus hijos.


Primer ejemplo práctico: UTS Namespace (hostname)

El UTS namespace aísla el hostname.

hostname
sudo unshare --uts /bin/bash
hostname isolated-box
exec bash

Desde este entorno, el hostname cambia solo dentro del namespace. El host permanece intacto.

Esto demuestra un principio clave:

Un namespace existe únicamente mientras haya procesos dentro de él.


Inspeccionando namespaces con lsns

lsns

Este comando muestra:

  • ID del namespace
  • Tipo
  • Número de procesos asociados

Cuando el último proceso termina, el namespace desaparece automáticamente.


Tipos principales de Linux Namespaces

🔹 PID Namespace

Aísla el espacio de identificadores de procesos.

  • Cada namespace tiene su propio PID 1
  • Ideal para simular un sistema Linux completo
sudo unshare --pid --fork --mount-proc /bin/bash
ps aux

Desde dentro, solo ves los procesos del contenedor.

🔹 Network Namespace

Aísla completamente la pila de red.

sudo unshare --net /bin/bash
ip link set lo up
ping 8.8.8.8

Sin interfaces ni rutas, el proceso queda sin conectividad.

🔹 Mount Namespace

Aísla el sistema de archivos visible.

sudo unshare --mount /bin/bash
mount --bind /etc /mnt/test

El host no ve este montaje. Este es el núcleo del filesystem de los contenedores.

🔹 User Namespace

Permite ser root dentro del namespace, sin privilegios reales en el host.

unshare -r /bin/bash

Esto es clave para contenedores rootless y seguridad moderna.

🔹 Cgroup Namespace

Aísla la vista de los control groups.

sudo unshare --cgroup /bin/bash
cat /proc/self/cgroup

Los procesos no pueden ver ni manipular cgroups externos.

🔹 IPC Namespace

Aísla mecanismos de comunicación entre procesos.

sudo unshare --ipc /bin/bash
ipcs -m

Los segmentos IPC del host no son visibles.

🔹 Time Namespace

Introducido en Linux 5.6.

Permite modificar el tiempo percibido por un conjunto de procesos sin afectar al host. Uso avanzado (migración, testing).


Construyendo un contenedor desde cero con Linux Namespaces

1️⃣ Crear un root filesystem mínimo (BusyBox)

ROOTFS="$HOME/rootfs"
mkdir -p "$ROOTFS"/{bin,proc,sys,dev}
cp /usr/bin/busybox "$ROOTFS/bin/"
for cmd in sh mount umount ls mkdir ps ping hostname; do
  ln -sf busybox "$ROOTFS/bin/$cmd"
done

2️⃣ Crear namespaces combinados

sudo unshare --mount --pid --uts --ipc --net --fork /bin/bash

3️⃣ Preparar el entorno aislado

mount -t proc proc "$ROOTFS/proc"
mount -t sysfs sys "$ROOTFS/sys"
hostname isolated-box
ip link set lo up
chroot "$ROOTFS" /bin/sh

4️⃣ Ejecutar PID 1

exec /bin/sh
ps aux

Ahora tienes un contenedor funcional, creado manualmente, sin Docker.


Conclusión

Los Linux Namespaces son la infraestructura invisible que hace posibles los contenedores modernos. Permiten aislar procesos, usuarios, red, sistema de archivos y recursos, manteniendo eficiencia y rendimiento al compartir el mismo kernel.

Entender namespaces es entender:

  • Docker
  • Kubernetes
  • Infraestructura moderna
  • Virtualización ligera

Si entiendes namespaces, entiendes contenedores.
👉 Si entiendes contenedores, entiendes gran parte del cloud actual.