¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Dos servicios en un archivo Compose

Después de esta lección: Puedo describir dos servicios que trabajan juntos en un archivo Compose.

Lección de 55 min4 comandosLaboratorio de Docker: aprende contenedores, registros y reinicios arreglando un servicio roto

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

PalabraQué significaEjemplo
Servicioun programa de un archivo Compose, ejecutado en uno o más contenedores
Archivo Composeun archivo de texto que describe servicios y cómo se conectan
Puerto publicadouna puerta del contenedor abierta en el anfitrión8080:80
Depends onuna regla: un servicio espera a otro
Comprobación de saluduna 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

Código: bash
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

Comando
docker exec web getent hosts cache

Se 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

Comando
docker inspect --format '{{.Name}} {{.State.StartedAt}}' web cache worker

Se 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

ClaveQué haceQué vimos
imagedice qué imagen ejecutarel laboratorio ejecuta nginx y valkey
depends_onhace que un servicio espere a otroen el laboratorio, worker arrancó unos segundos después de web y cache
healthcheckdice a Docker cómo probar un serviciocache responde a valkey-cli ping, así que está healthy
environmentda un ajuste al programaprintenv CACHE_HOST mostró cache
volumesguarda una carpeta fuera del contenedorcache-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?

Comando
docker inspect --format '{{range .Mounts}}{{.Destination}} {{.RW}}{{end}}' web

Se 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?

Comando
docker inspect --format '{{range .Mounts}}{{.Destination}} {{.RW}}{{end}}' worker

Se 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.

Sobre este laboratorio y su código: Laboratorio de Docker: aprende contenedores, registros y reinicios arreglando un servicio roto

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.