Healthchecks y políticas de reinicio en Docker resuelven un problema que un simple docker ps no ve: que el proceso principal siga vivo no significa que esté sirviendo nada útil. Un servidor web puede quedarse colgado, sin caerse, y sin un HEALTHCHECK Docker no tiene forma de saberlo.
De starting a healthy o unhealthy
Un HEALTHCHECK se define con –health-cmd en docker run o con el campo healthcheck en un compose.yaml, y usa cuatro parámetros: el intervalo entre comprobaciones, el tiempo máximo por intento, el número de fallos consecutivos necesarios para pasar a unhealthy, y un periodo de arranque en el que los fallos todavía no cuentan. docker inspect –format ‘{{.State.Health.Status}}’ y la columna STATUS de docker ps muestran ese estado en cualquier momento.
Reinicios: no, on-failure, always y unless-stopped
La política de reinicio (–restart) es independiente del healthcheck: decide qué hace Docker cuando el proceso principal del contenedor termina. on-failure:N solo actúa sobre salidas con código distinto de cero y admite un tope de intentos; always y unless-stopped reinician también tras un fallo del propio daemon, pero unless-stopped respeta un docker stop manual y no vuelve a levantar el contenedor hasta que tú lo decidas.
service_healthy en Compose
Combinando ambas piezas, depends_on: condition: service_healthy en Compose retrasa el arranque de un servicio hasta que el healthcheck de su dependencia informa healthy, algo que un depends_on simple, que solo ordena los contenedores, no garantiza. Es la misma idea que ya vimos al montar healthchecks y reinicios en Docker Compose, aplicada aquí con comandos reales sobre un demonio Docker de verdad.
Si vienes de los fundamentos de Docker, este lab encaja con lo que cubrimos en volúmenes y bind mounts y en redes en Docker, y con el resto de guías de Herramientas. La referencia oficial de la instrucción vive en la documentación de Docker, la especificación abierta del campo healthcheck de Compose está en el repositorio de Compose Specification, y el comando que usamos para comprobar Redis está documentado en la referencia de Redis.
Preguntas frecuentes
¿Qué es un HEALTHCHECK en Docker?
Es un comando que Docker ejecuta dentro del propio contenedor a intervalos regulares (–health-interval, o el campo healthcheck en Compose) para decidir si el proceso está realmente sirviendo, no solo si el contenedor sigue en marcha. Si el comando falla health-retries veces seguidas, Docker marca el contenedor como unhealthy, sin reiniciarlo por sí solo.
¿Qué diferencia hay entre las políticas de reinicio on-failure, always y unless-stopped?
on-failure solo reinicia el contenedor cuando su proceso principal termina con un código distinto de cero, y admite un tope como on-failure:5. always reinicia siempre, también tras un docker stop manual o un reinicio del propio daemon, salvo que quites el contenedor. unless-stopped se comporta como always, pero respeta un docker stop explícito: no lo vuelve a levantar hasta que lo arranques tú o reinicies Docker.
¿Cómo usa Compose depends_on: condition: service_healthy?
Con ese ajuste, Compose no arranca el servicio dependiente hasta que el healthcheck del servicio del que depende reporte healthy, no solo hasta que su contenedor exista. Sin condition: service_healthy, depends_on únicamente ordena el arranque de los contenedores, sin ninguna garantía de que el primero esté realmente listo para recibir tráfico.