Los registros que se muestran con docker logs no se acumulan continuamente en la memoria del sistema. En cambio, se almacenan como archivos en el disco del sistema host de forma predeterminada.
¿Dónde y cómo se almacenan los registros? ⚙️
Docker captura tanto la salida estándar (stdout) como la salida de error estándar (stderr) del contenedor y las procesa a través del controlador de registro (Logging Driver). Si no se realizan configuraciones especiales, Docker utiliza de forma predeterminada el controlador de registro json-file.
-
Ubicación de almacenamiento: Los registros del contenedor se almacenan en un archivo en formato JSON en una ruta específica del sistema host. Generalmente, la ruta es la siguiente:
/var/lib/docker/containers/[container_ID]/[container_ID]-json.log
-
Comando
docker logs: Este comando en realidad no muestra el contenido de la memoria, sino que lee el archivo de registro JSON mencionado anteriormente y lo muestra en el terminal.
¿No se quedará sin espacio en disco si los registros siguen acumulándose? 🤔
Sí, es correcto. Si no se toman medidas, el archivo de registro continuará creciendo y puede ocupar todo el espacio en disco del host. Para prevenir esto, Docker proporciona la opción de rotación de registros (Log Rotation) que limita el tamaño y la cantidad de archivos de registro.
Por ejemplo, al ejecutar el comando docker run, se pueden agregar las siguientes opciones:
docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
-
--log-opt max-size=10m: Limita el tamaño máximo de un archivo de registro a 10MB. -
--log-opt max-file=3: Limita el número máximo de archivos de registro a 3. Si se supera este número, se eliminarán los archivos más antiguos.
Al hacer esto, los registros del contenedor ocuparán un máximo de 30MB (10MB * 3) de espacio en disco.
Conclusión 📝
-
Los registros de consola de los contenedores Docker se almacenan en archivos en el disco del host, no en la memoria del sistema.
-
El comando
docker logsse encarga de leer y mostrar estos archivos almacenados. -
Es muy importante configurar las opciones de rotación de registros (
max-size,max-file) para evitar que los archivos de registro crezcan indefinidamente.
En Docker Compose, se pueden configurar fácilmente las opciones de registro para cada servicio dentro del archivo docker-compose.yml.
Piensa en el flag --log-opt del comando docker run como algo que se introduce en formato YAML.
Configuración en el archivo docker-compose.yml 📝
A continuación se muestra un ejemplo de cómo aplicar la rotación de registros a un servicio llamado my-app.
services:
my-app:
image: your-app-image
# ... otras configuraciones ...
deploy:
resources:
limits:
memory: 512M
# 👇 Esta es la parte de configuración de registro.
logging:
driver: "json-file" # Controlador de registro a utilizar (opcional ya que es el valor predeterminado)
options:
max-size: "10m" # Tamaño máximo por archivo: 10MB
max-file: "3" # Número máximo de archivos: 3
-
logging: La clave que inicia la configuración de registro para el servicio. -
driver: Especifica el controlador de registro que se utilizará. Eljson-filees el valor predeterminado. -
options: Configura las opciones que se pasarán al controlador.-
max-size: Igual que--log-opt max-sizeendocker run. -
max-file: Igual que--log-opt max-fileendocker run.
-
Ahora, al iniciar este servicio con docker-compose up, los registros del contenedor my-app se rotarán automáticamente y solo utilizarán un máximo de 30MB (10MB * 3) de espacio en disco.
Configurar como valores predeterminados para todos los contenedores 🌍
Si es engorroso proporcionar opciones manualmente para cada contenedor y deseas aplicar una política predeterminada para todo el sistema, la mejor manera es modificar el archivo de configuración del demonio de Docker.
-
Abre o crea el archivo
/etc/docker/daemon.json. (Si no hay archivo, créalo nuevo.) -
Escribe el contenido de la siguiente manera:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
- Reinicia el demonio de Docker.
sudo systemctl restart docker
Con esta configuración, todos los nuevos contenedores creados seguirán automáticamente esta política a menos que se especifiquen configuraciones de registro diferentes. Por supuesto, si se especifica una opción de registro diferente para un contenedor en el archivo docker-compose.yml o en el comando docker run, las configuraciones individuales tendrán prioridad sobre las configuraciones del demonio.
Resumen
-
Configuración de servicios individuales: Configurarlo en la sección
loggingdel archivodocker-compose.ymles lo más común y conveniente. -
Configuración predeterminada global: Para aplicar una política uniforme a todos los contenedores del servidor, modifica el archivo
/etc/docker/daemon.json.
No hay comentarios.