Docker Desktop 4.94, publicado el 5 de octubre de 2026, usa el driver de logs local para los contenedores Linux nuevos en lugar de json-file, de modo que los logs rotan y se comprimen sin que configures nada. Docker Engine en Linux no ha cambiado: un servidor sigue escribiendo logs en JSON sin límite de tamaño. Lo he medido en Docker Engine 29.5.2 con 3 millones de líneas y te explico cómo aplicar el mismo cambio en tu servidor, qué se rompe y qué no. También tienes la versión en inglés.

Puntos clave

  • Las notas de Docker Desktop 4.94 dicen: "Changed the default logging driver for new Linux containers to local to enable automatic log rotation and reduce disk usage."
  • El mismo contenedor que escribió 3 millones de líneas ocupó 454,5 MB con json-file y 15,5 MB con local, 29 veces menos.
  • Con los valores por defecto, local conservó las últimas 873 409 líneas: rota a 20 MB por fichero, guarda 5 ficheros y comprime los antiguos.
  • Docker Engine 29 en Linux sigue usando json-file por defecto. Para cambiarlo, añade "log-driver": "local" a /etc/docker/daemon.json; solo afecta a los contenedores que crees después.
  • El formato de local es binario. docker logs y los recolectores que leen la API de Docker funcionan; los que leen los ficheros *-json.log del disco, no.

Qué ha cambiado en Docker Desktop 4.94

Docker Desktop 4.94 trae Docker Engine 29.8.2 y un cambio de valor por defecto que afecta al disco de cualquier portátil con contenedores de larga duración. La línea de las notas de la versión[1] es la que cito arriba: los contenedores Linux nuevos se crean con el driver local.

El driver de logs decide dónde y cómo guarda Docker lo que un contenedor escribe en stdout y stderr. Hasta ahora, Docker Desktop y Docker Engine usaban json-file, que guarda cada línea como un objeto JSON en un único fichero y, salvo que le pongas max-size, no rota nunca. La guía de límites de recursos y logs en Docker explica los dos drivers; aquí me centro en el cambio y en lo que cuesta cada uno.

Cuánto disco ahorra el driver local, medido

Para medirlo lancé dos contenedores idénticos de Alpine 3.22 en Docker Engine 29.5.2, uno con cada driver. Cada uno escribe 3 millones de líneas de 76 bytes, con el formato de un log de acceso:

for d in json-file local; do
  docker run -d --name logs-$d --log-driver $d alpine:3.22 sh -c '
    i=0
    while [ $i -lt 3000000 ]; do
      echo "2026-10-07T09:00:00Z INFO request id=$i" \
           "path=/api/items status=200 dur_ms=12"
      i=$((i+1))
    done
    sleep 3600'
done

El bucle escribe las líneas y deja el contenedor vivo para poder inspeccionarlo. Cuando terminaron, medí el directorio de cada contenedor en /var/lib/docker/containers/ con sudo du -sb:

Driver Disco ocupado Ficheros Líneas que devuelve docker logs
json-file (sin opciones) 454,5 MB 1 fichero *-json.log 3 000 000
local (por defecto) 15,5 MB 1 activo + 4 .gz 873 409

Las líneas originales suman unos 228 MB. json-file casi duplica ese tamaño, porque envuelve cada línea con el nombre del flujo y una marca de tiempo en JSON. local guarda 66 MB de líneas en 15,5 MB gracias a la compresión, a cambio de quedarse solo con las más recientes: la primera línea que devolvió fue la id=2126591.

Cómo poner el driver local por defecto en un servidor Linux

En Linux el cambio no llega solo. Docker Engine 29 sigue arrancando con json-file (en mi máquina, la 29.5.2), y lo compruebas con docker info --format '{{.LoggingDriver}}'. Para cambiarlo, edita /etc/docker/daemon.json:

