
Estou seguindo o tutorial do Docker e faço isso na minha própria versão
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:
Sempre que altero algum código, reconstruo a nova imagem do docker e executo a atualização.
docker stack deploy --compose-file docker-compose.yml xxxx-learn
Então notei algum tempo de inatividade. Eles iniciarão um novo contêiner, um de cada vez, e interromperão o contêiner antigo, um de cada vez. Então o problema é que leva alguns minutos para baixar a nova imagem e leva tempo para o servidor web ser executado.
Uma solução que eu estava pensando é executar o balanceamento de carga Nginx na frente dessas duas réplicas de servidor web. Mas existe alguma solução melhor?
Responder1
Você deve colocar a política de reinicialização e stop_grace_period em seu arquivo de composição:
version: "3.1"
services:
web:
stop_grace_period: 10s
deploy:
replicas: 2
restart_policy:
condition: on-failure
Responder2
Então notei algum tempo de inatividade. Eles iniciarão um novo contêiner, um de cada vez, e interromperão o contêiner antigo, um de cada vez. Então o problema é que leva alguns minutos para baixar a nova imagem e leva tempo para o servidor web ser executado.
Você precisa definir uma verificação de integridade para sua imagem/contêiner. Sem isso, o docker não sabe quando seu aplicativo está pronto para atender solicitações e enviará solicitações para o contêiner "ainda não pronto" e retirará o contêiner restante em execução logo após substituir o primeiro.
O healthcheck define um comando a ser executado dentro do seu contêiner para identificar se o seu aplicativo está íntegro. Veresta documentaçãopara saber como configurar a verificação de integridade dentro de sua imagem.