Tutoriales, noticias y soluciones informáticas

PiServer con Docker – Parte 4: Gestión de imágenes, contenedores, volúmenes y logs de Docker

En el pequeño reguero de artículos que hemos hecho sobre Docker en Raspberry Pi, hemos aprendido primero a instalar el último sistema operativo en el dispositivo, luego hemos aprendido qué es un Docker y cómo instalarlo y por último hemos instalado nuestro primer Docker en el dispositivo (Pi-hole).

Ya, ya, si todo muy bien, pero resulta que mi gato hoy estuvo paseándose por el teclado. No sé qué pasó, pero el docker ahora no me está funcionando bien. Voy a reinstalar todo para...

¡Espera! Cuando tienes problemas con Docker, antes de optar por soluciones extremas, primero hay que intentar saber qué es lo que está pasando. En este artículo vamos a pararnos para ver algunos comandos útiles cuando tenemos una instalacion de Docker entre las manos. Docker no sólo es instalar un Docker y ya está. Si queremos aprender a manejarlo con soltura y a resolver incidencias con él, todo lo que veamos en éste artículo nos va a resultar muy útil.

Tened claro que en este artículo no vamos a hacer instalaciones de ningún Docker a mayores en nuestro equipo. Es un artículo meramente informativo y orientado a ampliar y asentar los conocimientos que estamos adquiriendo acerca de este sistema.

Comandos para manejar imágenes.

Como ya os dije en el segundo artículo, una imagen es algo similar a un paquete de instalación de un programa. Tiene todo lo que necesita el software que vamos a instalar para que funcione correctamente (sistema operativo, bibliotecas y código del programa), pero no se está ejecutando continuamente, sino que la imagen sólo se usa en el momento de la instalación para crear lo que luego llamaremos el contenedor.

Hay algunos comandos útiles para gestionar estas imágenes. Veámoslos.

sudo docker image ls

Este comando me da una lista de las imágenes que tengo en mi dispositivo junto con varios datos (ID, tamaño de las mismas, versión, etc…)

Espera... pero a mi sólo me sale la imagen del pi-hole. ¿Por qué te salen todas esas imágenes a ti?

Porque yo llevo los tutoriales más avanzados que tú. Hago múltiples pruebas para crearlos y ahora mismo tengo todos esos dockers instalados en mi raspberry a la vez. No te precupes, que en esta cadena de tutoriales instalaremos muchas cosas. Lo importante de momento es asentar conocimientos para que sepáis resolver incidencias por vosotros mismos.

Otra cosa que os puede interesar es eliminar una imagen en concreto.

¿Por qué? ¿Para que me podría interesar eliminar una imagen?

Imagínate que has probando un docker y resulta que no hace lo que querías. O directamente no te funciona. O simplemente le has dado una utilidad pero ahora ya no necesitas usarlo más. Estaría bien parar y eliminar el contenedor, pero lo normal sería borrar también la imagen para que no ocupara espacio tontamente. El comando que os voy a dar, elimina todas las imágenes que no están siendo utilizadas en ningún contenedor en ejecución. Para hacerlo sólo tienes que ejecutar este comando.

sudo docker image prune
Vaya... por lo que veo este comando es peligroso. 

No tiene por qué serlo. Estás eliminando una imagen de algo que está detenido. Siempre que sepas lo que haces, no debería haber problema. Otro comando interesante es uno que borra todas las imágenes, independientemente de si están asociadas a un contenedor en ejecución o no. Podría ser útil si tienes un problema serio de espacio en disco, pero podríamos eliminar imágenes que queremos conservar. Ten algo en cuenta: si reinicias la Raspberry o detienes y vuelves a iniciar los contenedores después de ejecutar este último comando, Docker intentará descargar automáticamente las imágenes necesarias para los contenedores activos si no están disponibles localmente, así que no habrás conseguido gran cosa.

Otra cosa que podemos querer es eliminar una imagen en concreto. Podemos hacerlo con este comando.

sudo docker image rm <nombre_o_ID_de_la_imagen>

Fíjate que en este comando tanto podemos poner el nombre como el ID de la imagen. Ambos los podemos saber con el primer comando que hemos visto (con sudo docker image ls) y si hay algún problema puedo forzar la eliminación con el parámetro -f (esa «f» es de «force»).

Comandos para manejar contenedores.

