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.
Pour cela, créons une image Docker basée sur Alpine et installant le package stress-ng
(https://kernel.ubuntu.com/~cking/stress-ng/), qui permet de tester un système de différentes manières :
cat <<EOF> Dockerfile |
FROM alpine:latest |
RUN apk update && \ |
apk add stress-ng |
EOF |
Créons l’image, que l’on va appeler alpine-stress
:
docker build -t alpine-stress . |
L’image se construit :
Sending build context to Docker daemon 4.158MB |
Step 1/2 : FROM alpine:latest |
---> d6e46aa2470d |
Step 2/2 : RUN apk update && apk add stress-ng |
---> Using cache |
---> 6c1f156ce981 |
Successfully built 6c1f156ce981 |
Successfully tagged alpine-stress:latest |
Maintenant, créons le conteneur avec la commande stress-ng --vm 1 --vm-bytes 1G -t 1h
:
docker container run --rm -d --name stressed --memory 512M alpine-stress stress-ng --vm 1 --vm-bytes 1G -t 1h |
L’ID du conteneur créé est affiché :
6fd5bbe3f60d8cf1f0f49eb39907f87906d4517ccf2bade3652943d67cee5b09 |
Voici quelques explications :
--vm
: spécifie le nombre de stresseurs de mémoire virtuelle,--vm-bytes
: spécifie la mémoire consommée,-t
: spécifie la durée.
Vérifons que le conteneur a bien été créé et qu’il est toujours en cours d’exécution :
docker ps -a |
Nous voyons apparaître le conteneur que nous venons de créer :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
6fd5bbe3f60d alpine-stress "stress-ng --vm 1 --…" 2 seconds ago Up 1 second stressed |
Affichons la liste des conteneurs avec leurs limitations de ressources :
docker stats |
Cette commande affiche :
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS |
6fd5bbe3f60d stressed 0.46% 511.9MiB / 512MiB 99.98% 836B / 0B 180kB / 0B 3 |
MEM USAGE
indique la mémoire utilisée tandis que LIMIT
indique la limite de mémoire. On voit que le conteneur n’utilise à cet instant 511.6 MiB sur 512 MiB. Nous remarquons que bien que nous ayons demandé de consommer 1 GiB de mémore, la mémoire consommée est inférieure à la limite des 512 MiB que nous avons spécifiée, sans la dépasser.
Nous aurions pu également limiter la consommation de ressources en utilisant l’argument --cpu
lors de l’exécution du conteneur Docker.
Vous savez maintenant comment éviter qu’un hôte ne soit surchargé à cause d’une consommation excessive de ressources par un des conteneurs Docker tournant sur celui-ci.