🚀 Ciclo de vida del contenedor
Entender cómo fluyen las imágenes y contenedores en Docker es esencial antes de memorizar comandos. Cada contenedor pasa por estos estados lógicos.
Construir / Descargar
El código y las dependencias se empaquetan en una Imagen estática usando docker build o se descarga una existente con docker pull.
Crear e Iniciar
Usando docker run, la imagen estática cobra vida y se convierte en un Contenedor en ejecución.
Operar y Monitorizar
Mientras corre, puedes ver sus logs con docker logs, ejecutar comandos dentro con docker exec y monitorizar recursos con docker stats.
Detener
El contenedor se pausa con docker stop (envía SIGTERM). Los datos internos no persistentes se mantienen hasta que el contenedor se elimina.
Destruir
El contenedor se elimina definitivamente con docker rm. Si no usaste volúmenes, los datos generados se pierden para siempre.
💿 Gestión de Imágenes
Las imágenes son las plantillas de solo lectura a partir de las cuales se crean los contenedores. Dominar su gestión optimiza el espacio y la seguridad.
docker pull
Descarga una imagen desde un registro (como Docker Hub) a tu máquina local.
docker pull ubuntu:latestdocker images
Lista todas las imágenes descargadas localmente. Alternativa: docker image ls.
docker imagesdocker build
Construye una imagen a partir de un Dockerfile. El punto final . indica el contexto actual.
docker build -t mi-app:v1 .docker rmi
Elimina una imagen por su ID o nombre. Requiere que no haya contenedores usándola.
docker rmi ubuntu:latestBorrar TODAS las imágenes
Elimina todas las imágenes forzadamente combinando rmi con una subshell que lista los IDs.
docker rmi $(docker images -aq)docker tag
Añade una etiqueta o cambia el nombre de una imagen para prepararla para el push a un registro.
docker tag mi-app usuario/mi-app:v1docker push
Sube la imagen a un registro remoto (como Docker Hub o AWS ECR).
docker push usuario/mi-app:v1📦 Gestión de Contenedores
El contenedor es la instancia viva de la imagen. Aquí es donde tu aplicación realmente se ejecuta y sirve tráfico.
docker run
Crea e inicia un contenedor. -d lo ejecuta en segundo plano. -p expone puertos.
docker run -d -p 8080:80 nginxdocker ps
Lista contenedores activos. Usa -a para ver también los detenidos.
docker ps -adocker start / stop
Inicia o detiene un contenedor ya creado, sin perder sus cambios temporales internos.
docker stop id_contenedordocker exec
Ejecuta un comando dentro de un contenedor activo. Usa -it para obtener una terminal interactiva.
docker exec -it id_contenedor bashdocker rm
Elimina un contenedor detenido. Usa -f para forzar la eliminación de uno activo (no recomendado).
docker rm id_contenedordocker cp
Copia archivos entre el contenedor y el sistema host local.
docker cp archivo.txt id_contenedor:/ruta/💾 Volúmenes de Datos
Los contenedores son efímeros. Si se eliminan, se pierde su almacenamiento interno. Los volúmenes permiten persistir datos de bases de datos o subir código en vivo.
docker volume create
Crea un volumen gestionado completamente por Docker.
docker volume create mi-volumendocker volume ls
Lista todos los volúmenes existentes en el sistema local.
docker volume lsMontar volumen (-v)
Usa -v nombre:/ruta_interna al iniciar un contenedor para adjuntar el volumen.
docker run -v mi-volumen:/data mysqlBind Mount
Monta un directorio absoluto del host al contenedor. Ideal para desarrollo web.
docker run -v $(pwd):/app node🌐 Redes en Docker
Las redes permiten aislar o comunicar contenedores de forma segura mediante resolución de nombres por DNS interno.
docker network create
Crea una nueva red virtual (tipo bridge por defecto).
docker network create mi-reddocker network ls
Muestra todas las redes en el host local.
docker network lsConectar contenedor
Conecta un contenedor a una red. Podrá hablar con otros contenedores usando su nombre.
docker run --network mi-red -d redisdocker network connect
Conecta un contenedor ya en ejecución a una red específica.
docker network connect mi-red id_cont📝 Logs y Stats
Saber qué pasa dentro de un contenedor en ejecución es vital para el debugging de aplicaciones y problemas de memoria.
docker logs
Muestra el output de consola. Usa -f para seguir el log en tiempo real.
docker logs -f id_contenedorTail logs (-n)
Muestra solo las últimas N líneas del registro. Muy útil en contenedores antiguos.
docker logs --tail 50 id_contenedordocker stats
Muestra CPU, memoria y red en tiempo real de todos los contenedores vivos.
docker statsdocker top
Muestra los procesos que se están ejecutando dentro de un contenedor.
docker top id_contenedor🔍 Inspección y Limpieza
Mantener el entorno limpio y entender las capas subyacentes son habilidades avanzadas esenciales.
docker inspect
Imprime un JSON masivo con toda la metadata, IPs, volúmenes y variables de entorno del contenedor.
docker inspect id_contenedordocker history
Muestra las capas que conforman una imagen y su tamaño. Útil para auditar Dockerfiles lentos.
docker history ubuntu:latestdocker system prune
Limpieza total y forzada del entorno Docker. Elimina contenedores detenidos, redes, imágenes sin usar y volúmenes.
docker system prune -a -f --volumesFiltrar grep IP
Ejemplo combinando inspect y grep para obtener rápido la IP de un contenedor.
docker inspect id_cont | grep IPAddress🔥 Cheat Sheet Rápido
Los comandos esenciales ejecutados como superusuario para ver el estado general y forzar limpiezas en tu sistema.
Sólo en ejecución
Muestra únicamente los contenedores que están activos.
sudo docker psTodos los contenedores
Lista todos, incluyendo los que están detenidos.
sudo docker ps -aTodas las imágenes
Muestra todas las imágenes descargadas (incluso intermedias).
sudo docker images -aListar Redes
Lista todas las redes Docker creadas.
sudo docker network lsListar Volúmenes
Muestra los volúmenes usados para persistencia.
sudo docker volume lsDetener contenedor
Detiene de forma segura un contenedor en ejecución.
sudo docker stop nombre-contForzar eliminación (Cont)
Elimina un contenedor, incluso si está en ejecución.
sudo docker rm -f nombre-contForzar eliminación (Img)
Elimina una imagen de manera forzada.
sudo docker rmi -f nombre-imgLimpieza Básica
Elimina contenedores detenidos, redes e imágenes sin usar.
sudo docker system prune -a -fLimpieza Total (Peligro)
Elimina contenedores, imágenes, redes y volúmenes.
sudo docker system prune -a --volumes -f🧮 Generador Interactivo: docker run
Genera un comando seguro de despliegue configurando los parámetros más comunes sin equivocarte en la sintaxis.
🐳 Docker Compose
Compose es una herramienta para definir y ejecutar aplicaciones Docker multi-contenedor. Usando un archivo YAML, configuras los servicios y los lanzas todos de golpe.
docker compose up
Crea e inicia todos los contenedores definidos en el archivo docker-compose.yml. Con -d en background.
docker compose up -ddocker compose down
Detiene y elimina los contenedores, redes y volúmenes (si usas -v) creados por up.
docker compose downdocker compose logs
Muestra los logs combinados de todos los servicios. Usa -f para seguimiento en vivo.
docker compose logs -fdocker compose ps
Muestra el estado de los contenedores asociados específicamente a este proyecto Compose.
docker compose ps
🐙 Laboratorios Whoami-Labs
Oficial
Instrucciones oficiales para desplegar las máquinas vulnerables locales de la academia Whoami-Labs. Estas máquinas se distribuyen comprimidas e incluyen un script autoejecutable.
Admin: Empaquetar Lab
Construye tu máquina vulnerable y guárdala como .tar para poder distribuirla.
docker build -t lab_corp_mail . && docker save -o corp_mail_lab.tar lab_corp_mailPaso 1: Descomprimir
Extrae el archivo .zip descargado desde la plataforma que contiene el script y el archivo .tar del laboratorio.
unzip corp_mail_lab.zipPaso 2: Entrar al directorio
Navega a la carpeta recién extraída donde se encuentra el script de inicialización.
cd nombrelab/Paso 3: Lanzar Laboratorio
Ejecuta el script startlab.sh pasándole como argumento el archivo .tar extraído. El script hará un docker load y desplegará la máquina localmente.
bash startlab.sh nombre_maquina.tarstartlab.sh incluye un sistema de validación de flag y cronómetro. Para limpiar y eliminar la máquina al terminar, simplemente presiona Ctrl+C en la terminal donde corre el script.☢️ Crear un Laboratorio Vulnerable
Ejemplo básico de cómo construir un contenedor Docker inseguro para prácticas de pentesting. Este escenario expone un servidor Web (Puerto 80) y un servicio FTP con acceso anónimo habilitado (Puerto 21) que permite descargar archivos sensibles.
1. Estructura de Archivos
Crea un directorio para tu laboratorio y añade estos tres archivos clave (Haz clic en ellos para ver su código):
🐳 Dockerfile
Las instrucciones de construcción del contenedor vulnerable.
🌐 index.html
La página web señuelo que verá el atacante al escanear el puerto 80.
📜 credenciales.txt
El archivo sensible que el atacante robará usando el acceso FTP anónimo.
2. El Dockerfile Vulnerable
Este Dockerfile parte de Debian, instala Apache y vsftpd (servidor FTP), configura el acceso anónimo y expone los puertos.
3. Construir la Imagen
Abre la terminal en la carpeta donde tienes el Dockerfile y compila la imagen poniéndole un nombre.
docker build -t lab-ftp-vuln .4. Lanzar el Laboratorio
Arranca el contenedor en background exponiendo los puertos atacables hacia tu máquina real.
docker run -d -p 80:80 -p 21:21 --name maquina-objetivo lab-ftp-vuln⚙️ Sistema y Troubleshooting
Ajustes comunes a nivel de sistema operativo Linux que te facilitarán la vida al trabajar con Docker y laboratorios locales.
Permisos Docker (Sin sudo)
Añade tu usuario (ej. kali) al grupo secundario de Docker. Esto te permite ejecutar todos los comandos de contenedores sin necesidad de escribir sudo cada vez. (Requiere reiniciar sesión).
sudo usermod -aG docker kaliLiberar Puerto 22 (SSH)
Si tu laboratorio vulnerable incluye un servicio SSH que necesita ser mapeado al puerto 22, este colisionará con el servicio SSH real de tu máquina local. Detenlo con este comando para liberar el puerto. Aviso: En un entorno de producción o nube remota perderás conexión. ¡Usar solo en VM local!
sudo systemctl stop ssh