Automatiser_la_mise_à_jour_des_conteneurs_Docker

Automatiser la mise à jour des conteneurs Docker

La mise à jour des conteneurs Docker peut demander des efforts importants. Il existe bien sûr des solutions pour automatiser ces mises à jour. Ici, nous étudions la solution proposée par l’image Docker WatchTower (https://github.com/v2tec/watchtower).

WatchTower est un conteneur Docker qui met à jour tous les conteneurs en cours d’exécution lorsqu’il existe une mise à jour de ce conteneur.

Le principe est le suivant :

  • vous exécutez le conteneur de WatchTower,
  • vous créez une image Docker,
  • vous la poussez sur Docker Hub,
  • vous vous mettez à jour cette image Docker,
  • vous la poussez sur Docker Hub,
  • WatchTower arrête le conteneur de l’image que vous avez créée, met à jour l’image puis redémarre le conteneur.

Lancement de Watchtower

Créer le conteneur WatchTower pour surveiller les conteneurs en cours d’exécution :

docker run -d --name watchtower --restart always -v /var/run/docker.sock:/var/run/docker.sock v2tec/watchtower -i 30
b4417755c0c4c2d71ce50e48bf2cae0a30b9c133e40791536ac1ecd9d84a5ad8

-i permet de spécifier la fréquence de la vérification des changements (ici, toutes les 30 secondes).

Afficher les logs de ce conteneur au lancement :

docker logs watchtower
time="2020-11-12T13:33:23Z" level=info msg="First run: 2020-11-12 13:33:53 +0000 UTC" 

Connexion sur Hub Docker

S’identifier sur Hub Docker avec vos credentials ($HUB_USERNAME et HUB_PASSWORD) :

docker login -u $HUB_USERNAME -p $HUB_PASSWORD
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded

Création d’une première image Docker et lancement

Créer une première image auto-update basée sur l’image devopstestlab/nginx-helloworld. Cette dernière affiche une page Web via un serveur Web nginx :

cat <<EOF> Dockerfile
FROM devopstestlab/nginx-helloworld
ADD index.html /usr/share/nginx/html/
EOF

Modifier la page Web par défaut pour afficher Helloworld v1 ! dans la page Web :

cat <<EOF> index.html
<html>
<body>
<p>Helloworld v1 !</p>
</body>
</html>
EOF

Créer l’image Docker :

docker build -t devopstestlab/auto-update .
Sending build context to Docker daemon  4.169MB
Step 1/2 : FROM devopstestlab/nginx-helloworld
latest: Pulling from devopstestlab/nginx-helloworld
Digest: sha256:3385ecc3c20a714d257c59c8cbffc7d6e681a6b38c34db6dd43beb48197f3f80
Status: Downloaded newer image for devopstestlab/nginx-helloworld:latest
 ---> 9468dea24c09
Step 2/2 : ADD index.html /usr/share/nginx/html/
 ---> Using cache
 ---> eee8df36d30e
Successfully built eee8df36d30e
Successfully tagged devopstestlab/auto-update:latest

La pousser sur Hub Docker :

docker push devopstestlab/auto-update
The push refers to repository [docker.io/devopstestlab/auto-update]

e1b56fad: Preparing 
076e3049: Preparing 
e5cf1923: Preparing 
cf4d16de: Preparing 
latest: digest: sha256:6ca819c5e3eca39bbf037995052b103e53253b9efd3dc0dffe4e311d9e15fa79 size: 1360

Lancer un conteneur Docker à partir de cette image :

docker run -d --rm --name auto-update -p 80:80 devopstestlab/auto-update
0d538753b84d31a4ae8efbfc8d2476e268b9d7db49e7b79eae17e7486a57cfb4

Vérifier que le conteneur Docker affiche bien une page Web et avce le message Helloworld v1 ! :

curl localhost:80
<html>
<body>
<p>Helloworld v1 !</p>
</body>
</html>

Mise à jour de l’image Docker

Modifier la page Web de l’image Docker pour afficher le message Helloworld v2 ! :

cat <<EOF> index.html
<html>
<body>
<p>Helloworld v2 !</p>
</body>
</html>
EOF

Créer la nouvelle image :

docker build -t devopstestlab/auto-update .
Sending build context to Docker daemon  4.169MB
Step 1/2 : FROM devopstestlab/nginx-helloworld
 ---> 9468dea24c09
Step 2/2 : ADD index.html /usr/share/nginx/html/
 ---> 840abf8ebb48
Successfully built 840abf8ebb48
Successfully tagged devopstestlab/auto-update:latest

Pousser sur Hub Docker la nouvelle version de l’image :

docker push devopstestlab/auto-update
The push refers to repository [docker.io/devopstestlab/auto-update]

593359df: Preparing 
076e3049: Preparing 
e5cf1923: Preparing 
cf4d16de: Preparing 
latest: digest: sha256:1514ae398a965c46301c45dd268d1ec2091facabbbe5caf90cd730f6320a4891 size: 1360

Afficher le contenu de la page Web du conteneur auto-update :

curl localhost:80
<html>
<body>
<p>Helloworld v1 !</p>
</body>
</html>

C’est toujours la première version qui est affichée (Helloworld v1 !).

Patienter quelques instants puis réessayer. A un moment donné, le conteneur est arrêté :

curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused

Puis il est mis à jour et relancé :

curl localhost:80
<html>
<body>
<p>Helloworld v2 !</p>
</body>
</html>

La nouvelle version est bien lancée (Helloworld v2 !).

Maintenant, nous pouvons retrouver ces événements dans les logs du conteneur watchtower :

docker logs watchtower
time="2020-11-12T13:33:23Z" level=info msg="First run: 2020-11-12 13:33:53 +0000 UTC" 
time="2020-11-12T13:34:24Z" level=info msg="Found new devopstestlab/auto-update:latest image (sha256:840abf8ebb48bc5f589548f5d54277a933ad37da0031ecf69f310ba46e9ca83b)" 
time="2020-11-12T13:34:25Z" level=info msg="Stopping /auto-update (0d538753b84d31a4ae8efbfc8d2476e268b9d7db49e7b79eae17e7486a57cfb4) with SIGTERM" 
time="2020-11-12T13:34:26Z" level=info msg="Creating /auto-update" 

Vous savez maintenant automatiser la mise à jour des conteneurs Docker à partir de leur image se trouvant sur le site Web Hub Docker.

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×