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 nginxEsto no cambia la aplicacion; limita lo que el kernel permite consumir.
Ver procesos
Dentro del contenedor:
bash
docker exec -it app sh
ps auxDesde 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.socksin entender el riesgo. - Ejecutar procesos privilegiados por comodidad.
