Guías/Docker usa demasiada memoria

¿Docker usa demasiada memoria en tu Mac? Cómo encontrar el contenedor y ponerle límite

Atta 🐬

Fundador de Vitals

Publicado

Respuesta rápida

En un Mac, Docker ejecuta todos los contenedores dentro de una sola máquina virtual Linux, así que Monitor de Actividad muestra un único proceso grande, normalmente Virtual Machine Service for Docker, y no los contenedores. Para ver qué contenedor está usando la memoria, ejecuta docker stats. Para limitar el total, baja Memory limit en Settings → Resources → Advanced de Docker Desktop; por omisión es la mitad de la memoria de tu Mac. Resource Saver, en el mismo sitio, apaga la máquina virtual cuando Docker Desktop está inactivo. Vitals, un monitor del sistema para Mac, muestra la memoria, la CPU, la red y los puertos de cada contenedor en su pestaña Contenedores, y detiene un contenedor desde la barra de menús.

Cómo encontrar y limitar la memoria de Docker

  1. 01 Abre Monitor de Actividad, haz clic en Memoria y escribe Docker en el campo de búsqueda. La fila más grande es la máquina virtual que ejecuta tus contenedores; con el framework de virtualización de Apple se llama Virtual Machine Service for Docker. com.docker.backend es el propio Docker Desktop.
  2. 02 En Terminal, ejecuta docker stats --no-stream. Cada fila es un contenedor en marcha, y MEM USAGE / LIMIT muestra lo que usa y lo máximo que puede usar.
  3. 03 Detén lo que no estés usando: docker stop seguido del nombre del contenedor, o docker compose down en la carpeta de un proyecto de Compose.
  4. 04 Abre Settings → Resources → Advanced en Docker Desktop y baja Memory limit hasta un poco por encima de lo que muestra docker stats en tu momento de más trabajo. Aplica el cambio; Docker Desktop reinicia la máquina virtual.
  5. 05 Activa Resource Saver en la misma sección, para que la máquina virtual se apague mientras no haya contenedores en marcha.

OrbStack, Colima, Rancher Desktop y Podman también ejecutan los contenedores en una máquina virtual, cada uno con su propio ajuste de memoria. En Colima, colima start --memory 4 le da 4 GB a la máquina virtual.

Los contenedores son una función de Linux, así que en un Mac todos los motores los ejecutan dentro de una pequeña máquina virtual Linux. macOS ve esa máquina como un solo proceso y no tiene ni idea de qué contenedor de dentro está usando qué. Por eso Monitor de Actividad muestra un proceso con varios gigabytes y ningún contenedor, y por eso las respuestas están en las propias herramientas de Docker. La tabla de abajo relaciona lo que ves con lo que es y lo que hay que hacer.

Adónde va la memoria de Docker

Lo que vesQué esQué hacer
Virtual Machine Service for Docker, varios GB La máquina virtual Linux que ejecuta todos los contenedores Baja Memory limit en Settings → Resources → Advanced
com.docker.backend El propio proceso de Docker Desktop Suele ser pequeño; reinicia Docker Desktop si no para de crecer
La memoria sigue alta sin contenedores en marcha La máquina virtual aún retiene la memoria que usó Activa Resource Saver, o cierra Docker Desktop
Un contenedor cerca de su límite Necesita más, o tiene una fuga docker stats y un límite por contenedor
La memoria sube al compilar imágenes Las compilaciones se ejecutan en la misma máquina virtual Es normal; baja cuando termina la compilación

Por qué Monitor de Actividad muestra un solo proceso grande de Docker

La máquina virtual obtiene su memoria de macOS como cualquier app, hasta el Memory limit que fijes. Dentro, Linux reparte esa memoria entre tus contenedores y usa lo que sobra para guardar archivos en caché, como hace macOS. Desde fuera, todo parece lo mismo: un proceso que retiene mucha memoria.

Solo el motor sabe cómo se reparte, y eso es lo que le pregunta docker stats. Ahí, la columna CPU % es una parte de las CPU de la máquina virtual, y MEM % es una parte del límite del contenedor, o de toda la máquina virtual cuando el contenedor no tiene límite.

Cuánta memoria darle a Docker

Docker Desktop se queda por omisión con la mitad de la memoria de tu Mac: 8 GB en un Mac de 16 GB. Un entorno de desarrollo típico, con un servidor de la app, una base de datos y una caché, suele necesitar mucho menos. Ejecuta tu entorno como siempre, mira el total en docker stats en su momento de más trabajo y pon Memory limit un poco por encima.

Si lo pones demasiado bajo, Linux detiene dentro de la máquina virtual los contenedores que se quedan sin memoria. Ejecuta docker inspect --format '{{.State.OOMKilled}}' seguido del nombre de un contenedor: muestra true si ha pasado. Sube el límite, o dale a ese contenedor un límite propio para que no arrastre a los demás.

