Los contenedores se van, los datos se quedan
Un contenedor se puede borrar en cualquier momento; lo que debe sobrevivir va en un volumen, y lo que debe hablarse va en una misma red. Al terminar sabrás conservar datos y conectar servicios.
Tres formas de montar datos
Todo lo que un contenedor escribe en su propia capa desaparece cuando lo borras. Eso es bueno, porque los contenedores deben ser desechables: actualizar una base de datos debería ser borrar el contenedor viejo y crear uno con la imagen nueva. Pero los datos de esa base tienen que sobrevivir, y para eso se montan fuera de la capa del contenedor:
- Volumen con nombre (
-v datos:/var/lib/mysql): Docker lo crea y lo administra. Sobrevive a los contenedores y lo pueden usar varios. Es la opción para datos de producción. - Montaje de una carpeta o bind mount (
-v "$(pwd)/sitio:/usr/share/nginx/html"): conecta una carpeta de tu equipo dentro del contenedor. Lo que cambias en tu editor se ve al instante adentro. Es la opción para desarrollar. - Volumen anónimo (
-v /var/lib/mysql, o el que algunas imágenes crean solas): tiene un nombre aleatorio. Sobrevive al contenedor, pero nadie lo encuentra después y se va acumulando.
docker volume create datos docker volume ls docker volume inspect datos # dónde vive y qué tiene docker volume prune # borra los anónimos que nadie usa (-a: también los con nombre)
Elige cómo se montan los datos y qué le haces al contenedor. ¿Sobreviven?
Contenedores que se encuentran por nombre
La regla de oro: dos contenedores se pueden hablar si están en la misma red. En una red que tú creas, Docker además funciona como servidor DNS: cada contenedor se encuentra por su nombre o por el alias que le diste con --network-alias. En la red bridge que se usa por defecto no hay nombres: solo IP, que cambian cada vez que recreas un contenedor.
docker network create tienda docker run -d --name base --network tienda --network-alias db \ -e POSTGRES_PASSWORD=secret -v datos:/var/lib/postgresql/data postgres:15.1 docker run -d --name api --network tienda -p 3000:3000 mi-api # dentro de api, la base está en db:5432 docker network connect tienda otro # conecta un contenedor que ya existe
Fíjate en que la base no tiene -p. Los contenedores de la misma red se hablan por sus puertos internos; publicar con -p solo sirve para entrar desde tu equipo (o desde internet, en un servidor). Una base de datos que nadie de afuera debe tocar no necesita puerto publicado.
La aplicación intenta conectarse a la base. Elige la red y la dirección que usa.
Puertos publicados y puertos internos
Una aplicación típica tiene un servicio que da la cara (la web o la API) y servicios de apoyo (base de datos, caché). Solo el primero necesita -p. Cada puerto publicado es una puerta más que proteger.
Decide qué servicios publicas y mira quién puede alcanzar cada uno.
Antes de leer la respuesta
Tu turno: datos que sobreviven y servicios que se encuentran
En la carpeta proyecto hay un sitio en sitio/index.html. Haz que unos datos sobrevivan a borrar su contenedor, desarrolla el sitio viendo tus cambios sin reconstruir nada, conecta un contenedor con una base de datos por su nombre y arregla uno que quedó en la red equivocada.
Comprueba lo que entendiste
Cada respuesta incorrecta explica por qué parece correcta y en qué falla.