Saber crear y arrancar contenedores es solo el principio. En el trabajo diario pasarás mucho tiempo gestionándolos: viendo cuáles tienes, consultando su configuración, leyendo sus registros para depurar problemas, entrando en ellos para investigar, copiando ficheros entre el host y el contenedor, y limpiando los que ya no necesitas. En esta lección reuniremos todas estas herramientas de gestión, que forman el conjunto de comandos que más utilizarás a lo largo de tu vida con Docker. Aprender a manejarlas con soltura te convertirá en un usuario eficaz y autónomo.
Listar Contenedores
El primer paso para gestionar algo es saber qué tienes. El comando docker ps es tu punto de partida.
# Solo los contenedores en ejecución
docker ps
# Todos los contenedores, incluidos los detenidos
docker ps -adocker ps: muestra los contenedores activos con su ID, imagen, estado, puertos y nombre.docker ps -a(all): incluye también los contenedores detenidos. Imprescindible cuando buscas uno que ya no está corriendo.
Opciones útiles para afinar el listado:
# Mostrar solo los IDs (útil para encadenar comandos)
docker ps -q
# Mostrar el último contenedor creado
docker ps -l-q(quiet): devuelve solo los identificadores, ideal para usar dentro de otros comandos.-l(latest): muestra el contenedor más reciente, esté en el estado que esté.
Inspeccionar un Contenedor
Cuando necesitas conocer todos los detalles de un contenedor (su IP, sus volúmenes, sus variables de entorno, su configuración de red), usas docker inspect.
- Devuelve un documento JSON enorme con absolutamente toda la información del contenedor.
Como ese JSON es muy extenso, normalmente filtrarás solo lo que te interesa con -f (plantilla de formato):
# Obtener solo la dirección IP del contenedor
docker inspect -f '{{ .NetworkSettings.IPAddress }}' servidor_web
# Obtener el estado actual
docker inspect -f '{{ .State.Status }}' servidor_web-f '{{ ... }}': aplica una plantilla de formato Go para extraer un campo concreto.- En el primer ejemplo, obtienes solo la IP; en el segundo, el estado (
running,exited, etc.).
Leer los Logs
Cuando algo no funciona, los logs son tu primera fuente de información. El comando docker logs muestra la salida que el contenedor ha escrito por consola.
- Muestra todo lo que el proceso principal ha enviado a la salida estándar y de error.
Opciones muy útiles para depurar:
# Seguir los logs en tiempo real (como tail -f)
docker logs -f servidor_web
# Mostrar solo las últimas 50 líneas
docker logs --tail 50 servidor_web
# Mostrar marcas de tiempo
docker logs -t servidor_web-f(follow): mantiene la salida abierta y muestra las nuevas líneas según aparecen. PulsaCtrl+Cpara salir.--tail 50: limita la salida a las últimas 50 líneas, útil cuando el log es enorme.-t(timestamps): añade la fecha y hora de cada línea.
Entrar en un Contenedor con exec
A veces necesitas ejecutar un comando dentro de un contenedor que ya está en marcha: para investigar, revisar ficheros o probar algo. Para eso está docker exec.
docker exec: ejecuta un comando en un contenedor que ya está corriendo.-it: modo interactivo con terminal (igual que endocker run).bash: abre una shell dentro del contenedor. Para salir, escribeexit.
Importante: si la imagen es muy ligera (como Alpine) y no tiene bash, usa sh:
También puedes ejecutar comandos puntuales sin abrir una shell:
# Ver los procesos que corren dentro del contenedor
docker exec servidor_web ps aux
# Comprobar el contenido de un fichero de configuración
docker exec servidor_web cat /etc/nginx/nginx.conf- Estos comandos se ejecutan dentro del contenedor y devuelven su salida directamente a tu terminal.
Diferencia clave: docker exec actúa sobre un contenedor en ejecución, mientras que docker run crea uno nuevo.
Copiar Ficheros con docker cp
A menudo necesitas mover ficheros entre el host y un contenedor: para sacar un log, inyectar una configuración o respaldar datos. El comando docker cp lo hace en ambas direcciones.
# Del host AL contenedor
docker cp ./config.local.conf servidor_web:/etc/nginx/conf.d/config.conf
# Del contenedor AL host
docker cp servidor_web:/var/log/nginx/access.log ./access.log- La sintaxis es
docker cp origen destino. - Para referirte a una ruta dentro del contenedor, usa el formato
nombre_contenedor:/ruta. - En el primer ejemplo copiamos un fichero del host al contenedor; en el segundo, al revés.
Renombrar un Contenedor
Si un contenedor quedó con un nombre poco descriptivo, puedes cambiarlo sin recrearlo.
docker rename nombre_actual nombre_nuevo: cambia el nombre del contenedor.- El contenedor sigue funcionando igual; solo cambia su etiqueta identificativa.
Eliminar Contenedores
Cuando un contenedor ya no te sirve, conviene eliminarlo para liberar espacio.
# Eliminar un contenedor detenido
docker rm servidor_web
# Forzar la eliminación de un contenedor en ejecución
docker rm -f servidor_webdocker rm: elimina un contenedor detenido. Si está corriendo, dará error.-f(force): detiene y elimina el contenedor aunque esté en ejecución. Úsalo con cuidado.
Eliminar contenedores en bloque
# Eliminar TODOS los contenedores detenidos
docker container prune
# Eliminar varios a la vez por nombre
docker rm contenedor1 contenedor2 contenedor3docker container prune: borra de golpe todos los contenedores que estén detenidos. Docker te pedirá confirmación. Es la forma más cómoda de limpiar el sistema.
Resumen de Comandos de Gestión
| Comando | Función |
|---|---|
docker ps / ps -a |
Listar contenedores activos / todos |
docker inspect |
Ver la configuración completa de un contenedor |
docker logs |
Consultar la salida (registros) del contenedor |
docker exec |
Ejecutar un comando en un contenedor en marcha |
docker cp |
Copiar ficheros entre host y contenedor |
docker rename |
Cambiar el nombre de un contenedor |
docker rm |
Eliminar un contenedor |
docker container prune |
Eliminar todos los contenedores detenidos |
Errores Comunes y Consejos
- Usar
bashen imágenes que no lo tienen: muchas imágenes ligeras (Alpine) solo incluyensh. Sibashfalla, prueba consh. - Intentar
docker rmsobre un contenedor en marcha: primero deténlo condocker stop, o usadocker rm -f. - Confundir
execconrun:execentra en un contenedor existente;runcrea uno nuevo. Si abres una shell conrun, no estarás en el contenedor que crees. - Invertir el origen y destino en
docker cp: recuerda que el formato del contenedor es siemprenombre:/ruta. - Olvidar limpiar: los contenedores detenidos se acumulan. Ejecuta
docker container prunede vez en cuando. - Consejo: combina
docker ps -qcon otros comandos para automatizar tareas (por ejemplo, detener todos los contenedores a la vez).
Ejercicios
Ejercicio 1: inspeccionar y leer logs
Lanza un contenedor de Nginx, averigua su dirección IP interna con docker inspect y consulta sus últimas 20 líneas de log.
Ejercicio 2: entrar y explorar
Entra en un contenedor de Nginx en ejecución con una shell interactiva, comprueba qué procesos están corriendo dentro y sal.
Ejercicio 3: copiar y limpiar
Crea un fichero de texto en tu host, cópialo dentro de un contenedor de Nginx, verifica que está ahí y, finalmente, elimina todos los contenedores detenidos.
Soluciones
Solución 1
docker run -d --name web nginx
docker inspect -f '{{ .NetworkSettings.IPAddress }}' web
docker logs --tail 20 webdocker inspect con la plantilla devuelve solo la IP; --tail 20 limita la salida a las últimas líneas.
Solución 2
ps aux lista los procesos dentro del contenedor; exit cierra la shell sin detener el contenedor.
Solución 3
echo "hola docker" > prueba.txt
docker run -d --name web nginx
docker cp prueba.txt web:/usr/share/nginx/html/prueba.txt
docker exec web cat /usr/share/nginx/html/prueba.txt # Muestra 'hola docker'
docker stop web
docker container prune # Confirma con 'y'El fichero se copia al contenedor y se verifica con cat; luego se detiene y se eliminan todos los contenedores parados.
Conclusión
En esta lección hemos reunido las herramientas esenciales para gestionar contenedores en el día a día: listarlos con docker ps, inspeccionar su configuración con docker inspect, depurar mediante docker logs, entrar en ellos con docker exec, mover ficheros con docker cp, renombrarlos y eliminarlos de forma individual o en bloque. Estos comandos son los que usarás una y otra vez en tu trabajo con Docker.
En la siguiente lección, Redes en Docker, daremos los primeros pasos para conectar contenedores entre sí: entenderás qué es una red en Docker, los tipos básicos que existen y cómo lograr que dos contenedores se comuniquen.
Docker: De Principiante a Avanzado
Módulo 1: Introducción a Docker
- ¿Qué es Docker?
- Instalando Docker
- Arquitectura de Docker
- Comandos Básicos de Docker
- Entendiendo las Imágenes de Docker
- Creando tu Primer Contenedor Docker
Módulo 2: Trabajando con Imágenes Docker
- Docker Hub y Repositorios
- Construyendo Imágenes Docker
- Conceptos Básicos de Dockerfile
- Gestionando Imágenes Docker
- Etiquetado y Publicación de Imágenes
Módulo 3: Contenedores Docker
- Ejecutando Contenedores
- Ciclo de Vida del Contenedor
- Gestionando Contenedores
- Redes en Docker
- Persistencia de Datos con Volúmenes
Módulo 4: Docker Compose
- Introducción a Docker Compose
- Definiendo Servicios en Docker Compose
- Comandos de Docker Compose
- Aplicaciones Multi-Contenedor
- Variables de Entorno en Docker Compose
Módulo 5: Conceptos Avanzados de Docker
- Profundización en Redes Docker
- Opciones de Almacenamiento Docker
- Mejores Prácticas de Seguridad en Docker
- Optimizando Imágenes Docker
- Registro y Monitoreo en Docker
Módulo 6: Docker en Producción
- CI/CD con Docker
- Orquestando Contenedores con Docker Swarm
- Introducción a Kubernetes
- Desplegando Contenedores Docker en Kubernetes
- Escalado y Balanceo de Carga
