La depuración de la mayoría de los programas de Linux generalmente implica verificar los archivos de registro, lo que puede ser un proceso complejo. Sin embargo, cuando se ejecuta en un entorno en contenedores bajo Docker, deberá usar herramientas más específicas para depurar aplicaciones en producción.
¿Dónde se almacenan los registros?
La respuesta simple es que Docker almacena registros de contenedores en su ubicación de almacenamiento principal, /var/lib/docker/
. Cada contenedor tiene un registro específico para su ID (el ID completo, no el abreviado que suele mostrarse) y puede acceder a él así:
/var/lib/docker/containers/ID/ID-json.log
Ahí es dónde están almacenados, pero dado que están en formato JSON, no son fáciles de leer y tener que usar la identificación completa del contenedor es molesto. Docker proporciona un comando integrado para verlos:
docker logs -f e4bd48ef3103
Aquí, el -f
flag mantendrá el indicador abierto y "seguirá" cualquier nueva entrada en el archivo. También puede --tail
el archivo, o use --timestamps
para mostrar el tiempo de registro, o use --until
y --since
para filtrar según el tiempo.
Si está usando Docker Compose, puede usar el comando de registro para ver todos los registros fácilmente:
docker-compose logs
Sin embargo, una cosa que notará es que esto es STDOUT y STDERR, que es útil para muchas cosas, pero solo le muestra la salida de la consola del punto de entrada especificado por "CMD" en el archivo Docker. Muchas aplicaciones tienen sus propios sistemas de registro dedicados, que a menudo registran archivos como /var/log/nginx/access.log
. Todavía es posible acceder a registros como este desde el lado del host a través de Docker.
Ver registros de aplicaciones dentro de contenedores
Dependiendo del contenedor, esto podría no ser necesario. Por ejemplo, el contenedor NGINX predeterminado está configurado para enviar sus registros de Docker a STDOUT para facilitar la verificación de registros. Lo hace con un enlace simbólico de /dev/stdout
al archivo de registro y puede configurar algo similar para sus contenedores.
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
Pero, si desea consultar archivos específicos dentro de un contenedor, puede hacerlo. Docker proporciona el exec -it
para permitirle ejecutar cualquier comando dentro de cualquier proceso de Docker en ejecución. Con esto, puede rastrear un archivo de registro dentro de un contenedor Docker:
docker exec -it e4bd48ef3103 tail -f log.txt
Debido a que esto le permite ejecutar cualquier comando, puede usar journalctl
o cualquier otra estrategia de depuración que desee, siempre que la anteceda con docker exec -it
. Incluso puede ejecutar /bin/bash
si quieres entrar y husmear.
Una solución más permanente que funciona mejor con los servicios de host es usar un montaje de volumen de Docker. Puede enlazar un directorio como /var/log/nginx
a un volumen visible desde el host. Primero, cree un nuevo volumen:
docker volume create nginx-logs
Y ejecute el contenedor con --mount
:
docker run -d --name devtest --mount source=nginx-logs,target=/var/log/nginx nginx:latest
Si usa Docker Compose, el proceso se puede automatizar:
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - nginx-logs:/var/log/nginx/ volumes: nginx-logs:
De esta manera, cualquier servicio de agregación de registros en la máquina host podrá incorporar directamente los archivos de registro.
Visualización de registros del demonio Docker
Si, en cambio, desea ver los registros específicos del servicio Docker general en su servidor, y no cualquier aplicación en contenedor específica, querrá ver el journalctl
registros:
sudo journalctl -fu docker.service
Aquí es donde se almacena en la mayoría de los sistemas, pero en algunos está en un lugar diferente:
- Amazon Linux:
/var/log/docker
- CentOS/RHEL:
/var/log/messages | grep docker
- macOS:
~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
- Windows:
AppDataRoamingDockerlogvmdockerd.log