Recordad: Un contenedor es una instancia en ejecución de una imagen. Para mi estos comandos son ya mucho más importantes porque manejan directamente lo que tenemos «encendido» y ejecutándose en la Raspberry. El primero y que no deberíais olvidar por nada del mundo nos dirá los contenedores que están en ejecución en este momento. Es éste

sudo docker ps

Ese «PS» significa «process status». El comando nos mostrará algo similar a esto:

Como veis, nos indica el estado en el que está cada contenedor y con él podemos detectar rápidamente problemas en alguno de ellos.

¡Esos contenedores no son los mismos que los que hay en las imágenes que pusiste arriba! ¿Nos quieres volver locos?

No. Sólo quiero mostrar cosas diferentes. Como véis, este comando nos dice un montón de información acerca de los Dockers que tenemos activos, como los puertos que está usando cada uno, desde hace cuánto tiempo están levantados o el nombre de cada uno de los contenedores. Fijaos también que puede que veáis en el nombre de los contenedores varios con un nombre similar (en este caso, veréis que el de Vikunja tiene varias líneas, al igual que el de WikiJS. ¿Por qué? Pues porque el mismo docker puede usar dos procesos completamente diferentes. En la imagen, veréis que en ambos casos, hay un proceso con una página web y otro proceso con una base de datos (en un caso es una base de datos MaríaDB y en el otro es Postgres). Y por supuesto con un vistazo rápido podemos saber si el Docker que nos interesa está caído o funcionando. En este caso todos los dockers llevan 16 horas levantados y funcionando.

Otro comando muy similar pero que nos da información diferente es éste:

sudo docker ps --all                                               

Es como el anterior pero añadimos el «–all». Este comando nos mostrará información tanto de los dockers que tenemos activos como los que tenemos en el sistema pero no se están ejecutando actualmente.

Como veis, en este caso, los contenedores de «Traefik» llevan 2 meses parados sin usar.

En todo caso como tengamos muchos Dockers a la vez puede que tengamos demasiada información en pantalla. Si sólo queremos ver que puertos usa un contenedor, podemos emplear el siguiente comando:

sudo docker container port <nombre o id del contenedor>

Algo sumamente útil es mostrar las estadísticas de los contenedores en tiempo real. Puede que alguno nos esté consumiendo muchos recursos del ordenador, así que revisarlas puede ser útil. Se hace con este comando.

sudo docker container stats

y nos debería mostrar algo como ésto.

Para los interesados en ponerle más Dockers a una Raspberry seguro que esa imagen os tranquiliza. Son un montón de dockers instalados a la vez en una Raspberry Pi 4. Fijaos que el uso de la CPU es mínimo, al igual que el porcentaje de memoria usada.

Algo también muy útil es pausar contenedores durante un tiempo. Podemos hacerlo así.

sudo docker container pause <nombre_o_id_contenedor>

Podemos salir de ese estado pausado con este otro comando.

sudo docker container unpause <nombre_o_id_contenedor>

¿Y cómo paro completamente un contenedor? Pues con este comando.

sudo docker stop <id del contenedor>

Esto detendrá un contenedor sin parar el resto de contenedores que tengamos corriendo en nuestra máquina.

Si por cualquier motivo, quiero eliminar un contenedor que ya haya desplegado en en la máquina, podría hacerlo con este otro comando.

sudo docker rm <id del contenedor>

Estos últimos comandos que os voy a poner son ya para un uso más avanzando de los contenedores, por lo que es raro que tengáis que acudir a ellos. Simplemente os lo dejo para documentarlos por si os hacen falta. El primero nos permite ejecutar un comando dentro de un contenedor específico.

sudo docker container exec -it <nombre_o_id_contenedor> <comando>

Dentro de un contenedor específico también podéis listar los procesos en ejecución para detectar posibles problemas. Se hace con éste comando

sudo docker container top <nombre_o_id_contenedor>

E incluso podéis cambiarle el nombre a un contenedor a vuestro gusto con este otro comando.

sudo docker container rename <nombre_o_id_actual> <nuevo_nombre>

Comandos para el manejo de volúmenes

Recordad que un volumen es un mecanismo para persistir y compartir datos entre los contenedores y nuestra Raspberry. A lo mejor podemos tener también alguna incidencia con algún volumen. Conocer estos comandos os puede ayudar a encontrar la solución.

Como en las otras secciones comencemos con un comando para listar lo que tenemos. Este comando nos muestra qué volúmenes estamos usando en nuestro sistema:

sudo docker volume ls

Si necesitamos eliminar un volumen en concreto, tenemos este comando.

sudo docker volume rm

También podemos hacer un listado de volúmenes sin usar con este comando…

sudo docker volume ls -f dangling=true

…y podemos eliminar los volúmenes que no estoy usando con este otro comando.

sudo docker volume prune

Comandos para el manejo de Logs.

En el artículo quise seguir el esquema que estamos siguiendo en este tutorial. Siempre hablamos primero de imágenes, luego de contenedores y por último de volúmenes. Sin embargo hay algo que es fundamental en este artículo y es la gestión de los logs. Un log es un registro de un evento que ha sido generado por el sistema operativo o una aplicación en funcionamiento. Si algo no funciona bien, el poder revisar un log es fundamental, porque nos va a poder decir un montón de cosas (nos puede anunciar errores, eventos, advertencias del sistema, etc…).

Normalmente cuando nos falla un contenedor, ese fallo está reflejado en los logs del propio contenedor. Podemos verlos así.

sudo docker logs <nombre_o_id_contenedor>
Espera... Me han salido pantallas y pantallas de... cosas. ¿Tengo que leerme todo esto?

Normalmente no. Los errores suelen estar al final de ese listado (a veces nos llega con ver el final de los logs para ver algún error). Podemos ver sólo el final añadiendo una cosita al final del comando:

sudo docker logs <nombre_o_id_contenedor> | tail

También podemos hacer otro pequeño añadido para ver la hora a la que se produjo cada uno de los eventos que nos muestra el log. Esto es algo muy útil si sabemos que el error se produjo a una hora determinada. El comando nos quedaría tal que así.

sudo docker logs <nombre_o_id_contenedor> --timestamps | tail

Podemos volver a modificar el mismo comando para que nos muestre exactamente las últimas 100 líneas del log de ese contenedor con este comando.

sudo docker logs <nombre_o_id_contenedor> --timestamps --tail 100

Otra cosa muy útil es ver los logs del contenedor en tiempo real según se van generando. Así podemos ir monitorizando los eventos que ocurren en el contenedor mientras le hacemos pruebas por otro lado (por ejemplo, mientras lo estamos usando desde otro ordenador). El comando es el siguiente:

sudo docker logs <nombre_o_id_contenedor> -f

Otra opción para monitorizar posibles fallos: ver los logs que se generaron a partir de un determinado momento. Simplemente determinamos el día y la hora y estaremos viendo los logs que han ocurrido después de ese momento. Lo podemos ver así.

sudo docker logs <nombre_o_id_contenedor> --since "1985-10-26T09:00:00"
¡Madre mía! ¡1985! ¿Pero tú desde hace cuánto tiempo que usas Docker? Eres de la vieja escuela. 

Evidentemente, no me seas cazurro y en este último comando acuérdate de cambiar la fecha y la hora a partir de la cual quieres monitorizar los eventos.

Como estamos usando Docker Compose para orquestar nuestros contenedores, también podemos usar este otro comando desde la carpeta dónde está el archivo docker-compose.yml para mostrar los logs de todos los servicios definidos por ese archivo.

sudo docker-compose logs

Pero ojo: asegúrate de ejecutarlo siempre desde la carpeta donde está el docker-compose.yml, porque si no no nos va a funcionar.

Hay muchos más comandos para poder gestionar todo lo relativo a los Dockers, pero yo creo que con estos podremos resolver la mayoría de las incidencias que se nos puedan presentar.

Y sí: Soy muy consciente de que este artículo ha podido ser un tostón para algunos, pero recordad que se trata de asentar conocimientos y de que cuando «os suelte la correa» podáis instalar y gestionar Dockers sin ayuda.

En el próximo artículo veremos cómo instalar un Docker con un servidor de VPN. Seguro que si habéis asimilado todos los conceptos que hemos visto hasta aquí, os resultará muy sencillo de seguir. ¿Ha sido un artículo demasiado duro de seguir? ¿Tenéis alguna duda? Estaré atento a los comentarios.

Share

1 comentario

  1. Yepaswepas

    Adicto a esta serie de post. Deseando el siguiente! Pon un buymeacoffe o algo para pagarte una caña por ese currazo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

© 2024 Flopy.es

Tema por Anders NorenArriba ↑

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies