• ¡Obtenga la seguridad de la aplicación de la manera correcta! Detectar, proteger, monitorear, acelerar y más ...
  • Docker, una popular plataforma de virtualización a nivel de sistema operativo que nos permite entregar aplicaciones en paquetes conocidos como contenedores que, en términos simples, son entornos aislados con su propio software, bibliotecas y archivos de configuración.

    Como cualquier otro software moderno, el registro de eventos y mensajes como advertencias y errores es una parte inherente del Plataforma Docker, que le permite depurar sus aplicaciones y problemas de producción.

    Cubriremos algunas formas simples en las que puede administrar y monitorear los registros de sus contenedores. Entonces empecemos.

    Comando de registros de Docker

    La sintaxis básica para obtener registros de un contenedor es:

    $ docker logs [OPTIONS] <CONTAINER-NAME OR ID>

    OR

    $ docker container logs [OPTIONS] <CONTAINER-NAME OR ID>

    Ambas sintaxis son esencialmente las mismas, por lo que nos centraremos en el resto de los comandos de este artículo como docker logs.

    Aunque tenga en cuenta aquí que el comando anterior solo es funcional para contenedores que se inician con el json-file  or journald controlador de registro.

    Aquí OPTIONS se refiere a los indicadores compatibles disponibles con docker logs comando, que se enumeran a continuación:

    Nombre, taquigrafía Predeterminado Descripción
    --details Muestra detalles adicionales proporcionados a los registros.
    --follow-f Seguir la salida del registro
    --since Mostrar registros desde la marca de tiempo (por ejemplo, 2021-08-28T15: 23: 37Z) o relativa (por ejemplo, 56 m durante 56 minutos)
    --tail , -n all Número de líneas para mostrar desde el final de los registros
    --timestamps, -t Mostrar marcas de tiempo
    --until API 1.35+
    Mostrar registros antes de una marca de tiempo (por ejemplo, 2021-08-28T15: 23: 37Z) o relativa (por ejemplo, 56 m durante 56 minutos)

    Ejemplo:

    $ docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS        PORTS     NAMES
    28913415ed22   nginx     "/docker-entrypoint.…"   2 seconds ago   Up 1 second   80/tcp    gifted_edison
    $ docker logs 28913415ed22
    /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
    10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
    /docker-entrypoint.sh: Configuration complete; ready for start up
    2021/08/28 09:02:59 [notice] 1#1: using the "epoll" event method
    2021/08/28 09:02:59 [notice] 1#1: nginx/1.21.1
    2021/08/28 09:02:59 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6)
    2021/08/28 09:02:59 [notice] 1#1: OS: Linux 5.8.0-1039-azure
    2021/08/28 09:02:59 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
    2021/08/28 09:02:59 [notice] 1#1: start worker processes
    2021/08/28 09:02:59 [notice] 1#1: start worker process 31
    2021/08/28 09:02:59 [notice] 1#1: start worker process 32
    $

    Ubicación de los registros de Docker

    Docker, de forma predeterminada, captura la salida estándar (y el error estándar) de todos sus contenedores y los escribe en archivos usando el formato JSON. Esto se logra utilizando el controlador de registro de archivos JSON o json-archivo. Estos registros se almacenan de forma predeterminada en ubicaciones específicas del contenedor en /var/lib/docker sistema de archivos

    /var/lib/docker/containers/<container_id>/<container_id>-json.log

    Como ejemplo, para mi redis contenedor que se enumera a continuación, puedo comprobar su json logfile como se muestra en el fragmento a continuación:

    $ docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
    551c9273bbea   redis     "docker-entrypoint.s…"   19 minutes ago   Up 19 minutes   6379/tcp                                redis
    6cc871763df1   nginx     "/docker-entrypoint.…"   7 hours ago      Up 7 hours      0.0.0.0:8080->80/tcp, :::8080->80/tcp   nostalgic_wescoff
    $ sudo ls -l /var/lib/docker/containers/551c9273bbea6eaf66523ed735866b9ebe6924c3b504dfeb44bef90e69d59c73/551c9273bbea6eaf66523ed735866b9ebe6924c3b504dfeb44bef90e69d59c73-json.log
    -rw-r----- 1 root root 1437 Aug 28 16:53 /var/lib/docker/containers/551c9273bbea6eaf66523ed735866b9ebe6924c3b504dfeb44bef90e69d59c73/551c9273bbea6eaf66523ed735866b9ebe6924c3b504dfeb44bef90e69d59c73-json.log
    $ sudo tail -10 /var/lib/docker/containers/551c9273bbea6eaf66523ed735866b9ebe6924c3b504dfeb44bef90e69d59c73/551c9273bbea6eaf66523ed735866b9ebe6924c3b504dfeb44bef90e69d59c73-json.log
    {"log":"1:C 28 Aug 2021 16:53:42.160 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo\n","stream":"stdout","time":"2021-08-28T16:53:42.16031257Z"}
    {"log":"1:C 28 Aug 2021 16:53:42.160 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=1, just started\n","stream":"stdout","time":"2021-08-28T16:53:42.160337871Z"}
    {"log":"1:C 28 Aug 2021 16:53:42.160 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf\n","stream":"stdout","time":"2021-08-28T16:53:42.160342171Z"}
    {"log":"1:M 28 Aug 2021 16:53:42.160 * monotonic clock: POSIX clock_gettime\n","stream":"stdout","time":"2021-08-28T16:53:42.160792578Z"}
    {"log":"1:M 28 Aug 2021 16:53:42.161 * Running mode=standalone, port=6379.\n","stream":"stdout","time":"2021-08-28T16:53:42.161148683Z"}
    {"log":"1:M 28 Aug 2021 16:53:42.161 # Server initialized\n","stream":"stdout","time":"2021-08-28T16:53:42.161170984Z"}
    {"log":"1:M 28 Aug 2021 16:53:42.161 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.\n","stream":"stdout","time":"2021-08-28T16:53:42.161186984Z"}
    {"log":"1:M 28 Aug 2021 16:53:42.161 * Ready to accept connections\n","stream":"stdout","time":"2021-08-28T16:53:42.161484389Z"}
    $

    Mostrar detalles adicionales

    Para mostrar detalles adicionales proporcionados a los registros, use --details bandera.

    Ejemplo:

    $ docker logs 6cc871763df1 --details
     /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
     /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
     /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
     10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
     10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
     /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
     /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
     /docker-entrypoint.sh: Configuration complete; ready for start up
     2021/08/28 10:29:05 [notice] 1#1: using the "epoll" event method
     2021/08/28 10:29:05 [notice] 1#1: nginx/1.21.1
     2021/08/28 10:29:05 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6)
     2021/08/28 10:29:05 [notice] 1#1: OS: Linux 5.8.0-1039-azure
     2021/08/28 10:29:05 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
     2021/08/28 10:29:05 [notice] 1#1: start worker processes
     2021/08/28 10:29:05 [notice] 1#1: start worker process 33
     2021/08/28 10:29:05 [notice] 1#1: start worker process 34
     172.17.0.1 - - [28/Aug/2021:10:29:26 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
    $

    Seguir salida de registro

    Puedes usar --follow or -f marca para seguir la salida del registro. Esto le permite monitorear nuevas actualizaciones en el flujo de registro de forma continua STDOUT y STDERR.

    Ejemplo:

    $ docker logs 6cc871763df1 -f
    /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
    10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
    /docker-entrypoint.sh: Configuration complete; ready for start up
    2021/08/28 10:29:05 [notice] 1#1: using the "epoll" event method
    2021/08/28 10:29:05 [notice] 1#1: nginx/1.21.1
    2021/08/28 10:29:05 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6)
    2021/08/28 10:29:05 [notice] 1#1: OS: Linux 5.8.0-1039-azure
    2021/08/28 10:29:05 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
    2021/08/28 10:29:05 [notice] 1#1: start worker processes
    2021/08/28 10:29:05 [notice] 1#1: start worker process 33
    2021/08/28 10:29:05 [notice] 1#1: start worker process 34
    172.17.0.1 - - [28/Aug/2021:10:29:26 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"

    Registros de cola

    Los registros de contenedores se pueden seguir para limitar el número de resultados que se muestran en la pantalla con --tail or -n bandera. De forma predeterminada, esta bandera asume all como un argumento que muestra el flujo de registro completo. Para mostrar un número fijo de líneas desde el final de los registros, especifique un número entero positivo a continuación --tail or -n bandera.

    Ejemplo:

    $ docker logs 6cc871763df1 -n 10
    /docker-entrypoint.sh: Configuration complete; ready for start up
    2021/08/28 10:29:05 [notice] 1#1: using the "epoll" event method
    2021/08/28 10:29:05 [notice] 1#1: nginx/1.21.1
    2021/08/28 10:29:05 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6)
    2021/08/28 10:29:05 [notice] 1#1: OS: Linux 5.8.0-1039-azure
    2021/08/28 10:29:05 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
    2021/08/28 10:29:05 [notice] 1#1: start worker processes
    2021/08/28 10:29:05 [notice] 1#1: start worker process 33
    2021/08/28 10:29:05 [notice] 1#1: start worker process 34
    172.17.0.1 - - [28/Aug/2021:10:29:26 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
    $

    Mostrar registros desde

    Podemos limitar la salida del registro usando --since bandera y dando una marca de tiempo como un valor absoluto con sintaxis 2021-08-28T15:23:37Z o un pariente como 56m por 56 minutos.

    La --since La opción muestra solo los registros de contenedor generados después de una fecha determinada. Puede especificar la fecha como una fecha RFC 3339, una marca de tiempo UNIX o una cadena de duración Go (p. Ej. 1m30s3h). Se utilizará la zona horaria local del cliente si no proporciona un Z o +-00:00 Desplazamiento de zona horaria al final de la marca de tiempo. Puedes combinar el --since opción con una o ambas de las --follow or --tail opciones.

    Ejemplo:

    $ docker logs --since=1m nostalgic_wescoff
    172.17.0.1 - - [28/Aug/2021:15:19:24 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
    172.17.0.1 - - [28/Aug/2021:15:19:25 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
    $

    En el ejemplo anterior, se muestran registros desde solo 2 minutos donde nostalgic_wescoff es el nombre generado automáticamente asignado para el nginx recipiente.

    Mostrar registros hasta

    Como --since bandera, docker logs también apoyo --until bandera, que muestra los registros antes de la marca de tiempo dada. De manera similar, la marca de tiempo sigue una convención similar a la anterior y se puede especificar como un valor absoluto con sintaxis 2021-08-28T15:23:37Z o un pariente como 56m por 56 minutos.

    Ejemplo:

    $ docker logs --until=1h30m nostalgic_wescoff
    /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
    10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
    /docker-entrypoint.sh: Configuration complete; ready for start up
    2021/08/28 10:29:05 [notice] 1#1: using the "epoll" event method
    2021/08/28 10:29:05 [notice] 1#1: nginx/1.21.1
    2021/08/28 10:29:05 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6)
    2021/08/28 10:29:05 [notice] 1#1: OS: Linux 5.8.0-1039-azure
    2021/08/28 10:29:05 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
    2021/08/28 10:29:05 [notice] 1#1: start worker processes
    2021/08/28 10:29:05 [notice] 1#1: start worker process 33
    2021/08/28 10:29:05 [notice] 1#1: start worker process 34
    172.17.0.1 - - [28/Aug/2021:10:29:26 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
    $

    En el ejemplo anterior, se muestran todos los registros anteriores a 1 hora y 30 minutos.

    Mostrar marcas de tiempo

    Muchas aplicaciones de contenedor ofrecen marcas de tiempo integradas en su salida de registro, por lo que Docker también las muestra con docker logs mando. Si necesita que Docker prefija explícitamente sus marcas de tiempo en la salida, use --timestamps or -t bandera.

    Ejemplo:

    $ docker logs -t redis
    2021-08-28T16:53:42.160312570Z 1:C 28 Aug 2021 16:53:42.160 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    2021-08-28T16:53:42.160337871Z 1:C 28 Aug 2021 16:53:42.160 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=1, just started
    2021-08-28T16:53:42.160342171Z 1:C 28 Aug 2021 16:53:42.160 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
    2021-08-28T16:53:42.160792578Z 1:M 28 Aug 2021 16:53:42.160 * monotonic clock: POSIX clock_gettime
    2021-08-28T16:53:42.161148683Z 1:M 28 Aug 2021 16:53:42.161 * Running mode=standalone, port=6379.
    2021-08-28T16:53:42.161170984Z 1:M 28 Aug 2021 16:53:42.161 # Server initialized
    2021-08-28T16:53:42.161186984Z 1:M 28 Aug 2021 16:53:42.161 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
    2021-08-28T16:53:42.161484389Z 1:M 28 Aug 2021 16:53:42.161 * Ready to accept connections
    $

    Fusionar banderas

    Docker ofrece combinar ciertos indicadores para obtener una salida más filtrada en lugar de imprimir todo el contenido del registro en la pantalla. Como ejemplo simple, podemos combinar --tail bandera con --since para obtener una salida más restringida.

    Ejemplo:

    $ docker logs --since=2h -f nostalgic_wescoff
    172.17.0.1 - - [28/Aug/2021:15:19:24 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
    172.17.0.1 - - [28/Aug/2021:15:19:25 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"

    Esto también puede funcionar con otras banderas.

    Filtrar con utilidades de Shell

    Las utilidades de shell de Linux también se pueden utilizar para obtener más destreza en la salida del registro. Utilidades como grep, head, tail etc. se puede canalizar a docker logs salida para operaciones más avanzadas.

    Ejemplo:

    $ docker logs --since=7h nostalgic_wescoff 2>&1 | grep GET
    172.17.0.1 - - [28/Aug/2021:10:29:26 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
    172.17.0.1 - - [28/Aug/2021:15:19:24 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
    172.17.0.1 - - [28/Aug/2021:15:19:25 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
    $

    Tenga en cuenta aquí que necesitamos redirigir los flujos de registro para proporcionar una entrada de canalización única para grep usar 2>&1.

    Resumen 👩‍💻

    Docker es una plataforma versátil que ofrece numerosas funciones para administrar su entorno. La gestión de registros de un sistema es una de las habilidades esenciales que todo administrador de sistemas debe conocer. La administración de registros en Docker es fácil una vez que conoce el comando disponible y las posibles marcas según sus requisitos.

    Para obtener más información sobre Docker y sus funcionalidades, consulte Docker's documentación.