Capítulo 1 de 3 · Docker desde cero
Tu primer contenedor
Qué es un contenedor por dentro, cómo se ejecuta y en qué se diferencia de verdad de una máquina virtual.
Voy a empezar por desmontar la idea más extendida: un contenedor no es una máquina virtual pequeña. Es un proceso normal y corriente de tu sistema operativo, solo que se ejecuta con una vista recortada del sistema de ficheros, de la red y de la tabla de procesos.
Si te quedas con eso, el resto de la guía se entiende solo.
Cómo funciona por dentro
El kernel es el mismo para todos los contenedores y para el anfitrión. Lo que cambia es lo que cada proceso puede ver y cuánto puede consumir:
- Namespaces aíslan lo que el proceso ve: PIDs, interfaces de red, puntos de montaje, usuarios.
- cgroups limitan lo que puede gastar: CPU, memoria, E/S.
- Sistema de ficheros por capas: la imagen aporta un árbol de solo lectura y el contenedor escribe en una capa encima que se pierde cuando termina.
Vamos a ejecutar algo
-
Arranca un contenedor interactivo:
docker run --rm -it alpine:3.20 sh -
Ya dentro, mira qué procesos hay:
ps aux -
Sal con
exit. El flag--rmhace que el contenedor se borre al terminar, así no acumulas basura.
Deberías ver algo parecido a esto:
PID USER TIME COMMAND
1 root 0:00 sh
7 root 0:00 ps aux
Fíjate en que tu shell es el PID 1. No es un detalle menor. En un contenedor, cuando el PID 1 muere, el contenedor termina. Más adelante esto explica unos cuantos comportamientos raros con señales y procesos hijos.
Lo que escribes dentro se pierde
La capa de escritura desaparece con el contenedor. Lo puedes comprobar en dos líneas:
docker run --rm alpine:3.20 sh -c 'echo hola > /tmp/nota'
docker run --rm alpine:3.20 cat /tmp/nota # No such file or directory
Para conservar datos se monta un volumen:
docker volume create datos
docker run --rm -v datos:/data alpine:3.20 sh -c 'echo hola > /data/nota'
docker run --rm -v datos:/data alpine:3.20 cat /data/nota # hola
Los comandos que vas a usar todos los días
| Comando | Para qué sirve |
|---|---|
docker ps -a |
Lista los contenedores, incluidos los parados |
docker logs -f <id> |
Sigue la salida de un contenedor en directo |
docker exec -it <id> sh |
Abre una shell dentro de uno que ya está corriendo |
docker inspect <id> |
Vuelca toda su configuración en JSON |
docker system df |
Te dice cuánto disco se están comiendo imágenes y volúmenes |
Con esto ya puedes ejecutar imágenes de otros. En el siguiente capítulo construimos la tuya.