viernes, 19 de febrero de 2021

Docker tips: Como gestionar los logs

Hoy vamos a ver un truco sencillo sobre Docker y sus logs. Pero puede ocasionarnos más de un dolor de cabeza, y esto es el tratamiento de los logs y su tamaño. 

Por defecto, Docker tiene diversas formas de mostrar la información sobre sus contenedores. Y por defecto selecciona la opción de almacenar dicha información en formato de fichero JSON. Esto lo podemos visualizar a través del siguiente comando:

docker info --format '{{.LoggingDriver}}'

El problema principal de esto, es que Docker almacena la información de forma descontrolada. Es decir, si no lo configuramos, almacenará información sin ningún tipo de límite y que deje sin espacio el disco. Del cual nos podemos dar cuenta a través del mensaje del sistema no space left on device. Este problema también podemos comprobarlo a través del siguiente comando, el cual nos mostrará cuanto ocupan los ficheros:

sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"

Si nos encontramos con este error, podemos solucionarlo de varias formas. La primera de ellas, es la rápida pero incorrecta. Y es simplemente borrar los ficheros. 

sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"

Pero esto solo conseguirá que más tarde o más temprano tengas el mismo problema. Por lo que no podemos decir que sea una solución. Ahora veremos como cambiarlo de forma permanente, de tres formas diferentes.

  • Indicar como debe rotar el log en el momento de arrancar el contenedor
Podemos indicar diferentes opciones para rotar el log, como el máximo tamaño del log (max-size) o el número máximo de ficheros ha guardar (max-file). Ejemplo

docker run --log-opt max-size=1m --log-opt max-file=3 \
-d busybox sh -c "while true; do $(echo date); sleep 0; done" 

Aquí también podemos ver un ejemplo de como rota el log. 

  • Indicar la configuración en el docker-compose. 
También podemos indicarle a un contenedor concreto como queremos que roten los logs, dentro del docker-compose. Esto lo podemos hacer a través del parámetro logging y sus distintas opciones. 

version: '3'

services:
  portainer:
    image: portainer/portainer:1.24.1
    ports:
      - 9000:9000
      - 8000:8000
    command: --admin-password "$$2y$$12$$U5o8Pawz6T1rflKzFRzzyO3P9aDa.1Pm6M8xtHiUVhEIQurMkTilW"   
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data/portainer:/data
  busybox:
    image: busybox
    logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"
    command: ["sh","-c", "while true; do $$(echo date); sleep 0; done"]

  • Indicar la configuración en el fichero daemon.json
De esta forma la configuración para rotar los logs se aplicará a todos los contenedores y no solo a los específicos que se lo indiques. Para ello tenemos que modificar el fichero /etc/docker/daemon.json e indicar el siguiente contenido:

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

Como veis, es similar a las opciones que hemos puesto anteriormente y admite las mismas opciones. Pero en este caso deberemos reiniciar docker a través del siguiente comando:

systemctl reload docker

Por último, indicar que a través de la opción driver, se pueden indicar distintos destinos para los logs de docker. Algunos de estos pueden ser:
  • none: no almacena ningún tipo de log
  • syslog: envia los logs al demonio syslog
  • journald: envia los logs al demonio journald.
  • awslogs: envia los logs a Amazon CloudWatch Logs
Puedes ver más drivers, aquí

No hay comentarios:

Publicar un comentario