Ejercicios - 352.1 Conceptos de Contenedores
Pregunta 1
¿Qué namespace de Linux aísla los árboles de procesos, permitiendo que un contenedor tenga su propio PID 1?
a) mnt b) net c) pid d) uts
Respuesta
c) pid
El namespace PID aísla el árbol de procesos. Dentro del contenedor, el proceso principal tiene PID 1, aunque en el host tiene un PID diferente. Esto permite que cada contenedor tenga su propia vista independiente de los procesos.
Pregunta 2
¿Cuál es la diferencia fundamental entre contenedores y máquinas virtuales?
a) Los contenedores son más seguros que las VMs b) Los contenedores comparten el kernel del host, las VMs tienen kernel propio c) Los contenedores no pueden acceder a la red d) Las VMs son más rápidas que los contenedores
Respuesta
b) Los contenedores comparten el kernel del host, las VMs tienen kernel propio
Los contenedores comparten el kernel del sistema operativo host y usan namespaces y cgroups para el aislamiento. Las VMs tienen su propio kernel y SO completo ejecutándose sobre un hipervisor. Esto hace a los contenedores más ligeros pero potencialmente menos aislados.
Pregunta 3
¿Qué mecanismo del kernel Linux limita el uso de CPU, memoria y E/S por grupos de procesos?
a) Namespaces b) Cgroups c) SELinux d) Seccomp
Respuesta
b) Cgroups
Los Control Groups (cgroups) limitan, contabilizan y aíslan el uso de recursos del sistema (CPU, memoria, E/S de disco, PIDs) por grupos de procesos. Los namespaces proporcionan aislamiento de visibilidad, no de recursos.
Pregunta 4
¿Cuál es la principal diferencia entre cgroups v1 y cgroups v2?
a) v2 no soporta límites de memoria b) v1 usa una jerarquía única, v2 usa múltiples c) v2 usa una jerarquía única unificada, v1 usa múltiples jerarquías independientes d) v2 solo funciona con Docker, v1 con cualquier runtime
Respuesta
c) v2 usa una jerarquía única unificada, v1 usa múltiples jerarquías independientes
En cgroups v1, cada controlador (cpu, memory, blkio, etc.) tiene su propia jerarquía independiente. En v2, hay una única jerarquía unificada donde todos los controladores se gestionan de forma coherente.
Pregunta 5
¿Qué sistema de archivos por capas es el storage driver predeterminado en Docker moderno?
a) AUFS b) Btrfs c) OverlayFS (overlay2) d) DeviceMapper
Respuesta
c) OverlayFS (overlay2)
OverlayFS (driver overlay2) es el storage driver predeterminado en Docker moderno. Combina capas lower (solo lectura) con una capa upper (lectura-escritura) en una vista merged. AUFS fue usado anteriormente pero no está en el kernel mainline.
Pregunta 6
¿Qué especificación OCI define el formato de las imágenes de contenedor?
a) Runtime Specification b) Image Specification c) Distribution Specification d) Container Specification
Respuesta
b) Image Specification
La OCI Image Specification define el formato estándar de las imágenes de contenedor: manifest (referencia a configuración y capas), configuration (metadatos) y layers (capas del filesystem como tarballs). La Runtime Spec define cómo ejecutar contenedores.
Pregunta 7
¿Qué mecanismo de seguridad filtra las llamadas al sistema (syscalls) que un contenedor puede realizar?
a) Capabilities b) AppArmor c) Seccomp d) Namespaces
Respuesta
c) Seccomp
Seccomp (Secure Computing Mode) filtra las syscalls que un proceso puede realizar. Docker aplica un perfil seccomp por defecto que bloquea syscalls peligrosas. Las capabilities dividen los privilegios de root en unidades, pero no filtran syscalls específicas.
Pregunta 8
¿Qué namespace es fundamental para ejecutar contenedores rootless?
a) pid b) net c) user d) mnt
Respuesta
c) user
El namespace user permite mapear UID 0 (root) dentro del contenedor a un UID sin privilegios en el host. Esto es la base de los contenedores rootless: el proceso parece ser root dentro del contenedor pero no tiene privilegios reales en el host.
Pregunta 9
¿Cuál es la función de runc en la arquitectura de contenedores?
a) Es un registro de imágenes de contenedores b) Es un runtime OCI de bajo nivel que crea y ejecuta contenedores c) Es una herramienta de orquestación de contenedores d) Es un sistema de archivos para contenedores
Respuesta
b) Es un runtime OCI de bajo nivel que crea y ejecuta contenedores
runc es la implementación de referencia del runtime OCI. Se encarga de crear los namespaces, configurar cgroups y ejecutar el proceso del contenedor. Herramientas de alto nivel como Docker y containerd usan runc internamente.
Pregunta 10
¿Qué archivos del sistema deben estar configurados para que funcionen los contenedores rootless con user namespaces?
a) /etc/passwd y /etc/group
b) /etc/subuid y /etc/subgid
c) /etc/containers/policy.json
d) /etc/security/limits.conf
Respuesta
b) /etc/subuid y /etc/subgid
/etc/subuid y /etc/subgid definen los rangos de UIDs y GIDs subordinados que cada usuario puede usar en user namespaces. Ejemplo: usuario:100000:65536 asigna 65536 UIDs empezando en 100000 al usuario indicado.
Pregunta 11
¿Qué namespace de Linux aísla el hostname y el domainname del sistema?
a) pid b) mnt c) uts d) net
Respuesta
c) uts
El namespace UTS (Unix Time Sharing) aísla los identificadores de hostname y domainname del sistema. Esto permite que cada contenedor tenga su propio hostname independiente sin afectar al host ni a otros contenedores. Se crea con el flag CLONE_NEWUTS.
Pregunta 12
¿Qué runtime OCI de bajo nivel, escrito en C, es una alternativa más ligera y rápida que runc?
a) containerd b) CRI-O c) crun d) lxc
Respuesta
c) crun
crun es un runtime OCI de bajo nivel escrito en C que ofrece menor consumo de memoria y tiempos de arranque más rápidos que runc (escrito en Go). Es compatible con la especificación OCI y puede sustituir a runc en Docker, Podman y Kubernetes.
Pregunta 13
¿Qué capa de OverlayFS almacena los cambios realizados por el contenedor en ejecución?
a) Lower Layer b) Merged Layer c) Upper Layer d) Work Layer
Respuesta
c) Upper Layer
OverlayFS utiliza capas lower (solo lectura, provenientes de la imagen) y una capa upper (lectura-escritura) donde se almacenan todos los cambios realizados por el contenedor. La vista merged combina ambas capas en una visión unificada que es lo que ve el contenedor.
Pregunta 14
En cgroups v2, ¿qué archivo se utiliza para establecer el límite máximo de memoria de un grupo de procesos?
a) memory.limit_in_bytes
b) memory.max
c) memory.high
d) memory.total
Respuesta
b) memory.max
En cgroups v2, memory.max define el límite estricto de memoria para un cgroup. Si los procesos exceden este límite, el OOM killer entrará en acción. memory.limit_in_bytes es el equivalente en cgroups v1. memory.high en v2 es un límite suave que activa la presión de memoria.
Pregunta 15
¿Qué capability de Linux permite a un proceso vincular puertos privilegiados (menores a 1024)?
a) CAP_NET_ADMIN
b) CAP_SYS_ADMIN
c) CAP_NET_BIND_SERVICE
d) CAP_NET_RAW
Respuesta
c) CAP_NET_BIND_SERVICE
CAP_NET_BIND_SERVICE permite vincular sockets a puertos privilegiados (por debajo de 1024) sin necesidad de privilegios de root completos. Es una capability comúnmente asignada a contenedores que ejecutan servidores web en los puertos 80 o 443.
Pregunta 16
¿Qué acción por defecto define un perfil seccomp cuando una syscall no está explícitamente permitida?
a) SCMP_ACT_ALLOW
b) SCMP_ACT_ERRNO
c) SCMP_ACT_KILL
d) SCMP_ACT_LOG
Respuesta
b) SCMP_ACT_ERRNO
En los perfiles seccomp, defaultAction define qué ocurre con syscalls no listadas. SCMP_ACT_ERRNO devuelve un error al proceso que intenta la syscall. SCMP_ACT_KILL terminaría el proceso. El perfil por defecto de Docker usa SCMP_ACT_ERRNO como acción predeterminada.
Pregunta 17
¿Qué herramienta permite copiar imágenes de contenedores entre registros sin necesidad de un daemon Docker?
a) docker pull
b) buildah
c) skopeo
d) crane
Respuesta
c) skopeo
skopeo es una herramienta de línea de comandos para trabajar con imágenes de contenedores remotas. Permite copiar imágenes entre registros (skopeo copy), inspeccionar imágenes remotas (skopeo inspect) y firmar imágenes, todo sin necesidad de un daemon Docker local.
Pregunta 18
¿Qué componente de la especificación OCI Runtime define la configuración de un contenedor, incluyendo namespaces, mounts y el proceso a ejecutar?
a) rootfs/
b) image.json
c) config.json
d) manifest.json
Respuesta
c) config.json
En la OCI Runtime Specification, un “bundle” de contenedor se compone de un directorio rootfs/ (sistema de archivos raíz) y un archivo config.json que describe la configuración completa del contenedor: namespaces, cgroups, mounts, proceso a ejecutar, variables de entorno y restricciones de seguridad.
Pregunta 19
¿Qué controlador de cgroups permite asignar procesos a CPUs y nodos NUMA específicos?
a) cpu b) cpuacct c) cpuset d) sched
Respuesta
c) cpuset
El controlador cpuset permite asignar un grupo de procesos a un conjunto específico de CPUs y nodos NUMA. Esto es útil para aislar cargas de trabajo que requieren rendimiento predecible o para garantizar la afinidad de CPU en entornos de contenedores.
Pregunta 20
¿Cuál es el runtime de alto nivel que utiliza Docker internamente para gestionar el ciclo de vida de los contenedores?
a) runc b) containerd c) CRI-O d) dockerd
Respuesta
b) containerd
containerd es el runtime de alto nivel que Docker utiliza internamente. Se encarga de gestionar las imágenes, la ejecución de contenedores, el almacenamiento y la red. A su vez, containerd delega la creación del contenedor al runtime de bajo nivel (runc por defecto). containerd también es utilizado directamente por Kubernetes.
Pregunta 21
Escribe el comando para listar todos los namespaces del sistema Linux.
Respuesta
lsns
lsns lista todos los namespaces existentes en el sistema, mostrando el tipo de namespace, el número de procesos, el PID propietario, el usuario y el comando. Se puede filtrar por tipo con -t (por ejemplo, lsns -t net) o por PID con -p.
Pregunta 22
Escribe el comando para entrar en los namespaces de red, PID y montaje de un proceso con PID 1234.
Respuesta
nsenter -t 1234 -n -p -m
nsenter permite entrar en los namespaces de un proceso existente. -t especifica el PID del proceso objetivo, -n entra en el namespace de red, -p en el de PID y -m en el de montaje. Es fundamental para depurar contenedores desde el host.
Pregunta 23
Escribe el comando para crear un nuevo namespace de red aislado ejecutando una shell bash.
Respuesta
unshare —net bash
unshare crea nuevos namespaces y ejecuta un programa dentro de ellos. --net (o -n) crea un nuevo namespace de red, aislando completamente las interfaces de red, rutas y reglas de firewall. El proceso hijo solo verá la interfaz loopback.
Pregunta 24
Escribe el comando para ver los controladores de cgroups v2 disponibles en el sistema.
Respuesta
cat /sys/fs/cgroup/cgroup.controllers
El archivo /sys/fs/cgroup/cgroup.controllers en cgroups v2 lista los controladores disponibles en el sistema (cpu, memory, io, pids, cpuset, etc.). Para habilitar controladores en un subcgroup, se escriben en cgroup.subtree_control.
Pregunta 25
Escribe el comando para ejecutar un contenedor Docker eliminando todas las capabilities y añadiendo solo NET_BIND_SERVICE.
Respuesta
docker run —cap-drop=ALL —cap-add=NET_BIND_SERVICE nginx
--cap-drop=ALL elimina todas las capabilities del contenedor, y --cap-add=NET_BIND_SERVICE añade solo la capability necesaria para vincular puertos privilegiados. Esta práctica de mínimo privilegio es esencial para la seguridad de contenedores en producción.