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.
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
nginxde 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:
Creación y Ejecución de Contenedores - Aprendió a crear y ejecutar contenedores Docker utilizando el comando
docker run.Verificación de Estado Básica - Dominó el comando
docker pspara listar los contenedores en ejecución y verificar su información de estado básica.Monitorización Avanzada - Exploró técnicas de monitorización avanzadas utilizando
docker inspectydocker statspara obtener información detallada del contenedor y métricas de rendimiento en tiempo real.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.
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.



