10. Administración y monitoreo

Una vez que tus contenedores están en marcha, el trabajo no ha terminado. Es crucial saber cómo monitorear su rendimiento, revisar sus logs y mantener el sistema limpio y ordenado. Docker proporciona varias herramientas para estas tareas de administración.

Comandos de estado y rendimiento

`docker stats`: Monitoreo de recursos en tiempo real

Este comando proporciona una vista en vivo del consumo de recursos de tus contenedores en ejecución. Es como el "Administrador de Tareas" de Windows o el `top` de Linux, pero para contenedores.

docker stats

La salida se actualiza continuamente y muestra para cada contenedor:

  • Uso de CPU (%)
  • Uso de Memoria (ej. 25.5MiB / 1.94GiB)
  • I/O de Red (datos enviados y recibidos)
  • I/O de Disco (datos leídos y escritos)

Es extremadamente útil para identificar rápidamente si un contenedor está consumiendo demasiados recursos.

`docker logs`: Revisión de la salida de un contenedor

Casi todas las aplicaciones escriben logs en la salida estándar (stdout) y en el error estándar (stderr). Docker captura estas salidas y te permite verlas con el comando `docker logs`.

# Ver todos los logs de un contenedor
docker logs mi-contenedor

# Seguir los logs en tiempo real (como tail -f)
docker logs -f mi-contenedor

# Mostrar solo las últimas 50 líneas
docker logs --tail 50 mi-contenedor

Este es el primer lugar donde debes mirar cuando un contenedor no se comporta como esperas.

`docker top`: Ver procesos dentro de un contenedor

Si necesitas ver los procesos que se están ejecutando *dentro* de un contenedor específico, puedes usar `docker top`.

docker top mi-contenedor

Esto es útil para depurar y entender qué está haciendo exactamente tu aplicación dentro de su entorno aislado.

Inspección avanzada: `docker inspect`

Ya vimos `docker inspect` para imágenes, pero es igualmente útil para contenedores, volúmenes y redes. Proporciona una gran cantidad de información detallada en formato JSON.

docker inspect mi-contenedor

Puedes usarlo para encontrar información específica, como la dirección IP de un contenedor en una red:

# Filtra la salida JSON para obtener solo la dirección IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mi-contenedor

Limpieza de recursos: `docker system prune`

Con el tiempo, Docker puede acumular muchos recursos no utilizados: contenedores detenidos, imágenes antiguas, redes sin usar y volúmenes huérfanos. Esto puede ocupar una cantidad significativa de espacio en disco.

El comando `docker system prune` es una herramienta poderosa para limpiar todo esto de una sola vez.

docker system prune

Por defecto, este comando elimina:

  • Todos los contenedores detenidos.
  • Todas las redes que no estén siendo utilizadas por al menos un contenedor.
  • Todas las imágenes colgando (dangling images).
  • Todo el caché de construcción.

¡Cuidado! Por defecto, `prune` no elimina volúmenes no utilizados para evitar la pérdida accidental de datos. Para incluir los volúmenes, debes usar el flag `--volumes`:

docker system prune --volumes

Para una limpieza aún más agresiva, puedes usar el flag `-a`, que elimina todas las imágenes que no estén asociadas a ningún contenedor en ejecución:

docker system prune -a

Exportar e importar imágenes: `save` y `load`

Normalmente, compartimos imágenes a través de un registro como Docker Hub. Sin embargo, a veces necesitas transferir una imagen a un sistema sin acceso a internet o simplemente guardarla como un archivo de respaldo.

`docker save`: Guardar una imagen a un archivo .tar

Este comando empaqueta una imagen (con todas sus capas) en un archivo tar.

docker save -o mi-app-flask.tar mi-app-flask:1.0

Ahora tienes un archivo `mi-app-flask.tar` que puedes copiar a otra máquina.

`docker load`: Cargar una imagen desde un archivo .tar

En la máquina de destino, puedes cargar la imagen en Docker usando `docker load`.

docker load -i mi-app-flask.tar

Después de ejecutar este comando, la imagen `mi-app-flask:1.0` estará disponible localmente, como si la hubieras descargado con `docker pull`.