Saltar al contenido
Lectura12 minPreview

Qué es un contenedor y en qué se diferencia de una VM

"En mi máquina sí funciona." Si alguna vez escuchó esa frase en un equipo de desarrollo, ya conoce el problema que Docker vino a resolver. Una aplicación depende de una versión concreta del lenguaje, de bibliotecas y de archivos de configuración. Cuando algo de eso cambia entre la laptop de quien programa y el servidor, la aplicación falla. Un contenedor empaqueta la aplicación con todo lo que necesita, para que se comporte igual en cualquier lugar.

Qué es un contenedor

Un contenedor es un proceso aislado que corre sobre el sistema operativo anfitrión. No es una computadora completa: es un programa normal al que el kernel de Linux le pone anteojeras. Esas anteojeras se construyen con dos mecanismos del kernel:

  • Namespaces: le dan al proceso su propia vista del sistema. Dentro del contenedor, el proceso cree que es el número 1, ve solo sus archivos, tiene su propia red y su propio nombre de equipo.
  • Cgroups (grupos de control): limitan cuánta CPU, memoria y cantidad de procesos puede consumir.

Si ejecuta un contenedor y luego lista los procesos del anfitrión con ps, verá el proceso del contenedor como uno más.

Contenedor frente a máquina virtual

Una máquina virtual (VM) emula hardware completo y encima arranca un sistema operativo entero, con su propio kernel. Un contenedor, en cambio, comparte el kernel del anfitrión y solo trae los archivos que la aplicación necesita.

A la izquierda, dos máquinas virtuales sobre un hipervisor: cada una lleva su aplicación, un sistema operativo invitado completo y su propio kernel. A la derecha, tres contenedores mucho más pequeños, cada uno con su aplicación y sus librerías, apoyados sobre el motor y un único kernel compartido del anfitrión.
[fig] La diferencia está en el kernel: cada máquina virtual trae el suyo y los contenedores comparten el del anfitrión. Por eso son más livianos y, por la misma razón, su aislamiento es más delgado.
  1. 1. Cada máquina virtual arranca un sistema operativo completo con su propio kernel: pesa gigabytes, tarda minutos y aísla muy bien.
  2. 2. El hipervisor reparte el hardware entre las máquinas virtuales.
  3. 3. Los contenedores comparten un solo kernel, el del anfitrión. El motor solo les pone paredes (namespaces) y límites (cgroups): pesan megabytes y arrancan en segundos.
CaracterísticaMáquina virtualContenedor
Qué virtualizaHardwareSistema operativo
KernelPropioCompartido con el anfitrión
Tamaño típicoVarios GBDecenas a cientos de MB
ArranqueMinutosSegundos o menos
AislamientoFuerteBueno, pero menor

Son livianos porque comparten el kernel, pero por la misma razón el aislamiento es más delgado. Si un atacante escapa de un contenedor mal configurado, queda directamente sobre el anfitrión. Por eso el último módulo del curso está dedicado a la seguridad.

Breve historia

La idea de aislar procesos es mucho más vieja que Docker. Lo que Docker aportó fue hacerla fácil: un formato de imagen portable y un comando sencillo.

AñoHito
1979Unix Version 7 incluye chroot, que cambia la raíz visible de un proceso
2000FreeBSD 4.0 presenta las jails, entornos aislados dentro de un mismo sistema
2008Los cgroups entran al kernel Linux y nace LXC, los contenedores de Linux
2013Solomon Hykes presenta Docker en PyCon; nace de la empresa dotCloud
2014Google anuncia Kubernetes para orquestar contenedores a gran escala
2015Se crea la Open Container Initiative (OCI) para estandarizar imágenes y ejecución
2022Kubernetes 1.24 deja de usar Docker internamente y habla con containerd

Qué es Docker

Docker es la plataforma que popularizó los contenedores. Tiene tres piezas que usará todo el tiempo:

  • El cliente docker: el comando que usted escribe en la terminal.
  • El daemon dockerd: el servicio en segundo plano que crea y administra los contenedores. El cliente le habla a través de un socket.
  • Los registros: almacenes de imágenes, como Docker Hub, de donde se descargan las plantillas.

Existen alternativas compatibles como Podman o containerd. Lo que aprenda aquí se traslada casi sin cambios, porque todas siguen el estándar OCI.

Dónde se usa

LugarEjemplo
NubeServicios como AWS ECS, Azure Container Apps o Google Cloud Run ejecutan contenedores
OrquestadoresKubernetes reparte miles de contenedores entre muchos servidores
Integración continuaGitHub Actions o GitLab CI construyen y prueban dentro de contenedores
DesarrolloUna base de datos local se levanta en segundos sin instalarla
SeguridadHerramientas como Trivy o Zeek se ejecutan en contenedores desechables

Por qué importa en ciberseguridad

Como profesional de seguridad usted necesitará levantar herramientas sin ensuciar su sistema, revisar imágenes vulnerables y detectar contenedores con privilegios excesivos. Sin dominar los contenedores no podrá auditar buena parte de la infraestructura moderna. En la empresa ficticia del curso, Cafetal Digital S.A., el equipo acaba de migrar su tienda en línea a contenedores, y usted ayudará a hacerlo bien.

Conceptos clave

ConceptoQué significa
ImagenPlantilla de solo lectura con la aplicación y sus dependencias
ContenedorInstancia en ejecución de una imagen
CapaConjunto de cambios de archivos que se apila para formar una imagen
RegistroServidor que guarda y distribuye imágenes
DaemonServicio dockerd que hace el trabajo real
DockerfileReceta de texto para construir una imagen
AnfitriónSistema operativo y kernel sobre el que corren los contenedores

Cómo leer una sintaxis y pedir ayuda

En las fichas del curso verá la forma general de cada comando. Los corchetes indican algo opcional, las MAYÚSCULAS son valores que usted reemplaza y ... significa que puede repetirse:

docker run [OPCIONES] IMAGEN [COMANDO] [ARG...]

Para pedir ayuda, agregue --help a cualquier subcomando. La documentación completa está en docs.docker.com.

$ docker run --help | head -n 3
 
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]