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.
