El conocimiento sobre el inicio de sesión con Docker puede ser muy útil para las actividades diarias de administración del sistema, ya sea para la resolución de problemas o la supervisión básica. Sin registros de seguimiento en Docker, mitigar los problemas sería mucho más difícil al investigar anomalías.
Este artículo explora información importante sobre esa área para facilitar la comprensión de cómo administrar los archivos de registro asociados a Docker en su sistema Linux.
Permítanme comenzar explorando las partes más básicas y profundizar gradualmente en algunos detalles.
Cómo ver los registros de Docker
Puede usar los docker logs
Comando para recuperar lo que esté pasando con el servicio dentro de un contenedor en ejecución.
La sintaxis es simple:
docker logs container_name_or_ID
Probablemente ya sepa que puede usar el docker ps
Comando para ver el nombre y la ID de los contenedores en ejecución.
Tomemos un ejemplo del mundo real. He implementado Nextcloud con Docker. El contenedor se llama nextcloud, como era de esperar.
Ahora, para ver los registros del contenedor llamado nextcloud
, usa:
docker logs nextcloud
Aquí hay una versión truncada de la salida del comando anterior:
172.18.0.2 - - [23/Jul/2021:19:36:09 +0000] "HEAD /.env HTTP/1.1" 302 1571 "-" "python-requests/2.26.0"
172.18.0.2 - - [23/Jul/2021:19:49:52 +0000] "HEAD /c99.php HTTP/1.1" 302 1565 "-" "python-requests/2.26.0"
172.18.0.2 - - [24/Jul/2021:16:25:23 +0000] "HEAD /backup.tar HTTP/1.1" 302 1571 "-" "python-requests/2.26.0"
172.18.0.2 - - [24/Jul/2021:16:25:24 +0000] "HEAD /backup.zip HTTP/1.1" 302 1569 "-" "python-requests/2.26.0"
172.18.0.2 - - [25/Jul/2021:20:36:01 +0000] "GET / HTTP/1.1" 302 1590 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36"
172.18.0.2 - - [25/Jul/2021:20:36:07 +0000] "GET /custom_apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1" 200 721 "-" "Nextcloud Server Crawler"
172.18.0.2 - - [25/Jul/2021:20:36:04 +0000] "GET /login HTTP/1.1" 200 7501 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36"
¿Demasiados registros? Lo bueno es que hay varias opciones que facilitan mucho la visualización de los registros de la ventana acoplable, al igual que los registros en Linux.
Registros de Tail Docker para ver solo cierto número de líneas
El comando de registros de Docker tiene --tail
atributo que se puede utilizar de forma similar al comando de cola.
Lo que significa que puede usarlo para mostrar solo una cierta cantidad de líneas de registros de Docker desde el final.
Por ejemplo, para ver las últimas 50 líneas de un contenedor, puede usar:
docker logs --tail 50 container_name_or_ID
También puede usar el comando anterior de esta manera
docker logs -n=50 container_name_or_ID
Visualización de registros de Docker en tiempo real en un contenedor activo
Puede ver totalmente los registros del contenedor en tiempo real. Para "seguir" los registros, utilice --follow
o el -f
atributo.
docker logs -f container_name_or_ID
Cuando ejecuta los registros de la ventana acoplable con la opción de seguimiento, notará que las nuevas líneas de registro se informarán desde el contenedor a medida que avanza el tiempo.
Para salir, simplemente puede usar Ctrl+C combinación de teclas y regrese al indicador de terminal.
La mayoría de las opciones en los docker logs
el subcomando se puede combinar para producir el resultado deseado.
Por ejemplo, docker logs -f
inundará la pantalla con todos los registros desde el principio. No querrías eso. Lo que puedes hacer es combinar ambos tail
y follow
opciones como esta:
docker logs -f --tail 20 container_name_or_ID
El comando anterior mostrará las últimas 20 líneas de los registros y luego seguirá los registros en tiempo real.
Al actualizar los contenedores de su aplicación con escala, el comando anterior puede ser muy útil antes de eliminar un contenedor anterior.
Ver la marca de tiempo en los registros de Docker
Si también desea ver la marca de tiempo de las entradas del registro, puede usar -t
opción.
docker logs -t container_name_or_ID
Esto se puede combinar fácilmente con otras opciones como --follow
y --tail
.
El siguiente comando mostrará las últimas 10 líneas del archivo de registro de un contenedor determinado con marcas de tiempo adjuntas a cada uno de ellos
docker logs -n=10 -t container_name_or_ID
Ver registros de Docker en un periodo de tiempo especificado
Cuando investiga un problema, el tiempo puede ser un factor crítico, en cuyo caso el --since
y --until
las banderas podrían resultar muy útiles.
Por ejemplo, si está investigando un problema que ocurrió en las últimas 24 horas, el siguiente comando mostrará los contenidos registrados de lo que sucedió solo durante ese tiempo:
docker logs --since 1440m -t container_name_or_ID
1440m
en el comando anterior denota 24×60 minutos. Agregando el -t
o el --timestamps
flag garantiza que las líneas notificadas se etiqueten con una marca de tiempo para que pueda comprender los incidentes o errores aún más fácilmente. Sugeriría agregarlo al consultar cualquier contenedor.
De manera similar, si necesita los detalles del registro después de las primeras 24 horas de iniciar la implementación, el comando equivalente sería:
docker logs --until 1440m -t nextcloud
Además de especificar el tiempo en minutos, los dos indicadores anteriores también se pueden usar con una marca de tiempo específica que -t
genera El formato es como 2021-07-28T06:20:00
.
docker logs --since 2021-07-28 -t container_name_or_ID
El comando anterior mostrará los registros desde el 28 de julio de 2021.
Para obtener una descripción general completa de los registros de Docker, también puede consultar su página de manual con man docker-logs.Acceder a los registros de Docker desde dentro del contenedor
En algunos casos de uso interesantes, es posible que desee optar por un enfoque híbrido, donde accede a los registros específicos de la aplicación desde dentro de los contenedores.
Para hacer eso, ingresa al contenedor Docker:
docker exec -it container_name_or_ID sh
Y luego puede usar las herramientas regulares de Linux para obtener registros relacionados con la aplicación. Un enfoque sería obtener el ID de proceso del servicio deseado mediante el comando ps:
ps aux
Obtén los detalles de este proceso:
cat /proc/PID_of_process/fd/1
Registros de servicio del sistema Docker
Si desea ver los registros del propio servicio Docker en el host, puede usar journalctl si está en Ubuntu 16.04 o posterior:
sudo journalctl -u docker
Cómo usar el comando journalctl para analizar registros en LinuxGuía para principiantes sobre el uso de los comandos journalctl para ver, filtrar y analizar registros diarios en Linux. Manual de LinuxAbhishek Prakash ¿Dónde se almacenan los registros de Docker?
Debería encontrar los registros de Docker en /var/lib/docker/containers directorio en el sistema host. Este directorio contiene los archivos de registro relacionados con todos los contenedores en sus directorios individuales. Puede identificar los directorios con el ID del contenedor.
Usé el docker ps
para encontrar que 70f19fde9076
es el ID del contenedor del contenedor Nextcloud.
Si miro en el directorio donde se almacenan los registros de la ventana acoplable:
[email protected]:~$ sudo ls -lh /var/lib/docker/containers
total 16K
drwx------ 4 root root 4.0K Jul 27 18:48 0efe12b28562c42619e533ad5f524d56740a7a3739d9e082c758bac95ae2a46f
drwx------ 4 root root 4.0K Jul 27 18:57 12c55f365f93ecb7f91e40bc130ddc2409216a61bbb244cd045a22b4513416d3
drwx------ 4 root root 4.0K Jul 27 18:58 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e
drwx------ 4 root root 4.0K Jul 27 18:57 a436399ef16a3efc0a909b9c3f725938e595e0b8fd34644b13f28b2c9bcb4ed7
Actualmente hay cuatro contenedores en ejecución, y puede ver que el tercero coincide con el que debemos buscar (comienza con 70f19fde9076
).
Si revisa el contenido de este directorio, puede ver que nuestro archivo de registro se encuentra justo allí.
[email protected]:~$ sudo ls -lh /var/lib/docker/containers/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e
total 192K
-rw-r----- 1 root root 150K Jul 27 18:58 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log
drwx------ 2 root root 4.0K Jul 19 17:10 checkpoints
-rw------- 1 root root 5.5K Jul 27 18:58 config.v2.json
-rw-r--r-- 1 root root 1.5K Jul 27 18:58 hostconfig.json
-rw-r--r-- 1 root root 13 Jul 27 18:58 hostname
-rw-r--r-- 1 root root 198 Jul 27 18:58 hosts
drwx------ 3 root root 4.0K Jul 19 17:10 mounts
-rw-r--r-- 1 root root 79 Jul 27 18:58 resolv.conf
-rw-r--r-- 1 root root 71 Jul 27 18:58 resolv.conf.hash
Por lo tanto, el archivo de registro correspondiente es 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log que es el mismo archivo que estabas leyendo cuando ejecuté los docker logs
mando al principio.
Permítanme verificar rápidamente que:
[email protected]:~$ sudo cat /var/lib/docker/containers/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log
{"log":"172.18.0.2 - - [23/Jul/2021:19:36:09 +0000] \"HEAD /.env HTTP/1.1\" 302 1571 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-23T19:36:09.837857567Z"}
{"log":"172.18.0.2 - - [23/Jul/2021:19:49:52 +0000] \"HEAD /c99.php HTTP/1.1\" 302 1565 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-23T19:49:52.996108799Z"}
{"log":"172.18.0.2 - - [24/Jul/2021:16:25:23 +0000] \"HEAD /backup.tar HTTP/1.1\" 302 1571 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-24T16:25:23.445225166Z"}
{"log":"172.18.0.2 - - [24/Jul/2021:16:25:24 +0000] \"HEAD /backup.zip HTTP/1.1\" 302 1569 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-24T16:25:24.772881041Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:01 +0000] \"GET / HTTP/1.1\" 302 1590 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36\"\n","stream":"stdout","time":"2021-07-25T20:36:03.678967877Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:07 +0000] \"GET /custom_apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1\" 200 721 \"-\" \"Nextcloud Server Crawler\"\n","stream":"stdout","time":"2021-07-25T20:36:07.404618408Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:04 +0000] \"GET /login HTTP/1.1\" 200 7501 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36\"\n","stream":"stdout","time":"2021-07-25T20:36:07.619020402Z"}
El contenido del registro es el mismo, pero dado que estoy leyendo el archivo de registro directamente desde el host, tiene mucha jerga en comparación con los docker logs
comando usado anteriormente.
Habilitar la rotación de registros para Docker (JSON)
De forma predeterminada, para el registro basado en archivos JSON, la rotación de registros en Docker está deshabilitada.
Esto puede plantear un problema con el espacio en disco si los archivos de registro aumentan de tamaño. Nuestra instancia de Ghost basada en Docker vio que sus archivos de registro alcanzaban un tamaño de 20 GB. Le gustaría evitar tal situación habilitando la rotación de registros.
Para habilitar la rotación de registros para Docker, edite el /etc/docker/daemon.json
archivo:
sudo nano /etc/docker/daemon.json
Agregue las siguientes líneas y guarde el archivo:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Reinicie el demonio de Docker:
sudo systemctl restart docker
La configuración anterior es, por supuesto, relevante para una instalación genérica de Docker, que tiene el registro JSON configurado como predeterminado. Así que tenga en cuenta que todos los demás mecanismos de registro (enumerados a continuación) tienen su propia forma de implementar la rotación.
Una palabra rápida sobre el registro de controladores
¿Notó "json" en el nombre del archivo de registro anterior? Esto se debe a que JSON File es el controlador de registro predeterminado en Docker.
Además de JSON, también hay muchos otros mecanismos de registro para elegir:
- Archivo local
- Logenterías
- Formato extendido Graylog (GELF)
- Registro del sistema
- Registros de Amazon Cloudwatch (AWS)
- Seguimiento de eventos en Windows (ETW)
- Fluido
- Registros de proyectos de Google Cloud (GCP)
- Diario
- Splunk
- Almacenamiento de registros
Para implementaciones a gran escala, GELF , AWS , PCG y Fluido se recomiendan ya que implementan un enfoque centralizado. Pero para pequeña escala, JSON hace el trabajo muy bien, mientras que Local , Registro del sistema y Diario también son bastante adecuados. Registro del sistema y Logstash son especialmente útiles si el análisis de registros complejos se convierte en un requisito. ETW es específico de Windows, mientras que Splunk se centra en el registro remoto.
A partir de Docker Engine 20.10, se introdujo una nueva característica llamada "doble registro" que garantiza la ejecución de los docker logs
así como realizar la rotación de registros independientemente del controlador de registro en vigor.
Resumen
En este artículo, comencé con los aspectos básicos de cómo ver los registros de cualquier contenedor Docker, tanto a nivel del contenedor como del sistema host. También le mostré cómo ubicar la ubicación física de los archivos de registro específicos del contenedor que residen en su sistema host. Le mostré brevemente cómo verificar los registros del servicio Docker en el propio host.
Más tarde, analicé el registro de controladores con enfoque en el mecanismo predeterminado y también destaqué la nueva función de registro dual.
Espero que estos consejos le ayuden en sus actividades diarias de seguimiento o aprendizaje. ¡Más pensamientos y sugerencias son más que bienvenidos! Compártalos en la sección de comentarios a continuación.