Crear Máquina Docker — Laboratorio Vulnerable
Dos métodos para crear una máquina de laboratorio en Docker. Elige el que mejor se adapte a tu nivel y necesidades.
Método 1
🖐️ Interactivo
Configuras la máquina manualmente desde dentro del contenedor, como si fuera una VM. Más didáctico y flexible.
Recomendado para aprender
Método 2
📄 Dockerfile
Toda la configuración en un único archivo Dockerfile. Más rápido, reproducible y fácil de compartir.
Rápido y reproducible
Instalación de Docker
Requisitos previos: Docker instalado y el usuario añadido al grupo docker para no necesitar
sudo en cada comando.bash — instalar Docker en Ubuntu/Kali
# Actualizar el sistema
sudo apt update
# Instalar Docker desde los repositorios
sudo apt install -y docker.io
# Habilitar e iniciar el servicio (--now = iniciar inmediatamente)
sudo systemctl enable docker --now
💡 Evitar sudo en cada comando: Añade tu usuario al grupo
docker y reinicia la sesión. Muy recomendable en Kali para comodidad.bash — añadir usuario al grupo docker
# Añadir tu usuario al grupo docker
sudo usermod -aG docker $USER
# Reinicia la sesión o el terminal para que surta efecto
# (cierra y abre el terminal, o ejecuta: newgrp docker)
🖐️ MÉTODO 1 — CREACIÓN INTERACTIVA
Paso 1 — Descargar la imagen base
Descarga la imagen de Ubuntu (u otra distribución ligera) desde Docker Hub como punto de partida.
bash
# Descargar la imagen Ubuntu más reciente
sudo docker pull ubuntu:latest
# Ver las imágenes descargadas (obtener el ID)
sudo docker image ls
Paso 2 — Lanzar el contenedor e interactuar
Inicia el contenedor en modo interactivo (
-it) usando el ID de la imagen obtenido con docker image ls.bash
# Lanzar contenedor interactivo (-it = interactive + tty)
# Sustituye el ID por el tuyo (docker image ls para verlo)
sudo docker run -it bbdabce66f1b
# Dentro del contenedor — identificar la IP del contenedor
hostname -I
Paso 2 —
hostname -I muestra la IP del contenedor para pruebas desde el hostPaso 3 — Instalar servicios y crear usuarios
Dentro del contenedor instala Apache, SSH y FTP. Luego inicia los servicios y crea los usuarios de laboratorio.
bash — dentro del contenedor
# Actualizar repositorios e instalar servicios
apt update
apt install apache2 openssh-server vsftpd -y
Instalación de servicios (Apache2, OpenSSH, vsftpd) dentro del contenedor
bash — iniciar servicios y crear usuario
# Iniciar los servicios manualmente (dentro del contenedor)
service apache2 start
service ssh start
# Crear un usuario de laboratorio
adduser jose
Iniciando servicios y creando el usuario
jose dentro del contenedorPaso 4 — Guardar el progreso (commit)
Desde una terminal fuera del contenedor, guarda el estado actual como una nueva imagen. Equivalente a un snapshot de VM.
bash — fuera del contenedor (nueva terminal)
# Ver todos los contenedores (activos y detenidos) para obtener el ID
sudo docker ps -a
# Guardar el estado actual del contenedor como imagen
# Sintaxis: docker commit <ID_CONTENEDOR> <nombre_imagen>:tag
sudo docker commit 8f7fa8617204 mi_maquina_base
Paso 4 —
docker ps -a muestra el ID del contenedor para usarlo en el commit⚠️ Siempre desde fuera del contenedor: El comando
docker commit se ejecuta en una terminal del host, no dentro del contenedor. Abre una nueva pestaña o terminal y ejecuta el comando desde allí.Paso 5 — Dockerfile para arranque automático
Los servicios no arrancan solos al iniciar el contenedor. El Dockerfile define el comando de arranque y el truco
tail -f /dev/null para que el contenedor no se apague.bash — preparar carpeta de trabajo
# Crear carpeta de trabajo en el escritorio
mkdir ~/Escritorio/docker-web
cd ~/Escritorio/docker-web
# Crear el Dockerfile
nano Dockerfile
📄 Dockerfile — ~/Escritorio/docker-web/Dockerfile
FROM mi_maquina_base:latest
CMD service ssh start && service apache2 start && service vsftpd start && tail -f /dev/null
Dockerfile con la imagen base y el CMD que arranca los servicios automáticamente
💡
tail -f /dev/null: Este comando "espera" indefinidamente sin hacer nada. Es el truco estándar para mantener el contenedor vivo — sin él, Docker termina el proceso principal y apaga el contenedor automáticamente.Paso 6 — Build y Export
Construye la imagen final desde el Dockerfile y expórtala a un archivo
.tar listo para compartir o subir a DockerLabs.bash — desde ~/Escritorio/docker-web/
# Construir la imagen final (el . al final es OBLIGATORIO)
# Indica a Docker que el Dockerfile está en la carpeta actual
sudo docker build -t mi_maquina_automatica .
# Exportar la imagen a formato .tar para compartir
sudo docker save -o mi_maquina.tar mi_maquina_automatica:latest
Paso 6 —
docker build construyendo la imagen desde el Dockerfile🔴 El punto al final es obligatorio:
docker build -t mi_maquina_automatica . — el punto (.) le indica a Docker que busque el Dockerfile en el directorio actual. Sin el punto, el comando fallará.Paso 7 — Lanzar y Verificar
Lanza el contenedor definitivo con los puertos mapeados y verifica que Apache y SSH responden correctamente.
Mapeo de puertos
80
host
→
80
contenedor (Apache)
·
2222
host
→
22
contenedor (SSH)
bash — lanzar contenedor con puertos abiertos
# Lanzar en modo detached (-d) con puertos mapeados
sudo docker run -d -p 80:80 -p 2222:22 --name contenedor_final mi_maquina_automatica
# Verificar que el contenedor está corriendo
sudo docker ps
docker ps — contenedor corriendo con los puertos 80→80 y 2222→22 activosVerificar Apache y SSH
bash — probar los servicios
# A. Probar Apache — abre el navegador en http://localhost
# o desde terminal:
curl http://localhost
# B. Probar SSH — conectar con el usuario creado (puerto 2222)
ssh jose@localhost -p 2222
Verificando SSH — conexión con
ssh jose@localhost -p 2222Sesión SSH activa dentro del contenedor como el usuario
jose💡 Optimización de espacio: Una vez que verificas que todo funciona, mueve el archivo
.tar fuera de la carpeta docker-web para que los futuros docker build sean instantáneos (Docker no tendrá que ignorar un archivo pesado en el contexto de build).📄 MÉTODO 2 — DOCKERFILE DIRECTO
Método 2 — Dockerfile Completo
Toda la configuración en un único archivo Dockerfile. Más rápido, reproducible y fácil de versionar. Ideal cuando ya sabes qué quieres configurar.
📄 Dockerfile — Máquina vulnerable completa (debian base)
FROM debian:latest
# Actualizar e instalar servicios y sudo
RUN apt update && apt upgrade -y && apt install apache2 vsftpd openssh-server sudo -y
# Crear usuarios y configurar contraseñas
RUN useradd -m bob && echo "atu:dingdong" | chpasswd
RUN useradd -m mario && echo "jose:dingdong" | chpasswd
# Configurar permisos SUID para escalada de privilegios (opcional)
RUN chmod u+s /usr/bin/find
# Arrancar servicios y mantener el contenedor vivo
CMD service apache2 start && service vsftpd start && service ssh start && tail -f /dev/null
Instrucciones Dockerfile — referencia
FROM
FROM debian:latest # imagen base
FROM ubuntu:22.04 # versión específica
RUN
RUN apt install apache2 -y # instalar
RUN useradd -m bob # crear usuario
RUN echo "bob:pass" | chpasswd # contraseña
RUN chmod u+s /usr/bin/find # SUID
CMD
CMD service ssh start && tail -f /dev/null
# Solo puede haber UN CMD por Dockerfile
EXPOSE
EXPOSE 80 # documentar puerto HTTP
EXPOSE 22 # documentar puerto SSH
# No abre el puerto, solo lo documenta
bash — build, export e importar .tar
# 1. Construir la imagen desde el Dockerfile
docker build -t mi_maquina_pro .
# 2. Exportar a .tar para compartir / subir a DockerLabs
docker save -o mi_maquina_pro.tar mi_maquina_pro:latest
# Cómo importar en otro sistema:
docker load -i mi_maquina_pro.tar
Cheatsheet — Comandos Docker Esenciales
Referencia rápida de los comandos más usados durante la creación y gestión de contenedores de laboratorio.
Imágenes
docker image ls # listar imágenes
docker pull ubuntu:latest # descargar
docker rmi <imagen> # eliminar imagen
docker build -t nombre . # construir
docker save -o f.tar imagen # exportar
docker load -i f.tar # importar
Contenedores
docker ps # contenedores activos
docker ps -a # todos (incl. detenidos)
docker run -it imagen # interactivo
docker run -d -p 80:80 imagen # detached
docker stop <id/nombre> # detener
docker rm <id/nombre> # eliminar
Dentro / Debug
docker exec -it nombre bash # entrar
docker logs nombre # ver logs
docker inspect nombre # detalles
docker commit id imagen:tag # snapshot
hostname -I # IP del contenedor
Limpieza
docker system prune # limpiar todo
docker image prune # imágenes no usadas
docker container prune # contenedores parados
docker volume prune # volúmenes huérfanos