Pon un límite de memoria por contenedor

Un límite en un contenedor evita que un servicio con fugas llene la máquina virtual. Con docker run, añade --memory 512m. En un archivo de Compose, pon mem_limit: 512m en el servicio. El contenedor se detiene si lo supera, y docker stats muestra el límite junto a su uso.

Por qué Docker no devuelve la memoria

Detener contenedores libera memoria dentro de la máquina virtual, pero la máquina no siempre se la devuelve enseguida a macOS, así que su cifra en Monitor de Actividad puede seguir alta. Resource Saver la devuelve toda apagando la máquina cuando Docker Desktop está inactivo, y la vuelve a encender en unos segundos cuando un contenedor la necesita. Cerrar Docker Desktop hace lo mismo.

Docker y el espacio en disco

Las imágenes, los contenedores detenidos, los volúmenes y la caché de compilación viven en una imagen de disco que crece a medida que trabajas, y en un Mac se cuenta en Datos del sistema. docker system df muestra lo que ocupa cada tipo. docker system prune elimina los contenedores detenidos, las redes sin usar, las imágenes huérfanas y la caché de compilación; añade --volumes solo si estás seguro de que ningún volumen contiene datos que necesitas. Disk usage limit, junto a Memory limit en los ajustes de Docker Desktop, le pone un tope.

Lo que añade Vitals

Vitals muestra lo que la máquina virtual no le dice a macOS: la memoria de cada contenedor.

  • Una pestaña Contenedores con la memoria, la CPU, la red, el disco y los puertos publicados de cada contenedor, con los proyectos de Compose agrupados
  • Tarjetas del contenedor más grande y del que está más cerca de su límite, y un gráfico de la memoria por contenedor
  • Docker Desktop es una sola fila en la lista de apps, con su máquina virtual incluida; haz clic en ella para ver los contenedores de dentro
  • Los contenedores también en el menú desplegable de la barra de menús, donde un clic detiene un contenedor después de preguntarte. Consulta cómo detener contenedores de Docker
  • Docker Desktop, OrbStack, Colima, Rancher Desktop y Podman

Conviene saberlo

  • Vitals lee las cifras de los contenedores del motor y nunca inicia ni elimina contenedores. Detener es el único cambio que hace, y solo cuando se lo pides.
  • La pestaña aparece mientras hay un motor en marcha.
Consigue Vitals por $9 $9 durante el lanzamiento, $29 después. Reembolso en 14 días.

Preguntas frecuentes

¿Por qué Docker usa tanta memoria en mi Mac?

Docker ejecuta los contenedores en una máquina virtual Linux que ocupa hasta su Memory limit, la mitad de la memoria de tu Mac por omisión. Baja Memory limit en Settings → Resources → Advanced, y ejecuta docker stats para ver qué contenedor usa más.

¿Qué es Virtual Machine Service for Docker?

La máquina virtual en la que Docker Desktop ejecuta tus contenedores cuando usa el framework de virtualización de Apple. Su memoria es todo lo que usan los contenedores y el Linux que hay dentro, hasta el Memory limit de Docker Desktop.

¿Cómo limito la memoria de Docker en un Mac?

En Docker Desktop, abre Settings → Resources → Advanced y baja Memory limit. Para un solo contenedor, usa docker run --memory 512m, o mem_limit: 512m en un archivo de Compose.

¿Por qué Docker no devuelve la memoria después de detener los contenedores?

La máquina virtual se queda con parte de la memoria que ha usado incluso después de que se detengan los contenedores. Activa Resource Saver, que apaga la máquina cuando Docker Desktop está inactivo, o cierra Docker Desktop.

¿Por qué Virtual Machine Service for Docker usa tanta CPU?

Normalmente porque un contenedor está ocupado, y docker stats muestra cuál. Si la CPU sigue alta sin contenedores en marcha, cierra Docker Desktop, vuelve a abrirlo y actualízalo: una CPU alta sin nada en marcha se ha señalado como error en algunas versiones de Docker Desktop.

¿Cuánta memoria debo darle a Docker en un Mac?

Un poco más de lo que usan tus contenedores en su momento de más trabajo, que es lo que muestra docker stats. En un entorno de desarrollo típico suelen ser de 2 a 4 GB, muy por debajo de la mitad de la memoria del Mac que viene por omisión.

¿Hay alguna app que muestre la memoria de los contenedores de Docker en un Mac?

Vitals tiene una pestaña Contenedores con la memoria, la CPU, la red, el disco y los puertos de cada contenedor, para Docker Desktop, OrbStack, Colima, Rancher Desktop y Podman. También detiene un contenedor desde la barra de menús, después de preguntarte.

En el glosario

Más guías