Primero el cache, luego la tienda
Una tienda necesita un servidor web y un cache. Arrancar cada uno a mano es escribir comandos largos, en el orden correcto, con los nombres correctos.
A la tercera vez alguien los arranca al revés. Un solo archivo puede decirlo una vez, para todos.
Al terminar esta lección
Nota
Puedo describir dos servicios que trabajan juntos en un archivo Compose.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Servicio | un programa de un archivo Compose, ejecutado en uno o más contenedores | |
| Archivo Compose | un archivo de texto que describe servicios y cómo se conectan | |
| Puerto publicado | una puerta del contenedor abierta en el anfitrión | 8080:80 |
| Depends on | una regla: un servicio espera a otro | |
| Comprobación de salud | una prueba que Docker repite para ver si un servicio responde |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Lo que el laboratorio no puede hacer
Nota
La terminal del laboratorio no tiene el comando docker compose. El laboratorio arrancó sus tres servicios desde un archivo Compose que puedes abrir con Editar el archivo. Ejecutamos el archivo de esta lección en nuestra máquina. Tú lo lees, miras lo que hizo el del laboratorio y compruebas el orden de arranque en el trabajo.
Un archivo describe todos los servicios
Bajo services: cada servicio tiene un nombre y la imagen que ejecuta. Otras claves dicen cómo se conecta: sus puertas, sus ajustes, el volumen que guarda y lo que espera.
docker compose up lee el archivo y arranca todo en el orden correcto. Aquí hay un servidor web y un cache.
Dos servicios en un archivo Compose
services:
web:
image: nginx:1.27-alpine
ports:
- "8080:80"
environment:
CACHE_HOST: cache
depends_on:
cache:
condition: service_healthy
cache:
image: valkey/valkey:8.1-alpine
healthcheck:
test: ["CMD", "valkey-cli", "ping"]
interval: 3s
volumes:
- cache-data:/data
volumes:
cache-data:
Encuentra el cache por su nombre de servicio
docker exec web getent hosts cacheSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Mira qué servicio arrancó cuándo
docker inspect --format '{{.Name}} {{.State.StartedAt}}' web cache workerSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: qué hace cada clave
| Clave | Qué hace | Qué vimos |
|---|---|---|
| image | dice qué imagen ejecutar | el laboratorio ejecuta nginx y valkey |
| depends_on | hace que un servicio espere a otro | en el laboratorio, worker arrancó unos segundos después de web y cache |
| healthcheck | dice a Docker cómo probar un servicio | cache responde a valkey-cli ping, así que está healthy |
| environment | da un ajuste al programa | printenv CACHE_HOST mostró cache |
| volumes | guarda una carpeta fuera del contenedor | cache-data permanece al quitar los servicios |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un puerto publicado abre una puerta
Dentro de la red los servicios se alcanzan por su nombre. Un visitante en el anfitrión necesita una puerta.
"8080:80" significa: el puerto 8080 del anfitrión va al puerto 80 del contenedor. El lado del anfitrión va primero. En nuestra máquina curl http://localhost:8080 respondió 200. El web del laboratorio no tiene puerto publicado: solo lo alcanzan otros servicios y el botón Abrir del laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que depends_on espera a que el otro programa esté listo. Por sí solo espera solo a que el otro contenedor haya arrancado. Da al otro servicio una comprobación de salud y usa condition: service_healthy. Así web arranca solo cuando el cache responde.
¿Puede web escribir en la carpeta compartida?
docker inspect --format '{{range .Mounts}}{{.Destination}} {{.RW}}{{end}}' webSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
¿Y en la de worker?
docker inspect --format '{{range .Mounts}}{{.Destination}} {{.RW}}{{end}}' workerSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Para ir más lejos
Añade un tercer servicio al archivo de ejemplo: un worker que depende de web y de cache. Escribe solo sus tres líneas: el nombre, una imagen y su depends_on.
Después averigua en qué orden arranca Compose los tres. El trabajo hace la misma pregunta con cualquier lista.