¿Cómo verificar el estado de los contenedores Docker?

DockerBeginner
Practicar Ahora

Introducción

Docker ha revolucionado la forma en que desarrollamos, implementamos y gestionamos aplicaciones. Como una potente plataforma de containerización, Docker le permite empaquetar sus aplicaciones y sus dependencias en entornos aislados y portátiles. Saber cómo verificar el estado de sus contenedores Docker es crucial para una gestión y resolución de problemas efectivas.

En este laboratorio práctico, aprenderá los comandos esenciales para monitorear sus contenedores Docker, comprender su estado y gestionar su ciclo de vida. Al final de este tutorial, podrá verificar y gestionar con confianza el estado de sus contenedores Docker para un desarrollo e implementación de aplicaciones eficientes.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 91%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Creación y Ejecución de un Contenedor Docker

Antes de que podamos verificar el estado de los contenedores Docker, necesitamos tener algunos contenedores en ejecución. En este paso, crearemos y ejecutaremos un contenedor Docker simple.

Entendiendo los Contenedores Docker

Los contenedores Docker son paquetes de software ligeros, autónomos y ejecutables que incluyen todo lo necesario para ejecutar una aplicación: código, tiempo de ejecución (runtime), herramientas del sistema, bibliotecas y configuraciones. Proporcionan entornos consistentes en las diferentes etapas del desarrollo.

Los beneficios de usar contenedores Docker incluyen:

  • Entornos de tiempo de ejecución consistentes
  • Aislamiento de otras aplicaciones
  • Implementación y escalado rápidos
  • Utilización eficiente de recursos

Verificando la Instalación de Docker

Primero, verifiquemos que Docker esté correctamente instalado en el sistema:

docker --version

Debería ver una salida similar a:

Docker version 20.10.21, build baeda1f

Ejecutando su Primer Contenedor

Ejecutemos un contenedor simple usando la imagen oficial del servidor web Nginx. Esto nos dará un contenedor para monitorear en los siguientes pasos.

Ejecute el siguiente comando en su terminal:

docker run --name my-nginx -d -p 8080:80 nginx

Este comando:

  • Crea un contenedor llamado my-nginx
  • Lo ejecuta en modo detached (-d), lo que significa que se ejecuta en segundo plano
  • Mapea el puerto 8080 del host al puerto 80 del contenedor (-p 8080:80)
  • Usa la imagen oficial nginx de Docker Hub

Debería ver una larga cadena de caracteres, que es el ID del contenedor:

a72369167c214c20247f786a47b6b0b8581b60324bd2d151a7a0db8ddb024959

Ahora, verifiquemos que el contenedor se esté ejecutando:

docker ps

Debería ver una salida similar a:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds    0.0.0.0:8080->80/tcp   my-nginx

¡Felicidades! Ha creado e iniciado con éxito un contenedor Docker. En el siguiente paso, exploraremos cómo verificar el estado de este contenedor con más detalle.

Comandos Básicos para el Estado del Contenedor

Ahora que tenemos un contenedor en ejecución, aprendamos a verificar su estado utilizando los comandos más comunes de Docker.

Usando el Comando docker ps

El comando docker ps es la forma más fundamental de ver los contenedores en ejecución.

docker ps

La salida debería ser similar a:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   2 minutes ago    Up 2 minutes    0.0.0.0:8080->80/tcp   my-nginx

Este comando muestra:

  • CONTAINER ID: El identificador único del contenedor
  • IMAGE: La imagen Docker utilizada para crear el contenedor
  • COMMAND: El comando ejecutado dentro del contenedor
  • CREATED: Cuándo se creó el contenedor
  • STATUS: El estado actual del contenedor
  • PORTS: Mapeos de puertos entre el host y el contenedor
  • NAMES: El nombre asignado al contenedor

Visualizando Todos los Contenedores

El comando básico docker ps solo muestra los contenedores en ejecución. Para ver todos los contenedores, incluidos los detenidos, use:

docker ps -a

Esto mostrará todos los contenedores, independientemente de su estado:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   5 minutes ago    Up 5 minutes    0.0.0.0:8080->80/tcp   my-nginx

Actualmente, solo tenemos un contenedor, pero si tuviera contenedores detenidos, también aparecerían aquí.

Estado del Contenedor con Formato

Puede personalizar la salida de docker ps para mostrar solo la información que necesita, utilizando la opción --format:

docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

Esto mostrará una tabla simplificada con solo los nombres, el estado y los puertos del contenedor:

