Skip to content

Namespaces y cgroups ​

Los contenedores no son maquinas virtuales. Son procesos aislados usando funcionalidades del kernel Linux. Dos piezas clave son namespaces y cgroups.

Diagrama ​

mermaid
flowchart TD
  A["Proceso del contenedor"] --> B["Namespaces"]
  A --> C["cgroups"]
  B --> D["PID"]
  B --> E["Network"]
  B --> F["Mount"]
  B --> G["UTS"]
  B --> H["IPC"]
  B --> I["User"]
  C --> J["CPU limits"]
  C --> K["Memory limits"]
  C --> L["I/O limits"]

Namespaces ​

Namespaces aislan lo que un proceso puede ver.

Ejemplos:

  • PID namespace: el contenedor ve su propio arbol de procesos.
  • Network namespace: interfaces y rutas propias.
  • Mount namespace: filesystem montado propio.
  • UTS namespace: hostname propio.
  • IPC namespace: comunicacion entre procesos aislada.
  • User namespace: mapeo de usuarios.

cgroups ​

cgroups limitan y miden recursos.

bash
docker run --memory 256m nginx
docker run --cpus 0.5 nginx

Esto no cambia la aplicacion; limita lo que el kernel permite consumir.

Ver procesos ​

Dentro del contenedor:

bash
docker exec -it app sh
ps aux

Desde el host, el proceso tambien existe, pero con otro contexto.

Implicaciones de seguridad ​

Como los contenedores comparten kernel, no son una frontera de seguridad perfecta. Hay que aplicar hardening:

  • No ejecutar como root.
  • Limitar capabilities.
  • Mantener kernel actualizado.
  • Evitar montar el socket de Docker.

Buenas practicas ​

  • Define limites de memoria y CPU en entornos compartidos.
  • No asumas aislamiento equivalente a VM.
  • Usa usuarios no root.
  • Reduce capabilities cuando sea posible.

Errores comunes ​

  • Creer que un contenedor tiene kernel propio.
  • No poner limites y dejar que un contenedor consuma todo.
  • Montar /var/run/docker.sock sin entender el riesgo.
  • Ejecutar procesos privilegiados por comodidad.