L’un des plus gros inconvénients de la dockerisation des projets est le manque d’espace sur les machines de développement. Lorsque l’on est amené à travailler sur plusieurs projets en même temps, la limite se fait vite ressentir et peut devenir handicapante.

De base, un container n’a aucune limite et peut utiliser toute la ressource dont il a besoin. Il est donc possible de résoudre ces problèmes d’espace de plusieurs manières

  • par des commandes de base docker
  • en limitant la ressource disponible pour un container
  • en purgeant totalement le système et ne reconstruisant que ce dont on a besoin

Lister les processus docker

Avant d’agir sur les container, il est nécessaire de savoir lister les processus en cours afin de connaître leur taille et leur usage.

  • Lister le nombre de containers et images + des informations globales concernant docker : docker info
  • Lister les images (modèles de base des containers) : docker image ls ou docker image -a
  • Lister les containers : docker container ls ou docker ps -a
  • Lister les volumes (conservation des données) : docker volume ls
  • Lister les networks (liaisons entre les containers et les services docker) : docker network ls

Tous ces éléments sont persistants sur la machine et prennent par conséquent un certain espace. Pour vérifier la taille prise actuellement sur votre machine : sudo du -sh /var/lib/docker

Commandes de base pour agir ponctuellement

Supprimer par domaine

En fonction de l’espace pris par les processus docker, vous pouvez décider de ne supprimer qu’un des éléments listés (par les commandes précédemment décrites). Il est possible de supprimer plusieurs processus en séparant les noms/identifiants par un espace.

Container

  • Supprimer un container en particulier : docker rm <nom ou identifiant du container>
  • Supprimer tous les containers : docker rm $(docker ps -aq)
  • Supprimer tous les container interrompus : docker container prune
  • Supprimer les container quittés : docker rm $(docker ps -q -f “status=exited”)

Images

  • Supprimer une image en particulier : docker rmi <nom ou identifiant de l'image>
  • Supprimer toutes les images : docker rmi $(docker images -q)

Volume

  • Supprimer un volume en particulier : docker volume rm <nom ou identifiant du volume>
  • Supprimer tous les volumes : docker volume rm $(docker volume ls -q)
  • Supprimer les volumes suspendus : docker volume rm $(docker volume ls -q -f “dangling=true”)

Network

  • Supprimer un networks en particulier : docker network rm <nom ou identifiant du network>
  • Supprimer tous les networks : docker network rm $(docker network ls -q)

Repartir à zéro

Il peut être parfois plus confortable de supprimer en masse les processus présents sur une machine.

  • docker system prune : supprimer les containers interrompus, les networks non utilisés, les images suspendues et le cache.
  • docker system prune --all --force --volumes : supprimer tous les containers interrompus, les networks non utilisés, les volumes non utilisés, les images non associées et le cache.

NB : Utiliser des alias pour pouvoir les réutiliser régulièrement de manière simple.

Limiter les ressources allouées à un container

Plusieurs paramètres de commande permettent de redéfinir l’exécution de docker run et ainsi maîtriser la mémoire utilisée par un container.
Pour cela, il est important de s’assurer que la machine hôte supporte « swap ».

Pour vérifier le support, écrire docker info dans la console. En cas de non support, la ligne suivante est présente dans le retour WARNING: No swap limit support"   pour résoudre le problème .

Ne pas laisser un container consommer trop de mémoire sur une machine est important car le système Linux pourrait interrompre des processus, parfois importants, en cours afin de permettre l’exécution de ses processus système majeurs.

Docker permet d’imposer des limites strictes ou de laisser un accès maximum et de ne brider cet accès que dans certaines conditions (par exemple une mémoire faible ou des conflits majeurs liés à l’usage des ressources).

docker run <options>

Options de la commande :

  • --memory=: la mémoire maximum utilisable par le container. (minimum 4m)
  • --memory-swap * : indicateur qui ne fonctionne que si --memory= est défini. Cette option permet de définir la quantité de mémoire que le container peut échanger sur le disque
  • --kernel-memory : quantité maximale de mémoire du kernel que le conteneur peut utiliser