NAMES       STATUS          PORTS
my-nginx    Up 7 minutes    0.0.0.0:8080->80/tcp

Deteniendo un Contenedor

Detengamos nuestro contenedor para ver cómo cambia su estado:

docker stop my-nginx

Salida:

my-nginx

Ahora verifique el estado nuevamente:

docker ps

Notará que el contenedor ya no aparece en la lista de contenedores en ejecución. Para verlo, use:

docker ps -a

Salida:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   10 minutes ago   Exited (0) 10 seconds ago             my-nginx

El estado del contenedor ha cambiado a "Exited" (Salida), lo que indica que ya no se está ejecutando.

Iniciando un Contenedor

Iniciemos el contenedor de nuevo:

docker start my-nginx

Salida:

my-nginx

Verifique el estado para confirmar que se está ejecutando:

docker ps

Salida:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   12 minutes ago   Up 5 seconds    0.0.0.0:8080->80/tcp   my-nginx

¡Genial! Ahora comprende cómo verificar el estado básico de los contenedores Docker utilizando el comando docker ps, y cómo detener e iniciar contenedores.

Monitoreo Avanzado de Contenedores

Ahora que comprende los conceptos básicos de la verificación del estado del contenedor, exploremos comandos de monitoreo más avanzados que brindan información detallada sobre sus contenedores.

Información Detallada del Contenedor con docker inspect

El comando docker inspect proporciona información detallada de configuración y tiempo de ejecución (runtime) sobre un contenedor:

docker inspect my-nginx

Este comando devuelve un array JSON con información completa sobre el contenedor. La salida es bastante extensa, pero incluye:

  • Configuración de red
  • Montajes de volumen
  • Variables de entorno
  • Límites de recursos
  • Estado del contenedor
  • Y mucho más

Veamos una sección específica usando la opción --format:

docker inspect --format='{{.State.Status}}' my-nginx

Salida:

running

Puede extraer otras piezas específicas de información:

docker inspect --format='{{.NetworkSettings.IPAddress}}' my-nginx

Esto mostrará la dirección IP interna del contenedor.

Métricas de Contenedor en Tiempo Real con docker stats

El comando docker stats proporciona un flujo en vivo de estadísticas de uso de recursos del contenedor:

docker stats my-nginx

Verá una salida similar a:

CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
a72369167c21   my-nginx   0.00%     2.312MiB / 7.764GiB   0.03%     1.05kB / 1.51kB   0B / 4.1kB       2

Esto muestra:

  • Porcentaje de uso de CPU
  • Uso de memoria
  • E/S de red (Network I/O)
  • E/S de bloque (Block I/O)
  • Número de procesos

Presione Ctrl+C para salir de la vista de estadísticas en vivo.

Para ver las estadísticas de todos los contenedores a la vez:

docker stats --no-stream

Esto muestra una instantánea de las estadísticas sin las actualizaciones continuas.

Visualizando los Registros del Contenedor

Para solucionar problemas, a menudo es útil verificar los registros del contenedor:

docker logs my-nginx

Verá los registros del servidor Nginx. Si ha accedido al servidor web, verá los registros de solicitudes HTTP.

Para seguir los registros en tiempo real (similar a tail -f):

docker logs -f my-nginx

Presione Ctrl+C para salir del flujo de registros.

Verificando los Procesos del Contenedor

Para ver los procesos que se ejecutan dentro de un contenedor:

docker top my-nginx

La salida se verá similar a:

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                12345               12321               0                   14:15               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            12401               12345               0                   14:15               ?                   00:00:00            nginx: worker process

Esto muestra todos los procesos que se ejecutan dentro del contenedor, sus PIDs y el uso de recursos.

Creando un Nuevo Contenedor para Comparación

Creemos otro contenedor para comparar con el existente:

docker run --name redis-server -d redis

Ahora comparemos las estadísticas de ambos contenedores:

docker stats --no-stream my-nginx redis-server

Debería ver estadísticas para ambos contenedores, lo que le permite comparar su uso de recursos.

Estos comandos de monitoreo avanzados le brindan una visión más profunda de la salud y el rendimiento de sus contenedores, lo cual es esencial para solucionar problemas y optimizar el uso de recursos.

Gestión del Ciclo de Vida del Contenedor

Comprender cómo gestionar el ciclo de vida de un contenedor es crucial para el uso eficaz de Docker. En este paso, exploraremos varios comandos para controlar los estados del contenedor y comprender el ciclo de vida del contenedor.

