Reinicie un servicio en la pila de enjambre de Docker

79

¿Alguien sabe si hay una manera de hacer que el enjambre de docker reinicie un servicio que es parte de una pila sin reiniciar toda la pila?

tweeks200
fuente

Respuestas:

109

Hacerlo de docker stack deploynuevo para mí es el camino a seguir para actualizar los servicios. Como Respuesta de Francois , y también en mi propia experiencia, al hacerlo, solo se actualizan los servicios que deben actualizarse.

Pero a veces, al probar cosas, parece más fácil reiniciar un solo servicio. En mi caso, tuve que borrar el volumen y actualizar el servicio para iniciarlo como si estuviera nuevo. No estoy seguro de si hay desventajas en el método que describiré. Lo probé en mi pila de desarrollo y funcionó muy bien para mí.

Obtenga la identificación del servicio que desea eliminar y luego úselo docker service update --force <id>para forzar la actualización del servicio que lo vuelve a implementar de manera efectiva

$ docker stack services <stack_name>
ID                  NAME              ...
3xrdy2c7pfm3        stack-name_api    ...

$ docker service update --force 3xrdy2c7pfm3

La --forcebandera forzará la actualización del servicio y se reiniciará.

Mate
fuente
68

Escalar a 0 y realizar una copia de seguridad:

docker service scale myservice=0
docker service scale myservice=10
Luke W
fuente
2
éste es el único que realmente fuerza un reinicio. ¡Gracias!
the_ccalderon
1
de acuerdo, solo forzar una actualización no reinició el servicio para mí, no sé por qué
Egor
Aunque este método parece detener el servicio, de alguna manera el servicio permanece al acecho en las entrañas de la bestia. Por ejemplo, obtengo 'puerto ya en uso' cuando reduzco el servicio e intento girar otro que use el mismo puerto.
netlander
14

Mirando la docker stackdocumentación:

Descripción ampliada

Cree y actualice una pila a partir de un archivo de composición o dab en el enjambre

De este artículo de blog : docker stackfunciona de manera similar a docker compose. Es idempotente . Si la pila ya está implementada, docker stack deployreiniciará solo aquellos servicios que tengan el resumen o la etiqueta que se actualizó:

proceso de pila de Docker

Según mi experiencia, cuando vuelvo a implementar la misma pila con un cambio de servicio, solo se reiniciará el servicio actualizado .

PERO ... parece haber algunas limitaciones para los cambios que se tienen en cuenta (algunos informan errores con etiquetas de imagen ), así que pruébelo y vea si funciona como se esperaba.

También puede usarlo service updatesi desea asegurarse de que solo el servicio dirigido si se actualiza con sus cambios.

También puede consultar este SO QA similar .

François Maturel
fuente
Gracias, esto funciona como se esperaba. De hecho, estoy buscando forzar el reinicio de un servicio específico (o toda la pila) de manera continua. Desafortunadamente, algunos servicios con los que trato tienen problemas con la invalidación de caché y encontramos que necesitamos eliminar / volver a implementar en la pila para forzar las actualizaciones. Mirando la service updatedocumentación, podría agregar / eliminar envvariables para falsificarlo si no hay una forma integrada.
tweeks200
Solo buscaba lo mismo, no pude encontrar ninguno en los documentos.
Morgan Kobeissi
Acabo de encontrar el siguiente problema: docker stack deployno iniciaría un servicio (openldap). No pude encontrar un archivo de registro. docker-compose run <service>pondría en marcha el contenedor sin problema. Finalmente, docker service update --force <servce>funcionó.
rhoerbe
0

Según el ejemplo en la documentación para actualizaciones continuas:

$ docker service update --image redis: 3.0.7 redis

Sin embargo, eso solo funciona si su imagen ya está en las máquinas locales. De lo contrario, debe usar --with-registry-auth para enviar los detalles de autenticación del registro a los agentes del enjambre. Consulte los detalles en la documentación de actualización del servicio de Docker.

$ docker service update --with-registry-auth --image redis: 3.0.7 redis

Robert Wasmann
fuente
-1

eliminarlo:

docker stack rm stack_name

redistribuirlo:

docker stack deploy -c docker-compose.yml stack_name
Xiaorong Liao
fuente
La respuesta aceptada anterior funciona y lo hace de manera continua para evitar el tiempo de inactividad
tweeks200