Pixelaula.
Docker · Lección 1 de 4

Una imagen, muchos contenedores

Una imagen es la receta empaquetada; un contenedor es esa receta corriendo. Al terminar sabrás levantar servicios, publicar sus puertos y diagnosticar uno que no arranca.

⏱ 25–35 min🧪 Laboratorio con 4 misiones
01 · La receta y el plato

Imagen contra contenedor

Una imagen es un paquete de solo lectura con todo lo que una aplicación necesita para correr: un sistema de archivos mínimo, las bibliotecas, el programa y la orden con que arranca. Un contenedor es una imagen en ejecución: un proceso aislado del resto de la máquina, con su propia capa de escritura encima de la imagen.

La relación es como la de una clase y sus objetos: de una sola imagen nginx puedes crear diez contenedores, y cada uno tiene su nombre, sus puertos y sus archivos modificados. Borrar un contenedor no toca la imagen; para borrar la imagen, primero no debe quedar ningún contenedor usándola.

Las imágenes viven en un registro. El público por defecto es Docker Hub: docker pull nginx:alpine descarga la imagen nginx con la etiqueta (tag) alpine. Si no escribes etiqueta, Docker usa latest, que solo es "la que el autor marcó así", no necesariamente la más nueva: en proyectos reales conviene fijar la versión, por ejemplo mysql:8.0.

Escena 1

Crea contenedores a partir de la misma imagen y mira qué comparten y qué es de cada uno.

02 · docker run

Levantar un servicio

docker run hace tres cosas: descarga la imagen si no la tienes, crea el contenedor y lo arranca. Las opciones que más vas a usar:

docker run -d -p 8080:80 --name web nginx:alpine
#          │  │          │          └ imagen:etiqueta
#          │  │          └ nombre del contenedor (si no, Docker inventa uno)
#          │  └ publica el puerto 80 del contenedor en el 8080 de tu equipo
#          └ segundo plano: te devuelve la terminal

El puerto se escribe siempre HOST:CONTENEDOR. Adentro, nginx escucha en el 80 porque así viene configurado; afuera, tú eliges un puerto libre de tu equipo. Por eso puedes tener tres contenedores de nginx, todos en su puerto 80 interno, publicados en 8080, 8081 y 8082. Lo que no puedes es publicar dos en el mismo puerto de tu equipo.

Con -e CLAVE=valor pasas variables de entorno, que es como se configura casi toda imagen oficial. Una base de datos, por ejemplo, se niega a arrancar si no le dices cuál será la contraseña del administrador: -e MYSQL_ROOT_PASSWORD=secret.

Escena 2

Elige cómo publicar el puerto y desde dónde haces la petición. ¿Llega o no llega?

03 · Ciclo de vida

Creado, corriendo, detenido, borrado

Un contenedor vive mientras vive su proceso principal. Si ese proceso termina, ya sea porque acabó su trabajo o porque falló, el contenedor pasa a detenido (Exited) con un código de salida: 0 si terminó bien, otro número si falló.

docker ps              # los que están corriendo
docker ps -a           # todos, también los detenidos
docker logs web        # lo que el proceso escribió en pantalla
docker exec web ls /usr/share/nginx/html   # ejecuta una orden dentro de uno que corre
docker stop web        # lo detiene (sigue existiendo)
docker start web       # lo vuelve a arrancar, con sus mismos archivos
docker rm web          # lo borra (si corre: docker rm -f web)

Cuando un contenedor no arranca, el primer paso siempre es docker ps -a para ver su estado y luego docker logs para leer por qué terminó. Casi siempre el propio programa lo explica.

Escena 3

Aplica órdenes a un contenedor y sigue su estado. Fíjate en cuáles conservan sus archivos.

04 · Predice

Antes de leer la respuesta

Laboratorio

Tu turno: levanta un servidor y una base

Tienes Docker instalado y ninguna imagen descargada. Levanta un servidor web y pruébalo desde tu equipo con curl, haz que una base de datos MySQL arranque (al principio no va a querer), corre dos copias del mismo servidor a la vez y aprende a mirar dentro de un contenedor y a limpiar.

Repaso

Comprueba lo que entendiste

Cada respuesta incorrecta explica por qué parece correcta y en qué falla.