🚀 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.

1

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.

2

Crear e Iniciar

Usando docker run, la imagen estática cobra vida y se convierte en un Contenedor en ejecución.

3

Operar y Monitorizar

Mientras corre, puedes ver sus logs con docker logs, ejecutar comandos dentro con docker exec y monitorizar recursos con docker stats.

4

Detener

El contenedor se pausa con docker stop (envía SIGTERM). Los datos internos no persistentes se mantienen hasta que el contenedor se elimina.

5

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:latest

docker images

Lista todas las imágenes descargadas localmente. Alternativa: docker image ls.

docker images

docker 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:latest

Borrar 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:v1

docker 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 nginx

docker ps

Lista contenedores activos. Usa -a para ver también los detenidos.

docker ps -a

docker start / stop

Inicia o detiene un contenedor ya creado, sin perder sus cambios temporales internos.

docker stop id_contenedor

docker exec

Ejecuta un comando dentro de un contenedor activo. Usa -it para obtener una terminal interactiva.

docker exec -it id_contenedor bash

docker rm

Elimina un contenedor detenido. Usa -f para forzar la eliminación de uno activo (no recomendado).

docker rm id_contenedor

docker 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-volumen

docker volume ls

Lista todos los volúmenes existentes en el sistema local.

docker volume ls

Montar volumen (-v)

Usa -v nombre:/ruta_interna al iniciar un contenedor para adjuntar el volumen.

docker run -v mi-volumen:/data mysql

Bind 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-red

docker network ls

Muestra todas las redes en el host local.

docker network ls

Conectar contenedor

Conecta un contenedor a una red. Podrá hablar con otros contenedores usando su nombre.

docker run --network mi-red -d redis

docker 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_contenedor

Tail logs (-n)

Muestra solo las últimas N líneas del registro. Muy útil en contenedores antiguos.

docker logs --tail 50 id_contenedor

docker stats

Muestra CPU, memoria y red en tiempo real de todos los contenedores vivos.

docker stats

docker 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_contenedor

docker history

Muestra las capas que conforman una imagen y su tamaño. Útil para auditar Dockerfiles lentos.

docker history ubuntu:latest

docker 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 --volumes

Filtrar 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 ps

Todos los contenedores

Lista todos, incluyendo los que están detenidos.

sudo docker ps -a

Todas las imágenes

Muestra todas las imágenes descargadas (incluso intermedias).

sudo docker images -a

Listar Redes

Lista todas las redes Docker creadas.

sudo docker network ls

Listar Volúmenes

Muestra los volúmenes usados para persistencia.

sudo docker volume ls

Detener contenedor

Detiene de forma segura un contenedor en ejecución.

sudo docker stop nombre-cont

Forzar eliminación (Cont)

Elimina un contenedor, incluso si está en ejecución.

sudo docker rm -f nombre-cont

Forzar eliminación (Img)

Elimina una imagen de manera forzada.

sudo docker rmi -f nombre-img

Limpieza Básica

Elimina contenedores detenidos, redes e imágenes sin usar.

sudo docker system prune -a -f

Limpieza 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.

Ejecución
Atributos Extras
Imagen y Red
docker run -d nginx:latest

🐳 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 -d

docker compose down

Detiene y elimina los contenedores, redes y volúmenes (si usas -v) creados por up.

docker compose down

docker compose logs

Muestra los logs combinados de todos los servicios. Usa -f para seguimiento en vivo.

docker compose logs -f

docker compose ps

Muestra el estado de los contenedores asociados específicamente a este proyecto Compose.

docker compose ps

Whoami Logo🐙 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_mail

Paso 1: Descomprimir

Extrae el archivo .zip descargado desde la plataforma que contiene el script y el archivo .tar del laboratorio.

unzip corp_mail_lab.zip

Paso 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.tar
Importante: El script startlab.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.

FROM debian:latest # Instalar Apache y vsftpd (FTP) RUN apt-get update && apt-get install -y apache2 vsftpd # Configurar web señuelo COPY index.html /var/www/html/ # Crear archivo sensible para el FTP RUN mkdir -p /var/ftp/pub COPY credenciales.txt /var/ftp/pub/ RUN chown -R ftp:ftp /var/ftp/pub # Configurar FTP para PERMITIR acceso Anónimo (¡Vulnerabilidad!) RUN echo "anonymous_enable=YES" >> /etc/vsftpd.conf && \ echo "local_enable=YES" >> /etc/vsftpd.conf && \ echo "anon_root=/var/ftp" >> /etc/vsftpd.conf # Exponer puertos Web (80) y FTP (21) EXPOSE 80 21 # Arrancar ambos servicios al iniciar el contenedor CMD service vsftpd start && /usr/sbin/apache2ctl -D FOREGROUND

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 kali

Liberar 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