En anteriores post de esta serie de Docker 101, hemos visto cómo lanzar nuestro primer contenedor. Ahora que sabemos esto, es momento de aprender a gestionar los contenedores de nuestra instancia Docker.

Por lo que en este post, veremos una serie de comandos de utilidad bastante comunes, que se utilizan en el día a día a la hora de gestionar nuestros contenedores.

Importante Docker 101

Este post forma parte de una serie de publicaciones formativas respecto a Docker, echa un ojo al resto aquí:

Docker 101
Como la mayoría de aplicaciones que cubrimos en los vídeos y posts funcionan en contenedores Docker, he decidido hacer una serie de publicaciones enseñando lo que sé sobre Docker de forma instructiva, para que aprendáis lo que es, cómo funciona y a utlizar esta herramienta tan comoda. A continuación os

Requisitos

Para seguir cómodamente este post, recomiendo lo siguiente:

sudo docker run -d --name it-tools-1 --restart unless-stopped -p 8080:80 corentinth/it-tools:latest
sudo docker run -d --name it-tools-2 --restart unless-stopped -p 8090:80 corentinth/it-tools:latest

Comandos de utilidad

A continuación, os enumero brevemente los comandos que vamos a ver, con una breve descripción de lo que hacen. Guardaos esta lista ya que puede resultar bastante útil.

  • docker container ls
  • docker container start/stop/restart
  • docker container rm
  • docker ps + docker ps -a
  • docker container logs
  • docker container inspect
  • docker container stats
  • docker container top
Comando Descripción
docker container ls Lista los contenedores.
docker container start Lanza uno o más contenedores detenidos.
docker container stop Detiene uno o más contenedores lanzados.
docker container restart Reinicia uno o más contenedores.
docker container logs Muestra los logs de un contenedor.
docker container stats Muestra en tiempo real el uso de recursos de los contenedores.
docker container top Muestra los procesos que hay funcionando en un contenedor.
docker container inspect Muestra la información detallada de uno o más contenedores.
docker container exec -it Abre una terminal interactiva en el contenedor.
docker container cp Copia ficheros entre el anfitrión y el contenedor.
docker container rm Elimina uno o más contenedores.
ℹ️
Tenéis una lista más amplia en su documentación oficial: docker container | Docker Docs

docker container ls

Como hemos podido apreciar en la tabla, este comando va a devolvernos un listado de nuestros contenedores, con información bastante útil. estos son los campos que nos informa:

  • ID del contenedor.
  • Imagen utilizada en el momento de creación.
  • Comando de lanzamiento. Esto lo veremos más en detalle cuando tratemos las imágenes.
  • Momento de creación.
  • Estado actual del contenedor.
  • Puertos en uso y su mapeo correspondiente.
  • Nombres del contenedor.

Como podemos apreciar, si lanzamos el comando:

sudo docker container ls

Nos saldría algo como esto:

docker container ls -a

Con el parámetro -a nos va a mostrar incluso los que tenemos parados. Para ello, ejecutaremos el siguiente comando, que veremos en detalle más adelante en este post:

sudo docker container stop it-tools-1

Si ahora ejecutamos el listado de contenedores sin el nuevo parámetro, sólo veríamos uno:

sudo docker container ls

Obtendríamos esto por pantalla:

Si ahora lo ejecutamos con el nuevo parámetro de -a:

sudo docker container ls -a

Veríamos los dos, o más, si teníamos otros contenedores parados, como en mi caso:

docker container start | stop | restart

Como bien podemos intuir de estos comandos, y con la descripción de la tabla principal, nos permiten iniciar, detener, o reiniciar uno o varios contenedores.

docker container start

Para verlo en acción, tan solo deberemos ejecutar este comando, que nos iniciará de nuevo nuestro contenedor it-tools-1 que habíamos detenido en el paso anterior:

sudo docker container start it-tools-1

Nos dará un output con los nombres de los contenedores lanzados:

Y lo podremos comprobar listando los contenedores activos, ahora que ya sabemos:

sudo docker container ls