{
  "log-driver": "local",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

Reinicia el demonio con sudo systemctl restart docker. Lo probé con la imagen docker:29-dind y ese fichero montado: docker info pasó a decir local, y un contenedor nuevo salió con {local map[max-file:3 max-size:10m]} en docker inspect -f '{{.HostConfig.LogConfig}}'.

Hay tres matices que conviene saber antes de reiniciar:

  1. Los contenedores existentes conservan su driver. El valor se fija al crear el contenedor, así que tienes que recrearlos con docker compose up -d --force-recreate para que lo usen.
  2. Las opciones son por driver. max-size, max-file y compress existen en los dos, pero con valores por defecto distintos: local rota a 20 MB y comprime de serie, y json-file no hace ninguna de las dos cosas.
  3. Reiniciar el demonio para todos los contenedores salvo que tengas "live-restore": true en el mismo fichero.

Si prefieres no tocar el demonio, fija el driver por servicio en Compose con el bloque logging:

services:
  web:
    image: nginx:1.30
    logging:
      driver: local
      options:
        max-size: "10m"
        max-file: "3"

Qué deja de funcionar con el driver local

El formato de local no es texto. Al leer los primeros bytes de container.log con od -c aparece una cabecera binaria antes de cada línea, porque Docker guarda cada entrada como un mensaje protobuf con su longitud delante.

Esto separa las herramientas en dos grupos:

  • Siguen funcionando las que piden los logs a la API de Docker: docker logs, docker compose logs, Portainer y los recolectores que se conectan al socket, como el componente loki.source.docker de Grafana Alloy
  • Dejan de funcionar las que leen los ficheros del disco con un patrón como /var/lib/docker/containers/*/*-json.log, una configuración habitual en Promtail, Fluent Bit o Vector

Si centralizas logs con Grafana Loki en Docker leyendo ficheros, cambia antes la fuente a la API de Docker o mantén json-file con max-size y max-file, que también rota.

Cuándo seguir con json-file

json-file con rotación sigue siendo una opción válida cuando una herramienta necesita leer los ficheros directamente o cuando quieres abrir el log con grep sin pasar por Docker. Configúralo con límites en lugar de dejarlo sin ellos:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "20m", "max-file": "5" }
}

La opción que no tiene defensa es la que trae Docker Engine de serie: json-file sin límites, que en mi prueba creció hasta 454,5 MB por un solo contenedor.

Preguntas frecuentes

¿Pierdo los logs al cambiar al driver local?

No pierdes los que ya existen: los contenedores creados antes del cambio siguen con json-file hasta que los recreas. Al recrearlos, el log anterior desaparece con el contenedor viejo, igual que con cualquier driver.

¿Cuántos logs guarda el driver local por defecto?

Cinco ficheros de 20 MB como máximo, comprimidos salvo el activo. En mi prueba eso equivalió a las últimas 873 409 líneas de 76 bytes en 15,5 MB de disco.

¿Afecta el cambio de Docker Desktop a mis servidores?

No. Docker Desktop 4.94 solo cambia su propio motor. Docker Engine en Linux mantiene json-file hasta que edites daemon.json.

Conclusión

Docker Desktop ha cambiado a local porque json-file sin límites llena discos, y mi medida lo confirma: 454,5 MB frente a 15,5 MB para el mismo contenedor. En tus servidores Linux nada cambia hasta que lo hagas tú, y el cambio cuesta cinco líneas en daemon.json y recrear los contenedores.

Antes de aplicarlo, revisa si tu recolector de logs lee ficheros del disco. Si lo hace, muévelo a la API de Docker primero.

Fuentes: [1] Notas de la versión de Docker Desktop 4.94[1], [2] Driver de logs local[2], [3] Driver de logs json-file[3], [4] Configurar los drivers de logs[4], [5] loki.source.docker en Grafana Alloy[5], [6] Código del driver local en moby/moby[6].

Fuentes

  1. notas de la versión
  2. Driver de logs local
  3. Driver de logs json-file
  4. Configurar los drivers de logs
  5. loki.source.docker en Grafana Alloy
  6. Código del driver local en moby/moby