Expériences

Expérience

Docker : Montée de version sans interruption de service

Question du jour : est-il possible de monter de version Docker sans interrompre l’exécution des conteneurs actifs ?


Oui, mais cela n’est pas le comportement par défaut, il faut activer une option spécifique.

Ceci est possible depuis la version 1.12 car cette version intègre un changement d’architecture interne de l’outil. Docker est désormais modulaire et s’appuie sur le moteur de conteneur containerd (produit de la cloud native computing foundation) et des spécifications standardisées par l’OCI (open container initiative).

Jusqu’à cette version, Docker était un gros monolithe, par empilement successif de nouvelles fonctionnalités depuis la version 1.0. Un comble pour un outil qui apporte toute la quintessence d’une architecture microservices !

Démonstration

Afin de démontrer le comportement, lançons quelques conteneurs avec différentes stratégies de redémarrage.

Personnellement, je suis fan de ehazlett/docker-demo qui propose une IHM appelant le backend à intervalle régulier.

docker run -d -p 8880:8080 -e REFRESH_INTERVAL=500 -e TITLE=NO_RESTART ehazlett/docker-demo
docker run -d -p 8881:8080 -e REFRESH_INTERVAL=500 -e TITLE=RESTART_always --restart=always ehazlett/docker-demo
docker run -d -p 8882:8080 -e REFRESH_INTERVAL=500 -e TITLE=RESTART_unless-stopped --restart=unless-stopped ehazlett/docker-demo
docker run -d -p 8883:8080 -e REFRESH_INTERVAL=500 -e TITLE=rm --rm ehazlett/docker-demo

L’option REFRESH_INTERVAL=500 permet un appel du conteneur toutes les 500 ms afin de détecter efficacement les indisponibilités du service.

Procédure de mise à jour de Docker

Les tests ont été réalisés sur des VM ubuntu 16.04, pour une montée de version de  17.12.1-ce en 18.03.0-ce.

docker version
Client:
 Version:       17.12.1-ce
sudo apt-get update
sudo apt-get upgrade
Les paquets suivants ont été conservés :
 docker-ce docker-compose libdrm2
sudo apt-get install docker-ce
docker version
Client:
 Version:       18.03.0-ce

Comportement par défaut

Le conteneur lancé avec l’option –rm n’existe plus, il a été supprimé lors de l’arrêt du démon Docker.

Le conteneur lancé sans option de restart est arrêté, c’est le comportement par défaut.

Les conteneurs lancés en “restart always” et “restart unless-stopped” ont été redémarrés après une interruption de service de quelques secondes (4s).

 

Avec live-restore

Pour bénéficier de la mise à jour sans interruption de service, il faut activer l’option live-restore au niveau du démon Docker.

Cela se passe au niveau du fichier /etc/docker/daemon.json

{ “live-restore“: true }

Et lancer la commande suivante :

systemctl reload docker

Cette commande ne provoque pas le redémarrage du démon docker, il n’y a donc pas d’interruption de service pour les conteneurs en cours d’exécution.

Après la procédure de mise à jour, les 4 conteneurs tournent encore. Aucune interruption de service n’est à déplorer.

Conclusion

Une option qui n’est pas activée par défaut mais que l’on peut activer sans interruption de service.

Pourquoi s’en priver ?

 

Nouveau commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Solve : *
30 ⁄ 5 =


Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.