Logs, monitorización y mantenimiento
1. Introducción #
Cuando trabajamos con contenedores no basta con saber arrancarlos y detenerlos.
También necesitamos poder responder preguntas como:
1¿Está funcionando correctamente? 2¿Por qué se ha detenido? 3¿Qué mensajes está mostrando? 4¿Cuánta memoria consume? 5¿Cuánta CPU utiliza? 6¿Qué procesos están ejecutándose? 7¿Cuánto espacio ocupa Docker?
Docker dispone de varios comandos para estas tareas:
1docker logs 2docker stats 3docker top 4docker inspect 5docker events 6docker system df 7docker system prune
2. Consultar los logs: docker logs #
Los contenedores pueden escribir mensajes en su salida estándar.
Docker permite consultar esos mensajes mediante:
1docker logs <contenedor>
Por ejemplo:
1docker logs mi-nginx
o:
1docker logs mysql
Los logs son especialmente útiles cuando un servicio:
- No arranca.
- Se detiene inesperadamente.
- Muestra errores.
- Tiene problemas de configuración.
- Recibe peticiones.
3. Ejemplo con Nginx #
Creamos:
1docker run -dp 8080:80 --name servidor-web nginx
Accedemos desde el navegador:
1http://localhost:8080
Después consultamos:
1docker logs servidor-web
Podremos encontrar información relacionada con las peticiones recibidas por Nginx.
4. Ejemplo con MySQL #
Creamos:
1docker run -d \ 2 --name mysql \ 3 -e MYSQL_ROOT_PASSWORD=Ad1234 \ 4 mysql
Después:
1docker logs mysql
Los logs permiten comprobar el proceso de inicialización del servidor.
Esto es especialmente útil porque algunos servicios necesitan unos segundos antes de estar preparados para aceptar conexiones.
5. Seguir los logs en tiempo real #
Podemos utilizar:
1docker logs -f <contenedor>
Por ejemplo:
1docker logs -f servidor-web
La opción:
1-f
significa:
1follow
La terminal queda mostrando nuevos mensajes a medida que aparecen.
6. Probar docker logs -f #
Ejecuta:
1docker logs -f servidor-web
Después abre varias veces:
1http://localhost:8080
Podrás observar nuevas entradas en los logs.
Para dejar de seguirlos:
1Ctrl + C
Esto no detiene el contenedor.
Solamente dejamos de visualizar los logs.
7. Mostrar las últimas líneas #
Si un contenedor tiene muchos logs, puede resultar incómodo mostrarlos todos.
Podemos utilizar:
1docker logs --tail 10 <contenedor>
Por ejemplo:
1docker logs --tail 10 servidor-web
Mostrará únicamente las últimas diez líneas.
8. Combinar --tail y -f #
Podemos comenzar mostrando las últimas líneas y continuar observando nuevos mensajes:
1docker logs --tail 20 -f servidor-web
Esto resulta especialmente útil en servidores.
9. Añadir fechas y horas #
También podemos mostrar timestamps:
1docker logs -t <contenedor>
Por ejemplo:
1docker logs -t servidor-web
Esto facilita saber cuándo se produjo un determinado mensaje.
10. docker logs: resumen #
1docker logs servidor-web
Muestra los logs.
1docker logs -f servidor-web
Los sigue en tiempo real.
1docker logs --tail 20 servidor-web
Muestra las últimas 20 líneas.
1docker logs -t servidor-web
Añade información temporal.
11. Ver consumo de recursos: docker stats #
Docker permite consultar el consumo de recursos mediante:
1docker stats
Podremos ver información como:
1CONTAINER ID 2NAME 3CPU % 4MEM USAGE 5MEM % 6NET I/O 7BLOCK I/O 8PIDS
12. Ejemplo #
Tenemos varios contenedores:
1docker ps
Después:
1docker stats
Podríamos ver algo similar:
1NAME CPU % MEM USAGE / LIMIT 2servidor-web 0.01% 8MiB / 8GiB 3mysql 0.35% 350MiB / 8GiB
Los valores cambian continuamente.
13. CPU % #
Indica aproximadamente cuánto procesador está utilizando el contenedor.
Por ejemplo:
1CPU % 20.50%
Un servidor que recibe mucha carga podría aumentar su utilización de CPU.
14. MEM USAGE #
Muestra la memoria RAM utilizada.
Por ejemplo:
1350 MiB / 8 GiB
Podemos interpretarlo como:
1Contenedor: 2350 MiB 3 4Límite disponible: 58 GiB
15. NET I/O #
Muestra información relacionada con la red:
1datos recibidos 2/ 3datos enviados
Por ejemplo:
11.5MB / 800kB
Puede ser útil para observar el tráfico de un servicio.
16. BLOCK I/O #
Indica aproximadamente la actividad de entrada/salida relacionada con almacenamiento.
Nos ayuda a identificar contenedores que realizan muchas operaciones sobre disco.
17. PIDS #
Indica el número de procesos o tareas que ejecuta el contenedor.
Por ejemplo:
1PIDS 212
18. Ver un único contenedor #
Podemos ejecutar:
1docker stats mysql
Así solamente veremos:
1mysql
También podemos indicar varios:
1docker stats mysql servidor-web
19. Obtener una única lectura #
Normalmente:
1docker stats
se actualiza continuamente.
Podemos utilizar:
1docker stats --no-stream
para obtener una única lectura.
Por ejemplo:
1docker stats --no-stream mysql
20. Ver procesos: docker top #
Docker permite observar qué procesos están ejecutándose dentro de un contenedor.
Utilizamos:
1docker top <contenedor>
Por ejemplo:
1docker top servidor-web
Podemos ver el proceso principal de Nginx y sus procesos asociados.
21. Ejemplo con MySQL #
Ejecutamos:
1docker top mysql
La salida puede mostrar información como:
1UID 2PID 3PPID 4CMD
Esto resulta útil para comprobar qué procesos están realmente ejecutándose dentro del contenedor.
22. docker top frente a docker exec #
No debemos confundir:
1docker top mysql
con:
1docker exec -it mysql bash
docker top:
1consulta los procesos
docker exec:
1ejecuta un nuevo comando dentro del contenedor
23. Información detallada: docker inspect #
Ya vimos:
1docker inspect
en bloques anteriores.
Es uno de los comandos más útiles para diagnosticar contenedores.
Por ejemplo:
1docker inspect mysql
permite consultar:
- Estado.
- Imagen utilizada.
- Variables de entorno.
- Redes.
- Puertos.
- Volúmenes.
- Dirección IP.
- Configuración.
24. Consultar el estado #
Podemos utilizar:
1docker inspect mysql
y buscar:
1State
Dentro podremos encontrar información relacionada con:
1Running 2Status 3StartedAt 4FinishedAt 5ExitCode
25. ExitCode #
Cuando un contenedor termina, Docker guarda un código de salida.
Por ejemplo:
1ExitCode: 0
normalmente indica que el proceso terminó correctamente.
Un código distinto de cero suele indicar que el proceso terminó debido a algún problema o condición de error.
Los logs pueden ayudarnos a conocer la causa.
26. Ejemplo de diagnóstico #
Tenemos un contenedor que no aparece con:
1docker ps
Ejecutamos:
1docker ps -a
Descubrimos:
1STATUS 2Exited
Podemos consultar:
1docker inspect mi-contenedor
Y después:
1docker logs mi-contenedor
Una secuencia habitual para diagnosticar problemas sería:
1docker ps -a 2 ↓ 3docker inspect 4 ↓ 5docker logs
27. Eventos de Docker #
Docker genera eventos continuamente.
Podemos observarlos mediante:
1docker events
La terminal quedará esperando eventos.
28. Probar docker events #
Abre una terminal:
1docker events
En otra terminal ejecuta:
1docker run hello-world
Podremos observar diferentes eventos asociados a:
1create 2start 3die 4destroy
dependiendo de las operaciones realizadas.
29. Otro ejemplo #
Mientras:
1docker events
está funcionando, ejecuta:
1docker start servidor-web
Después:
1docker stop servidor-web
Podrás ver los eventos generados.
30. ¿Para qué sirve docker events? #
Puede resultar útil para:
- Diagnosticar comportamientos.
- Saber cuándo arrancó un contenedor.
- Saber cuándo se detuvo.
- Observar creación y eliminación.
- Monitorizar la actividad del motor Docker.
31. Espacio utilizado por Docker #
Con el tiempo podemos acumular:
- Imágenes.
- Contenedores.
- Volúmenes.
- Caché de construcción.
Docker permite consultar el espacio utilizado mediante:
1docker system df
32. Ejemplo #
Ejecutamos:
1docker system df
Podemos obtener información relacionada con:
1TYPE 2Images 3Containers 4Local Volumes 5Build Cache
También muestra:
1TOTAL 2ACTIVE 3SIZE 4RECLAIMABLE
33. RECLAIMABLE #
El apartado:
1RECLAIMABLE
indica espacio que potencialmente puede recuperarse.
Por ejemplo, podemos tener imágenes que ya no utiliza ningún contenedor.
34. Información más detallada #
Podemos utilizar:
1docker system df -v
La opción:
1-v
muestra información más detallada.
35. El problema de acumular recursos #
Durante las prácticas podemos hacer muchas veces:
1docker run hello-world
Cada ejecución crea un contenedor nuevo.
Después:
1docker ps -a
podría mostrar muchos contenedores detenidos.
También podemos acumular numerosas imágenes:
1docker images
Y volúmenes:
1docker volume ls
Por eso conviene aprender a realizar limpieza.
36. Eliminar un contenedor concreto #
Ya conocemos:
1docker rm <contenedor>
Por ejemplo:
1docker rm miDebian
Si está ejecutándose:
1docker stop miDebian 2docker rm miDebian
37. Eliminar automáticamente al terminar: --rm #
Cuando creamos un contenedor temporal podemos utilizar:
1--rm
Por ejemplo:
1docker run --rm hello-world
Cuando el contenedor termina, Docker lo elimina automáticamente.
Esto evita acumular contenedores innecesarios.
38. Ejemplo con Debian #
Podemos utilizar un contenedor temporal:
1docker run --rm -it debian bash
Trabajamos:
1ls
Después:
1exit
El contenedor se elimina automáticamente.
Si ejecutamos:
1docker ps -a
no aparecerá ese contenedor.
39. ¿Cuándo utilizar --rm? #
Resulta especialmente útil para:
- Pruebas rápidas.
- Ejecutar comandos puntuales.
- Contenedores temporales.
- Ejercicios donde no necesitamos conservar el contenedor.
40. Eliminar contenedores detenidos #
Docker permite eliminar contenedores que ya no están ejecutándose mediante:
1docker container prune
Docker solicitará confirmación.
Debemos revisar siempre lo que vamos a eliminar.
41. Eliminar imágenes no utilizadas #
Podemos utilizar:
1docker image prune
Esto permite limpiar determinadas imágenes no utilizadas.
Una opción más amplia es:
1docker image prune -a
Esta opción puede eliminar imágenes que no estén utilizadas por ningún contenedor.
Debe utilizarse con cuidado.
42. Eliminar volúmenes no utilizados #
Podemos utilizar:
1docker volume prune
Esto elimina volúmenes que Docker considera no utilizados.
Hay que tener especial cuidado porque los volúmenes pueden contener:
1bases de datos 2archivos 3información persistente
No debemos realizar limpiezas de volúmenes sin comprobar previamente su contenido y utilidad.
43. Eliminar redes no utilizadas #
Podemos utilizar:
1docker network prune
Elimina determinadas redes que ya no estén siendo utilizadas.
44. Limpieza general: docker system prune #
Docker dispone de:
1docker system prune
Este comando permite realizar una limpieza general de recursos no utilizados.
Puede afectar a:
- Contenedores detenidos.
- Redes no utilizadas.
- Determinadas imágenes.
- Caché de construcción.
Antes de ejecutarlo debemos leer atentamente el mensaje que muestra Docker.
45. docker system prune -a #
Existe una opción más agresiva:
1docker system prune -a
Puede eliminar más imágenes no utilizadas.
No debe utilizarse de forma automática sin comprobar previamente qué recursos necesitamos conservar.
46. Importante con los volúmenes #
No debemos pensar que una limpieza general significa siempre:
1eliminar absolutamente todo
Los volúmenes reciben un tratamiento especialmente importante debido a que pueden contener información persistente.
Antes de eliminar un volumen:
1docker volume inspect <volumen>
y:
1docker volume ls
deben ayudarnos a confirmar qué estamos borrando.
47. Ejercicio: acumulación de contenedores #
Ejecuta cinco veces:
1docker run hello-world
Después:
1docker ps
Probablemente no veremos ninguno activo.
Pero:
1docker ps -a
mostrará los cinco contenedores creados.
Esto demuestra que:
1docker run
crea un nuevo contenedor cada vez.
48. Repetir con --rm #
Ahora ejecuta cinco veces:
1docker run --rm hello-world
Después:
1docker ps -a
Estos contenedores temporales no deberían haberse acumulado.
49. Práctica guiada de monitorización #
Paso 1 #
Crea Nginx:
1docker run -dp 8080:80 --name monitor-web nginx
Paso 2 #
Comprueba:
1docker ps
Paso 3 #
Consulta:
1docker logs monitor-web
Paso 4 #
Abre:
1http://localhost:8080
varias veces.
Paso 5 #
Consulta nuevamente:
1docker logs monitor-web
50. Seguir los logs #
Ejecuta:
1docker logs -f monitor-web
Mientras tanto, accede varias veces desde el navegador.
Después:
1Ctrl + C
Recuerda:
1Ctrl + C
en este caso deja de seguir los logs.
No detiene Nginx.
51. Consultar recursos #
Ejecuta:
1docker stats monitor-web
Observa:
1CPU 2Memoria 3Red 4Procesos
Termina la visualización mediante:
1Ctrl + C
52. Consultar procesos #
Ejecuta:
1docker top monitor-web
Identifica los procesos asociados a Nginx.
53. Inspeccionar #
Ejecuta:
1docker inspect monitor-web
Localiza información relacionada con:
1State 2NetworkSettings 3Mounts 4Config
54. Consultar espacio #
Ejecuta:
1docker system df
Anota:
- Número de imágenes.
- Número de contenedores.
- Volúmenes.
- Espacio ocupado.
55. Ejercicio de diagnóstico #
Un alumno ejecuta:
1docker run --name prueba debian
Después:
1docker ps
y no encuentra el contenedor.
¿Qué debería comprobar?
Primero:
1docker ps -a
Después puede consultar:
1docker inspect prueba
El contenedor probablemente terminó porque no había ningún proceso de larga duración manteniéndolo activo.
56. Ejercicio con un error #
Podemos crear:
1docker run --name error-practica debian comando-que-no-existe
Después:
1docker ps -a
Consulta:
1docker logs error-practica
Y:
1docker inspect error-practica
Busca información sobre su:
1ExitCode
57. Estrategia básica ante un problema #
Cuando un contenedor no funciona, podemos seguir este orden:
11. ¿Existe? 2 ↓ 3docker ps -a 4 5 62. ¿Qué estado tiene? 7 ↓ 8docker inspect 9 10 113. ¿Qué mensajes produjo? 12 ↓ 13docker logs 14 15 164. ¿Qué recursos utiliza? 17 ↓ 18docker stats 19 20 215. ¿Qué procesos ejecuta? 22 ↓ 23docker top
58. Comandos de mantenimiento #
Podemos dividirlos en varias categorías.
Contenedores #
1docker container prune
Imágenes #
1docker image prune
Volúmenes #
1docker volume prune
Redes #
1docker network prune
Limpieza general #
1docker system prune
59. Precaución #
Los comandos:
1prune
eliminan recursos.
Por tanto debemos:
- Comprobar previamente los recursos.
- Leer el mensaje de Docker.
- Confirmar que los datos no son necesarios.
- Prestar especial atención a volúmenes y bases de datos.
No debemos utilizar comandos de limpieza indiscriminadamente en servidores de producción.
60. Práctica final #
Crea:
1docker run -dp 8085:80 --name practica-monitor nginx
Realiza:
docker psdocker logs practica-monitor- Accede desde el navegador.
docker logs -f practica-monitordocker stats practica-monitordocker top practica-monitordocker inspect practica-monitordocker system df- Detén el contenedor.
- Comprueba su estado.
- Elimínalo.
- Vuelve a consultar el espacio utilizado por Docker.