Estados del Ciclo de Vida del Contenedor

Un contenedor Docker puede existir en varios estados:

  • Created (Creado): El contenedor se crea pero no se inicia
  • Running (En ejecución): El contenedor se está ejecutando actualmente
  • Paused (Pausado): La ejecución del contenedor está en pausa
  • Stopped (Detenido): El contenedor está detenido pero aún existe
  • Removed (Eliminado): El contenedor se elimina

Exploremos cómo realizar la transición entre estos estados.

Creando un Contenedor sin Iniciarlo

Puede crear un contenedor sin iniciarlo usando el comando create:

docker create --name test-container nginx

Esto crea un contenedor pero no lo inicia. Verifique su estado:

docker ps -a

Debería ver el nuevo contenedor con un estado "Created" (Creado):

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS                  NAMES
3f4ab92d1234   nginx     "/docker-entrypoint.…"   5 seconds ago    Created                                            test-container
a72369167c21   nginx     "/docker-entrypoint.…"   40 minutes ago   Up 30 minutes               0.0.0.0:8080->80/tcp   my-nginx
bc123def456a   redis     "docker-entrypoint.s…"   10 minutes ago   Up 10 minutes               6379/tcp               redis-server

Iniciando un Contenedor Creado

Para iniciar el contenedor creado:

docker start test-container

Verifique que se esté ejecutando:

docker ps

Pausando y Reanudando Contenedores

Docker le permite pausar un contenedor, lo que congela todos los procesos dentro de él:

docker pause test-container

Verifique su estado:

docker ps

Salida:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                  PORTS                  NAMES
3f4ab92d1234   nginx     "/docker-entrypoint.…"   2 minutes ago    Up 1 minute (Paused)                           test-container
a72369167c21   nginx     "/docker-entrypoint.…"   42 minutes ago   Up 32 minutes           0.0.0.0:8080->80/tcp   my-nginx
bc123def456a   redis     "docker-entrypoint.s…"   12 minutes ago   Up 12 minutes           6379/tcp               redis-server

Para reanudar el contenedor:

docker unpause test-container

Verifique que se esté ejecutando de nuevo:

docker ps

Deteniendo y Reiniciando Contenedores

Para detener un contenedor de forma correcta (enviando SIGTERM, luego SIGKILL después de un período de gracia):

docker stop test-container

Para forzar la detención de un contenedor (enviando SIGKILL):

docker start test-container ## Start it again first
docker kill test-container  ## Then kill it

Para reiniciar un contenedor (lo detiene y lo inicia de nuevo):

docker start test-container ## Start it again first
docker restart test-container

Eliminando Contenedores

Para eliminar un contenedor detenido:

docker stop test-container ## Make sure it's stopped first
docker rm test-container

Verifique que se haya ido:

docker ps -a | grep test-container

No debería obtener ninguna salida, lo que indica que el contenedor ha sido eliminado.

Eliminando un Contenedor en Ejecución

Puede forzar la eliminación de un contenedor en ejecución:

docker run --name temp-container -d nginx
docker rm -f temp-container

Políticas de Reinicio del Contenedor

Docker le permite establecer políticas de reinicio para los contenedores:

docker run --name always-restart --restart always -d nginx

Este contenedor se reiniciará automáticamente si sale o si Docker se reinicia.

Verifique la política de reinicio:

docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' always-restart

Salida:

always

Detengamos y eliminemos este contenedor:

docker rm -f always-restart

Comprender estos comandos del ciclo de vida le brinda control total sobre sus contenedores Docker, lo que le permite gestionar de manera eficiente sus estados en función de las necesidades de su aplicación.

Solución de Problemas de Contenedores

Incluso con una monitorización y gestión adecuadas, los contenedores a veces pueden encontrar problemas. Este paso le enseñará cómo solucionar problemas comunes de contenedores utilizando las herramientas de diagnóstico de Docker.

Problemas Comunes de Contenedores

Los contenedores pueden fallar debido a varias razones:

  • Fallos de la aplicación
  • Limitaciones de recursos
  • Problemas de configuración
  • Problemas de red
  • Errores de permisos

Exploremos cómo identificar y diagnosticar estos problemas.

Creando un Contenedor Problemático

Creemos un contenedor que saldrá inmediatamente debido a un comando no válido:

docker run --name problematic -d nginx sleep 5