Si nos fijamos, podemos ver que en el caso de it-tools-1 es Up 39 seconds, indicando que se ha iniciado hace relativamente poco:

docker container stop

En este caso, vamos a probar a detener ambos contenedores. Para ello, es tan sencillo como lanzar esto en nuestra terminal:

sudo docker container stop it-tools-1 it-tools-2

Y como antes, veremos que se nos pinta por pantalla los nombres de ambos contenedores detenidos:

Y podremos comprobarlo ejecutando el listado de activos, que se nos quedaría vacío:

sudo docker container ls

Pero si ejecutamos el listado completo, veremos que si aparecen:

sudo docker container ls -a

Y su estado es Exited (137) e indicando el tiempo que llevan en dicho estado, como podremos ver en la siguiente imagen:

docker container restart

Este nos va a permitir reiniciar contenedores activos, o iniciarlos en caso de estar detenidos. Lo podremos comprobar ejecutando:

sudo docker container restart it-tools-1 it-tools-2

Ya que nos devolverá los nombres de ambos, y si ahora ejecutamos:

sudo docker container ls -a

Podremos apreciar que ambos están con estado Up seguido de un tiempo:

Si ahora lanzamos de nuevo el reinicio de contenedores, pero solo en uno de ellos:

sudo docker container restart it-tools-1

Y los listamos nuevamente:

sudo docker container ls

Veremos una diferencia de tiempos en sus estados, indicando que el contenedor it-tools-1 es más reciente:

docker container logs

Uno de los comandos más útiles y prácticos, ya que nos permite ver qué está sucediendo en nuestro contenedor. Como todo, atiende a la salida de dicho contenedor, por lo que los logs que veamos, dependerán de la imagen.

En nuestro caso, vamos a ejecutarlo con una serie de parámetros por hacerlo más cómodo, y ahora los veremos mas en detalle:

sudo docker container logs -n 20 -t it-tools-1

Deberíamos tener una salida por consola similar a esta:

Si nos fijamos en la línea de tiempo, podremos ver cuándo se reinició nuestro contenedor en el paso anterior.

Respecto a los parámetros utilizados, han sido estos dos:

  • -n 20: Mostrar solo las últimas 20 líneas de logs.
  • -t: Mostrar las marcas de tiempo de los logs.

Hay otros también muy útiles, como el -f, que nos permite ver en tiempo real los logs de nuestro contenedor.

sudo docker container logs -f it-tools-2

Se nos quedará esperando, y para dejar de monitorizar los logs, deberemos presionar las teclas CTRL + C.

docker container stats

Permite visualizar las estadísticas de consumo de recursos de los contenedores, y lo mantiene actualizado.. Su uso es muy sencillo, ya que podemos lanzarlo sin parametría:

sudo docker container stats

Pudiendo ver el consumo de recursos de nuestros contenedores activos actualmente:

Como también ver el de los contenedores que deseemos en concreto. Para ello, cerramos pulsando CTRL + C y ejecutamos lo siguiente:

sudo docker container stats it-tools-1

Y con ello veremos que ahora sólo se visualiza el consumo de recursos del contenedor especificado para este caso, it-tools-1:

docker container top

Siguiendo un poco la línea del anterior comando, este permite visualizar los procesos en activo que tiene un contenedor en sí. Para ello tan solo tenemos que lanzar el comando seguido del contenedor que deseemos:

sudo docker container top it-tools-1

Y se nos devolverán los procesos en ejecución dentro del contenedor:

Esto nos puede venir bien para ver si, en caso de tratarse de una imagen o aplicación propia, se ha lanzado el comando que queríamos.

docker container inspect

Este comando nos va a mostrar todo el detalle de un contenedor: Sus redes, volúmenes, parámetros, estado, imagen y otras propiedades.

Es muy práctico para poder tener toda la información de un contenedor, e incluso detectar errores de configuración.

Lo lanzamos en nuestra terminal de la siguiente manera:

sudo docker container inspect it-tools-2 | more

