Guides/Docker utilise trop de mémoire

Docker utilise trop de mémoire sur Mac ? Trouver le conteneur, et le limiter

Atta 🐬

Fondateur de Vitals

Publié le

En bref

Sur un Mac, Docker fait tourner tous les conteneurs dans une seule machine virtuelle Linux : le Moniteur d’activité affiche donc un seul gros processus, généralement Virtual Machine Service for Docker, et non les conteneurs. Pour voir quel conteneur utilise la mémoire, lancez docker stats. Pour limiter le total, baissez Memory limit dans Settings → Resources → Advanced de Docker Desktop ; par défaut, c’est la moitié de la mémoire de votre Mac. Resource Saver, au même endroit, éteint la machine virtuelle quand Docker Desktop est inactif. Vitals, un moniteur système pour Mac, affiche la mémoire, le processeur, le réseau et les ports de chaque conteneur dans son onglet Conteneurs, et arrête un conteneur depuis la barre des menus.

Comment trouver et limiter la mémoire de Docker

  1. 01 Ouvrez le Moniteur d’activité, cliquez sur Mémoire et tapez Docker dans le champ de recherche. La plus grosse ligne est la machine virtuelle qui fait tourner vos conteneurs ; avec le framework Virtualization d’Apple, elle s’appelle Virtual Machine Service for Docker. com.docker.backend est Docker Desktop lui-même.
  2. 02 Dans le Terminal, lancez docker stats --no-stream. Chaque ligne est un conteneur en cours d’exécution, et MEM USAGE / LIMIT indique ce qu’il utilise et le maximum qu’il peut utiliser.
  3. 03 Arrêtez ce dont vous ne vous servez pas : docker stop suivi du nom du conteneur, ou docker compose down dans le dossier d’un projet Compose.
  4. 04 Ouvrez Settings → Resources → Advanced dans Docker Desktop et baissez Memory limit juste au-dessus de ce que docker stats affiche au plus fort de votre activité. Appliquez la modification ; Docker Desktop redémarre la machine virtuelle.
  5. 05 Activez Resource Saver dans la même section, pour que la machine virtuelle s’éteigne quand aucun conteneur ne tourne.

OrbStack, Colima, Rancher Desktop et Podman font aussi tourner les conteneurs dans une machine virtuelle, chacun avec son propre réglage de mémoire. Pour Colima, colima start --memory 4 donne 4 Go à la machine virtuelle.

Les conteneurs sont une fonctionnalité de Linux : sur un Mac, chaque moteur les fait donc tourner dans une petite machine virtuelle Linux. macOS voit cette machine comme un seul processus et ignore totalement quel conteneur utilise quoi à l’intérieur. C’est pourquoi le Moniteur d’activité affiche un seul processus de plusieurs gigaoctets et aucun conteneur, et pourquoi les réponses se trouvent dans les outils de Docker. Le tableau ci-dessous associe ce que vous voyez à ce que c’est et à ce qu’il faut faire.

Où va la mémoire de Docker

Ce que vous voyezCe que c’estQue faire
Virtual Machine Service for Docker, plusieurs Go La machine virtuelle Linux qui fait tourner tous les conteneurs Baissez Memory limit dans Settings → Resources → Advanced
com.docker.backend Le processus de Docker Desktop lui-même Généralement petit ; redémarrez Docker Desktop s’il grossit sans cesse
La mémoire reste élevée sans aucun conteneur en cours La machine virtuelle garde la mémoire qu’elle a utilisée Activez Resource Saver, ou quittez Docker Desktop
Un conteneur proche de sa limite Il lui en faut plus, ou il fuit docker stats, et une limite par conteneur
La mémoire augmente pendant la création d’images Les builds tournent dans la même machine virtuelle Normal ; elle redescend à la fin du build

Pourquoi le Moniteur d’activité affiche un seul gros processus Docker

La machine virtuelle obtient sa mémoire de macOS comme n’importe quelle app, jusqu’à la Memory limit que vous avez fixée. À l’intérieur, Linux répartit cette mémoire entre vos conteneurs et utilise le reste pour mettre des fichiers en cache, comme le fait macOS. De l’extérieur, tout se ressemble : un seul processus qui retient beaucoup de mémoire.

Seul le moteur connaît la répartition, et c’est ce que docker stats lui demande. La colonne CPU % y est une part des processeurs de la machine virtuelle, et MEM % une part de la limite du conteneur, ou de toute la machine virtuelle quand le conteneur n’en a pas.

Combien de mémoire donner à Docker

Docker Desktop prend par défaut la moitié de la mémoire de votre Mac : 8 Go sur un Mac de 16 Go. Une pile de développement classique, un serveur d’app, une base de données et un cache, a généralement besoin de bien moins. Faites tourner votre pile comme d’habitude, surveillez le total dans docker stats au plus fort de l’activité, et réglez Memory limit juste au-dessus.

Réglez-la trop bas et Linux, dans la machine virtuelle, arrête les conteneurs qui manquent de mémoire. Lancez docker inspect --format '{{.State.OOMKilled}}' suivi du nom d’un conteneur : la commande affiche true si c’est arrivé. Augmentez la limite, ou donnez à ce conteneur sa propre limite pour qu’il n’entraîne pas les autres dans sa chute.

Fixer une limite de mémoire par conteneur

Une limite sur un conteneur empêche un service qui fuit de remplir la machine virtuelle. Avec docker run, ajoutez --memory 512m. Dans un fichier Compose, définissez mem_limit: 512m sur le service. Le conteneur est arrêté s’il la dépasse, et docker stats affiche la limite à côté de son utilisation.

Pourquoi Docker ne rend pas la mémoire

Arrêter des conteneurs libère de la mémoire dans la machine virtuelle, mais la machine ne la rend pas toujours tout de suite à macOS : sa valeur dans le Moniteur d’activité peut rester élevée. Resource Saver la rend en totalité en éteignant la machine quand Docker Desktop est inactif, et elle redémarre en quelques secondes quand un conteneur en a besoin. Quitter Docker Desktop a le même effet.

Docker et l’espace disque

Les images, les conteneurs arrêtés, les volumes et le cache de build vivent dans une seule image disque qui grossit à mesure que vous travaillez, et sur un Mac elle est comptée dans Données système. docker system df montre ce que prend chaque type. docker system prune supprime les conteneurs arrêtés, les réseaux inutilisés, les images orphelines et le cache de build ; n’ajoutez --volumes que si vous êtes sûr qu’aucun volume ne contient de données dont vous avez besoin. Disk usage limit, à côté de Memory limit dans les réglages de Docker Desktop, la plafonne.

Ce que Vitals apporte

Vitals montre ce que la machine virtuelle ne dit pas à macOS : la mémoire de chaque conteneur.

  • Un onglet Conteneurs avec la mémoire, le processeur, le réseau, le disque et les ports publiés de chaque conteneur, les projets Compose regroupés
  • Des cartes pour le plus gros conteneur et pour celui qui est le plus proche de sa limite, et un graphique de la mémoire par conteneur
  • Docker Desktop tient en une ligne dans la liste des apps, avec sa machine virtuelle comptée dedans ; cliquez dessus pour voir les conteneurs qu’il contient
  • Les conteneurs aussi dans le menu déroulant de la barre des menus, où un clic arrête un conteneur après vous l’avoir demandé. Voir comment arrêter des conteneurs Docker
  • Docker Desktop, OrbStack, Colima, Rancher Desktop et Podman

Bon à savoir

  • Vitals lit les chiffres des conteneurs auprès du moteur et ne démarre ni ne supprime jamais de conteneur. Arrêter est la seule modification qu’il fait, et seulement quand vous le demandez.
  • L’onglet apparaît quand un moteur est en cours d’exécution.
Obtenir Vitals pour $9 $9 pendant le lancement, $29 ensuite. Remboursement sous 14 jours.

Questions fréquentes

Pourquoi Docker utilise-t-il autant de mémoire sur mon Mac ?

Docker fait tourner les conteneurs dans une machine virtuelle Linux qui prend jusqu’à sa Memory limit, par défaut la moitié de la mémoire de votre Mac. Baissez Memory limit dans Settings → Resources → Advanced, et lancez docker stats pour voir quel conteneur en utilise le plus.

Qu’est-ce que Virtual Machine Service for Docker ?

La machine virtuelle dans laquelle Docker Desktop fait tourner vos conteneurs, quand il utilise le framework Virtualization d’Apple. Sa mémoire, c’est tout ce qu’utilisent les conteneurs et Linux à l’intérieur, jusqu’à la Memory limit de Docker Desktop.

Comment limiter la mémoire de Docker sur un Mac ?

Dans Docker Desktop, ouvrez Settings → Resources → Advanced et baissez Memory limit. Pour un seul conteneur, utilisez docker run --memory 512m, ou mem_limit: 512m dans un fichier Compose.

Pourquoi Docker ne rend-il pas la mémoire après l’arrêt des conteneurs ?

La machine virtuelle garde une partie de la mémoire qu’elle a utilisée même après l’arrêt des conteneurs. Activez Resource Saver, qui éteint la machine quand Docker Desktop est inactif, ou quittez Docker Desktop.

Pourquoi Virtual Machine Service for Docker utilise-t-il autant de processeur ?

En général, un conteneur est occupé, et docker stats montre lequel. Si le processeur reste élevé sans aucun conteneur en cours, quittez et rouvrez Docker Desktop, et mettez-le à jour : un processeur élevé alors que rien ne tourne a été signalé comme un bug dans certaines versions de Docker Desktop.

Combien de mémoire donner à Docker sur un Mac ?

Un peu plus que ce qu’utilisent vos conteneurs au plus fort de leur activité, ce que montre docker stats. Pour une pile de développement classique, c’est souvent 2 à 4 Go, bien en dessous de la valeur par défaut, la moitié de la mémoire du Mac.

Existe-t-il une app qui montre la mémoire des conteneurs Docker sur Mac ?

Vitals a un onglet Conteneurs avec la mémoire, le processeur, le réseau, le disque et les ports de chaque conteneur, pour Docker Desktop, OrbStack, Colima, Rancher Desktop et Podman. Il arrête aussi un conteneur depuis la barre des menus, après vous l’avoir demandé.

Dans le lexique

Autres guides