Este contenedor ejecutará el comando sleep 5 y luego saldrá después de 5 segundos.

Espere unos segundos, luego verifique su estado:

docker ps -a

Salida:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS                  NAMES
1a2b3c4d5e6f   nginx     "sleep 5"                10 seconds ago   Exited (0) 5 seconds ago                           problematic
a72369167c21   nginx     "/docker-entrypoint.…"   1 hour ago       Up 50 minutes               0.0.0.0:8080->80/tcp   my-nginx
bc123def456a   redis     "docker-entrypoint.s…"   30 minutes ago   Up 30 minutes               6379/tcp               redis-server

El contenedor ha salido con el código 0 (éxito), pero ya no se está ejecutando.

Verificando los Códigos de Salida del Contenedor

El código de salida puede indicarle por qué se detuvo un contenedor:

  • 0: Éxito
  • Distinto de cero: Se produjo un error

Para ver el código de salida:

docker inspect problematic --format='{{.State.ExitCode}}'

Salida:

0

Esto significa que el contenedor salió con éxito después de completar su tarea asignada.

Examinando los Registros del Contenedor

Los registros son cruciales para la solución de problemas:

docker logs problematic

En este caso, es posible que no vea ninguna salida porque nuestro comando sleep no produce registros.

Creemos otro contenedor problemático que generará registros:

docker run --name crash-test -d nginx sh -c "echo 'Starting container'; sleep 2; echo 'About to crash'; exit 1"

Después de unos segundos, verifique su estado y registros:

docker ps -a | grep crash-test

Salida:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
f1e2d3c4b5a6   nginx     "sh -c 'echo 'Starti…"   10 seconds ago   Exited (1) 7 seconds ago              crash-test

Ahora verifique los registros:

docker logs crash-test

Salida:

Starting container
About to crash

Estos registros proporcionan pistas sobre lo que sucedió antes de que el contenedor fallara.

Verificando el Uso de Recursos

Las restricciones de recursos pueden hacer que los contenedores fallen o funcionen mal:

docker stats --no-stream my-nginx

Esto muestra el uso de CPU, memoria y E/S, lo que puede ayudar a identificar cuellos de botella de recursos.

Verificando la Configuración del Contenedor

La configuración incorrecta es una fuente común de problemas:

docker inspect my-nginx

Busque:

  • Montajes de volumen
  • Variables de entorno
  • Configuración de red
  • Límites de recursos

Accediendo a un Contenedor en Ejecución

Para depurar problemas dentro de un contenedor en ejecución:

docker exec -it my-nginx bash

Esto le da una shell dentro del contenedor, donde puede ejecutar comandos para diagnosticar problemas:

ls -la
ps aux
cat /etc/nginx/nginx.conf
exit ## To leave the container shell

Limpieza

Limpiemos nuestros contenedores problemáticos:

docker rm problematic crash-test

Al dominar estas técnicas de solución de problemas, puede identificar y resolver rápidamente los problemas con sus contenedores Docker, asegurando que sus aplicaciones se ejecuten sin problemas y de forma fiable.

Resumen

En este laboratorio práctico, ha adquirido habilidades esenciales para monitorizar y gestionar contenedores Docker:

  1. Creación y Ejecución de Contenedores - Aprendió a crear y ejecutar contenedores Docker utilizando el comando docker run.

  2. Verificación de Estado Básica - Dominó el comando docker ps para listar los contenedores en ejecución y verificar su información de estado básica.

  3. Monitorización Avanzada - Exploró técnicas de monitorización avanzadas utilizando docker inspect y docker stats para obtener información detallada del contenedor y métricas de rendimiento en tiempo real.

  4. Gestión del Ciclo de Vida del Contenedor - Aprendió a gestionar el ciclo de vida completo de un contenedor, incluyendo la creación, inicio, detención, pausa y eliminación de contenedores.

  5. Solución de Problemas - Desarrolló habilidades para diagnosticar y resolver problemas comunes de contenedores utilizando registros (logs), monitorización de recursos y acceso directo al contenedor.

Estas habilidades son fundamentales para trabajar eficazmente con contenedores Docker en entornos de desarrollo, pruebas y producción. Ahora puede monitorizar con confianza el estado de sus contenedores, gestionar su ciclo de vida y solucionar problemas cuando surjan.

Para continuar su viaje con Docker, considere explorar temas como Docker Compose para aplicaciones de múltiples contenedores, redes de Docker y la orquestación de contenedores con Kubernetes.