Lo canalizamos mediante | more para poder ver más cómodamente la configuración en este caso. Si queremos cerrarlo rápidamente tan solo tendremos que pulsar la tecla Q de quit.

docker container exec -it

Esta simple línea de consola, seguida del contenedor que deseamos, nos va a permitir abrir una línea de terminal directa contra nuestro contenedor, permitiendo hacer pruebas de conexión o incluso de API mediante CURL si fuese necesario.

Muy cómodo para hacer otras comprobaciones de red, como verificar si el contenedor resuelve la dirección o DNS de otro en caso de compartir una red.

Lo lanzamos de la siguiente manera:

sudo docker container exec -it it-tools-1 sh

Y una vez dentro, podremos recuperar el hostname de nuestro contenedor, e incluso hacer un ping:

Si nos fijamos, por defecto el hostname de un contenedor coincidirá con su ID del listado de docker container ls.
Para desconectarnos, tan solo tendremos que pulsar las teclas CTRL + D.

docker container cp

Otro de los más prácticos, ya que permite copiar ficheros entre el anfitrión y el contenedor, o vice versa. Con comandos como este, podríamos copiar el código fuente de nuestra aplicación en un contenedor con Node.js, para posteriormente ejecutarlo, por ejemplo, aunque ya os aviso que este no es el mejor, ya que hay muchas mejores formas (y más prácticas y seguras) de hacerlo.

Pero para nuestro caso, vamos a crear un fichero nuevo hola.txt que contenga el hostname de donde se ha creado:

echo Hola desde $HOSTNAME >> hola.txt

Y lo copiamos a nuestro contenedor:

sudo docker container cp ./hola.txt it-tools-1:/hola.txt

Nos informará de que se ha copiado correctamente:

Ahora, si retomamos el comando del apartado anterior y nos conectamos al contenedor directamente, listamos los archivos y mostramos el contenido del copiado:

Veremos que efectivamente tiene el contenido del creado desde el anfitrión, ya que contiene su hostname.

Ahora lo modificamos agregando una línea adicional:

echo Saludos desde $HOSTNAME >> hola.txt

Y lo copiamos de vuelta al anfitrión:

sudo docker container cp it-tools-1:/hola.txt ./hola_container.txt

Si lo abrimos, veremos que efectivamente contiene ambas líneas:

Con esto hemos aprendido a mover ficheros entre nuestro anfitrión y nuestro contenedor.

docker container rm

Para finalizar, vamos a eliminar nuestros contenedores, ya que no vamos a hacer más uso de ellos.
Para esto, como en otros muchos más comandos de Linux, contamos con la terminología rm o remove:

sudo docker container rm it-tools-1

Al lanzarlo, habrá dado un error, avisando de que el contenedor está en uso actualmente.

Para eliminarlo tenemos dos maneras: O bien paramos primero el contenedor, y luego lo eliminamos; o forzamos su eliminación con el uso del parámetro -f de force.

Vamos a ver los dos casos, primero paramos nuestro contenedor:

sudo docker container stop it-tools-1

Y ahora lo eliminamos:

sudo docker container rm it-tools-1

Veremos que, como otros comandos anteriores, nos devuelve el nombre del contenedor si finaliza correctamente.

Podemos comprobar que no está activo si listamos los contenedores activos:

Si ahora lanzamos el borrado del segundo contenedor, pero esta vez con el -f:

sudo docker container rm -f it-tools-2

Veremos que este se ha eliminado en un único paso, listando los contenedores nuevamente:

Conclusión

Siguiendo los anteriores post de la serie hasta ahora, hemos aprendido tanto a instalar nuestro propio entorno con Docker, conocer un poco lo qué es y cómo funciona, y hasta a lanzar nuestros contenedores y gestionarlos sin mucho problema.

En los siguientes ya empezamos con temas algo más complejos, como pueden ser los volúmenes, las redes, las imágenes customizadas o los docker compose que tanto hemos usado para instalar algunas herramientas en nuestro homelab.

Referencias

Para la realización del post, se han utilizado las siguientes referencias:

Vídeo

0:00
/2:14