
Estoy siguiendo el tutorial de Docker y lo hago en mi propia versión.
version: "3.1"
services:
web:
image: registry.gitlab.com/xxxx/xxxx:latest
deploy:
replicas: 2
ports:
- "8888:80"
mysql:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: user
MYSQL_PASS: password
ports:
- "8889:3306"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
Cada vez que cambio algún código, reconstruyo una nueva imagen de la ventana acoplable y ejecuto la actualización.
docker stack deploy --compose-file docker-compose.yml xxxx-learn
Luego noté algo de tiempo de inactividad. Iniciarán un nuevo contenedor uno a la vez y detendrán el antiguo uno a la vez. Entonces el problema es que se necesitan unos minutos para descargar la nueva imagen y el servidor web necesita tiempo para ejecutarse.
Una solución en la que estaba pensando es ejecutar el equilibrio de carga de Nginx frente a esas dos réplicas del servidor web. ¿Pero hay alguna solución mejor?
Respuesta1
Debes poner la política de reinicio y stop_grace_period en tu archivo de redacción:
version: "3.1"
services:
web:
stop_grace_period: 10s
deploy:
replicas: 2
restart_policy:
condition: on-failure
Respuesta2
Luego noté algo de tiempo de inactividad. Iniciarán un nuevo contenedor uno a la vez y detendrán el antiguo uno a la vez. Entonces el problema es que se necesitan unos minutos para descargar la nueva imagen y el servidor web necesita tiempo para ejecutarse.
Debe definir una verificación de estado para su imagen/contenedor. Sin eso, Docker no sabe cuándo su aplicación está lista para atender solicitudes y enviará solicitudes al contenedor "aún no listo" y eliminará el contenedor en ejecución restante poco después de reemplazar el primero.
La comprobación de estado define un comando que se ejecutará dentro de su contenedor para identificar si su aplicación está en buen estado. Veresta documentaciónpara saber cómo configurar el control de salud dentro de su imagen.