Docker tips & tricks - Limitation de la consommation des ressources d'un conteneur Docker

Il peut arriver parfois la situation où un conteneur Docker consomme une quantité excessive de ressources sur un hôte provoquant une charge excessive du conteneur. Une solution est de limiter les ressources que ce conteneur peut consommer, en terme de CPU ou de mémoire. Dans cet article, nous allons limiter la quantité de mémoire consommée.

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.

Docker tips & tricks - Exécution de Docker dans Docker

Il est parfois utile de pouvoir lancer un conteneur pouvant lancer lui-même des tâches Docker. Cela consiste à installer Docker dans un conteneur Docker. Cela suppose aussi de monter les sockets Linux de l’hôte dans le conteneur. Docker CLI lui-même utilise le socket Docker pour communiquer avec Docker Engine.

Exemple de protection contre l'attaque CSRF en NodeJS [FRENCH]

Dans cet article, nous allons mettre en place une protection contre CSRF en NodeJS avec le module Express.

Exemple de mise en oeuvre de la protection CORS avec NodeJS [FRENCH]

Dans cet article, nous mettant en oeuvre la protection CORS avec NodeJS dans un serveur Web.

Your browser is out-of-date!

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

×