Docker
Depuración de un contenedor
Buscar..
Sintaxis
- docker stats [OPCIONES] [CONTENEDOR ...]
- troncos acoplables [OPCIONES] CONTENEDOR
- tapa acoplable [OPCIONES] CONTENEDOR [ps OPCIONES]
Entrando en un contenedor corriendo
Para ejecutar operaciones en un contenedor, use el comando docker exec
. A veces esto se denomina "entrar en el contenedor" ya que todos los comandos se ejecutan dentro del contenedor.
docker exec -it container_id bash
o
docker exec -it container_id /bin/sh
Y ahora tienes una cáscara en tu contenedor corriendo. Por ejemplo, liste los archivos en un directorio y luego deje el contenedor:
docker exec container_id ls -la
Puede usar la -u flag
para ingresar al contenedor con un usuario específico, por ejemplo, uid=1013
, gid=1023
.
docker exec -it -u 1013:1023 container_id ls -la
El uid y el gid no tienen que existir en el contenedor, pero el comando puede dar como resultado errores. Si desea iniciar un contenedor e ingresar inmediatamente dentro para verificar algo, puede hacer
docker run...; docker exec -it $(docker ps -lq) bash
el comando docker ps -lq
solo genera el ID del último contenedor (el l en -lq
) iniciado. (esto supone que tiene a bash como intérprete disponible en su contenedor, puede tener sh o zsh o cualquier otro)
Monitoreo del uso de recursos
La inspección del uso de los recursos del sistema es una forma eficiente de encontrar aplicaciones que se comportan mal. Este ejemplo es un equivalente del comando top
tradicional para contenedores:
docker stats
Para seguir las estadísticas de contenedores específicos, enumérelos en la línea de comando:
docker stats 7786807d8084 7786807d8085
Las estadísticas de Docker muestran la siguiente información:
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
7786807d8084 0.65% 1.33 GB / 3.95 GB 33.67% 142.2 MB / 57.79 MB 46.32 MB / 0 B
Por defecto, las docker stats
muestran la identificación de los contenedores, y esto no es muy útil, si prefiere mostrar los nombres del contenedor, simplemente haga
docker stats $(docker ps --format '{{.Names}}')
Seguimiento de procesos en un contenedor.
La inspección del uso de los recursos del sistema es una forma eficiente de reducir un problema en una aplicación en ejecución. Este ejemplo es un equivalente del comando ps
tradicional para contenedores.
docker top 7786807d8084
Para filtrar el formato de la salida, agregue las opciones ps
en la línea de comando:
docker top 7786807d8084 faux
O, para obtener la lista de procesos que se ejecutan como root, que es una práctica potencialmente dañina:
docker top 7786807d8084 -u root
El comando docker top
resulta especialmente útil cuando se resuelven contenedores minimalistas sin un shell o el comando ps
.
Adjuntar a un contenedor corriendo
'Conectarse a un contenedor' es el acto de iniciar una sesión de terminal dentro del contexto en el que se ejecuta el contenedor (y cualquier programa en él). Esto se usa principalmente para fines de depuración, pero también puede ser necesario si se deben pasar datos específicos a programas que se ejecutan dentro del contenedor.
El comando attach
se utiliza para hacer esto. Tiene esta sintaxis:
docker attach <container>
<container>
puede ser el ID del contenedor o el nombre del contenedor. Por ejemplo:
docker attach c8a9cf1a1fa8
O:
docker attach graceful_hopper
Es posible que necesite sudo
los comandos anteriores, dependiendo de su usuario y cómo cargador de muelle está configurado.
Nota: Adjuntar solo permite que una sola sesión de shell se adjunte a un contenedor a la vez.
Advertencia: todas las entradas del teclado se reenviarán al contenedor. Golpear Ctrl-c matará tu contenedor.
Para desprenderse de un contenedor adjunto, presione sucesivamente Ctrl-p y luego Ctrl-q
Para adjuntar varias sesiones de shell a un contenedor, o simplemente como alternativa, puede usar exec
. Usando la identificación del contenedor:
docker exec -i -t c8a9cf1a1fa8 /bin/bash
Usando el nombre del contenedor:
docker exec -i -t graceful_hopper /bin/bash
exec
ejecutará un programa dentro de un contenedor, en este caso /bin/bash
(un shell, probablemente uno que el contenedor tiene). -i
indica una sesión interactiva, mientras que -t
asigna un pseudo-TTY.
Nota: A diferencia de adjuntar , presionar Ctrl-c solo terminará el comando exec 'd cuando se ejecute de forma interactiva.
Imprimiendo los logs
Seguir los registros es la forma menos intrusiva de depurar una aplicación en ejecución en vivo. Este ejemplo reproduce el comportamiento de la tail -f some-application.log
tradicional tail -f some-application.log
en el contenedor 7786807d8084
.
docker logs --follow --tail 10 7786807d8084
Este comando básicamente muestra la salida estándar del proceso contenedor (el proceso con pid 1).
Si sus registros no incluyen la marca de tiempo de forma nativa, puede agregar la --timestamps
.
Es posible mirar los registros de un contenedor detenido, ya sea
iniciar el contenedor
docker run ... ; docker logs $(docker ps -lq)
con ladocker run ... ; docker logs $(docker ps -lq)
Encuentra la identificación del contenedor o el nombre con
docker ps -a
y entonces
docker logs container-id
o
docker logs containername
Como es posible mirar los registros de un contenedor detenido
Depuración del proceso de contenedor Docker
Docker es solo una forma elegante de ejecutar un proceso, no una máquina virtual. Por lo tanto, la depuración de un proceso "en un contenedor" también es posible "en el host" simplemente examinando el proceso contenedor en ejecución como un usuario con los permisos adecuados para inspeccionar esos procesos en el host (por ejemplo, root). Por ejemplo, es posible enumerar cada "proceso contenedor" en el host ejecutando un simple ps
como root:
sudo ps aux
Todos los contenedores Docker que se estén ejecutando actualmente se mostrarán en la salida.
Esto puede ser útil durante el desarrollo de la aplicación para depurar un proceso que se ejecuta en un contenedor. Como usuario con los permisos adecuados, se pueden usar utilidades de depuración típicas en el proceso de contenedor, como strace, ltrace, gdb, etc.