14. Publish and Detached modes
docker --version
Modos Publish y Detached en Docker
📚 Introducción a los Conceptos Básicos
¿Qué son los modos Publish y Detached?
Imagina que un contenedor Docker es como una habitación aislada dentro de un edificio:
Detached mode: La habitación funciona independientemente, sin que tú estés dentro vigilándola
Publish mode: Abres una ventana en la habitación para que el mundo exterior pueda comunicarse con lo que hay dentro
📦 Contenedores Docker: Una Analogía Simple
┌─────────────────────────────────────────────┐
│ HOST (Tu Computadora) │
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ CONTENEDOR DOCKER │ │
│ │ ┌─────────────────────────────────┐ │ │
│ │ │ Aplicación (ej: web) │ │ │
│ │ │ Escucha en puerto 80 │ │ │
│ │ └─────────────────────────────────┘ │ │
│ │ 🔒 AISLADO │ │
│ └─────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────┘🚀 Parte 1: Modo Detached (-d)
¿Qué significa "Detached"?
Cuando ejecutas un contenedor en modo detached, significa que:
El contenedor corre en segundo plano
Tu terminal queda libre para otros comandos
El contenedor sigue funcionando aunque cierres la terminal
Ejemplo Práctico
# SIN detached - el contenedor ocupa tu terminal
docker container run docker/getting-started# CON detached - el contenedor corre en segundo plano
docker container run -d docker/getting-startedVisualización del Comportamiento
ANTES (sin -d): DESPUÉS (con -d):
┌─────────────────┐ ┌─────────────────┐
│ Terminal │ │ Terminal │
│ │ │ │
│ $ docker run │ │ $ docker run -d │
│ │ │ $ │
│ [log1] ← Bloquea │ │ [tu cursor aquí] │
│ [log2] │ │ │
│ [log3] │ │ ┌─────────────┐ │
│ Control+C para │ │ │ Contenedor │ │
│ detener │ │ │ corriendo │ │
└─────────────────┘ │ │ en bg │ │
│ └─────────────┘ │
└────────────────┘Comandos para Gestionar Contenedores Detached
# Ver contenedores corriendo
docker container ls
# Ver TODOS los contenedores (incluyendo detenidos)
docker container ls -a
# Detener un contenedor
docker container stop <ID_o_nombre>
# Iniciar un contenedor detenido
docker container start <ID_o_nombre>
# Ver logs de un contenedor detached
docker container logs <ID_o_nombre>🌐 Parte 2: Modo Publish (-p)
¿Qué es el "Port Publishing"?
El port publishing es como instalar un teléfono en tu habitación aislada:
La habitación (contenedor) tiene un número interno (puerto 80)
Instalas un teléfono que conecta el número interno con un número externo (puerto 8080)
Ahora puedes llamar desde fuera al número externo y llegar a la habitación
Sintaxis del Comando -p
# Formato: -p HOST_PORT:CONTAINER_PORT
docker container run -p 8080:80 getting-started
# Esto significa:
# "Conecta el puerto 8080 de mi computadora
# con el puerto 80 del contenedor"Diagrama de Conexión
ANTES (sin publish): DESPUÉS (con -p 8080:80):
┌─────────────────────┐ ┌─────────────────────┐
│ TU COMPUTADORA │ │ TU COMPUTADORA │
│ │ │ │
│ Navegador → :8080 │ │ Navegador → :8080 │
│ × Fallo! │ │ ↓ │
│ │ │ CONEXIÓN │
│ ┌─────────────┐ │ │ 8080:80 │
│ │ Contenedor │ │ │ ↓ │
│ │ :80 │ │ │ ┌─────────────┐ │
│ └─────────────┘ │ │ │ Contenedor │ │
│ × Aislado │ │ │ :80 ✓ │ │
└─────────────────────┘ │ └─────────────┘ │
└─────────────────────┘Ejemplos Comunes
# Ejemplo 1: Mapear puerto 80 del host al 80 del contenedor
docker container run -d -p 80:80 getting-started
# Ejemplo 2: Mapear puerto 8080 del host al 80 del contenedor
docker container run -d -p 8080:80 getting-started
# Ejemplo 3: Mapear múltiples puertos
docker container run -d -p 80:80 -p 443:443 getting-started
# Ejemplo 4: Docker elige puerto aleatorio del host
docker container run -d -p 80 getting-started🔧 Parte 3: Combinando Ambos Modos
Uso en la Vida Real
En la práctica, casi siempre usarás ambos modos juntos:
# Forma LARGA (explicativa)
docker container run --detached --publish 8080:80 getting-started
# Forma CORTA (la más usada)
docker container run -d -p 8080:80 getting-started
# Forma MÁS CORTA aún
docker container run -dp 8080:80 getting-startedFlujo Completo de Trabajo
1. DESCARGAR y EJECUTAR:
$ docker run -dp 8080:80 getting-started
↓
[Contenedor corre en bg, puerto mapeado]
2. VERIFICAR:
$ docker container ls
↓
CONTAINER ID PORTS
abc123 0.0.0.0:8080->80/tcp
3. PROBAR:
Abre navegador → http://localhost:8080
4. DETENER:
$ docker container stop abc123
5. ELIMINAR:
$ docker container rm abc123🧹 Parte 4: Limpieza y Gestión
Comandos Esenciales de Limpieza
# 1. Detener todos los contenedores corriendo
docker container stop $(docker container ls -q)
# 2. Eliminar todos los contenedores detenidos
docker container rm $(docker container ps -a -q)
# 3. Eliminar un contenedor específico (forzado si está corriendo)
docker container rm -f <container_id>
# 4. Eliminar imágenes no usadas
docker image prune -a
# 5. Ver espacio usado por Docker
docker system dfSecuencia de Limpieza Paso a Paso
# Paso 1: Ver qué tenemos
docker container ls -a
docker image ls
# Paso 2: Detener contenedor si está corriendo
docker container stop <id>
# Paso 3: Eliminar contenedor
docker container rm <id>
# Paso 4: Eliminar imagen
docker image rm getting-started
# Verificar que todo esté limpio
docker container ls -a # No debería mostrar nada
docker image ls # No debería mostrar getting-started❓ Cuestionario de Evaluación
Pregunta 1
¿Qué sucede si ejecutas docker run getting-started sin el flag -d?
a) El contenedor corre en segundo plano
b) El contenedor ocupa la terminal hasta que lo detengas
c) El contenedor no se ejecuta
d) El contenedor se ejecuta y se auto-elimina
Pregunta 2
Si ejecutas docker run -p 3000:80 webapp, ¿cómo accedes desde tu navegador?
a) http://localhost:80
b) http://localhost:3000
c) http://webapp:80
d) http://3000:localhost
Pregunta 3
¿Qué comando usarías para ejecutar un contenedor en segundo plano mapeando el puerto 8080 de tu máquina al 80 del contenedor?
a) docker run getting-started
b) docker run -d getting-started
c) docker run -p 80:80 getting-started
d) docker run -dp 8080:80 getting-started
Pregunta 4
Tienes un contenedor corriendo con ID abc123. ¿Cómo verías sus logs sin detenerlo?
a) docker stop abc123
b) docker logs abc123
c) docker rm abc123
d) docker attach abc123
Pregunta 5
¿Qué hace el comando docker container rm -f container_id?
a) Detiene el contenedor suavemente
b) Elimina el contenedor aunque esté corriendo
c) Solo elimina la imagen
d) Reinicia el contenedor
Pregunta 6
Si ejecutas docker run -p 80 nginx, ¿qué puerto de tu máquina se usará?
a) Siempre el 80
b) Siempre el 8080
c) Docker elige uno aleatorio disponible
d) Ninguno, hay error
Pregunta 7
¿Cuál es la diferencia entre docker container stop y docker container rm?
a) stop elimina el contenedor, rm solo lo detiene
b) stop detiene el contenedor, rm lo elimina
c) Son sinónimos
d) stop es para imágenes, rm para contenedores
Pregunta 8
Tienes 3 contenedores corriendo. ¿Qué comando usarías para detenerlos todos a la vez?
a) docker container stop 1 2 3
b) docker container stop $(docker container ls -q)
c) docker system prune
d) docker container rm --all
📋 Respuestas del Cuestionario
b) El contenedor ocupa la terminal hasta que lo detengas
d)
docker run -dp 8080:80 getting-startedb)
docker logs abc123b) Elimina el contenedor aunque esté corriendo
c) Docker elige uno aleatorio disponible
b)
stopdetiene el contenedor,rmlo eliminab)
docker container stop $(docker container ls -q)
Tutorial Mejorado: Primeros Pasos con Docker - Puertos y Modos
🎯 Objetivo del Tutorial
Aprenderás a ejecutar tu primer contenedor Docker, entender cómo funcionan los puertos y controlar si el contenedor corre en primer o segundo plano.
🔍 Verificación Inicial
Antes de comenzar, verifica que no tengas servicios corriendo en el puerto 80:
Abre tu navegador web
Visita:
http://localhostResultado esperado: Deberías ver un error o página en blanco
Si ves algo como:
┌─────────────────────────┐
│ │
│ ¡Algo ya está aquí! │
│ (Apache, nginx, etc.) │
│ │
└─────────────────────────┘
→ Tendrás que usar otro puerto (ej: 8080)¿Por qué verificamos esto? El puerto 80 es el puerto HTTP estándar. Si algo ya lo está usando (como otro servidor web), Docker no podrá usarlo a menos que cambiemos la configuración.
🐣 Tu Primer Contenedor Docker
Paso 1: Ejecutar la Imagen Oficial de Práctica
Docker tiene una imagen llamada getting-started perfecta para aprender:
# Forma básica (se bloquea la terminal)
docker container run docker/getting-startedLo que sucede:
Docker descarga la imagen si no la tienes
Crea un contenedor a partir de ella
Muestra los logs directamente en tu terminal
Problema: Tu terminal queda bloqueada
Paso 2: Entender las Capas de Docker
Cuando descargas una imagen, ves algo como:
✓ Downloaded layer: sha256:54fde... [Tamaño]
✓ Downloaded layer: sha256:789ab... [Tamaño]
✓ Downloaded layer: sha256:123cd... [Tamaño]Analogía: Piensa en una imagen Docker como un pastel de capas:
Cada capa es un cambio específico (agregar archivos, instalar software, etc.)
Si otra imagen usa las mismas capas, Docker las reutiliza (¡eficiente!)
Las capas son de solo lectura. Cuando ejecutas un contenedor, se añade una capa de escritura temporal
Paso 3: El Problema del Aislamiento
Después de ejecutar el contenedor, si recargas http://localhost:
Seguirás viendo nada o el mismo error
¿Por qué? Por defecto, los contenedores están completamente aislados
┌─────────────────────────────────┐
│ TU MÁQUINA │
│ ┌─────────────────────────┐ │
│ │ CONTENEDOR │ │
│ │ ┌─────────────────┐ │ │
│ │ │ Web app │ │ │
│ │ │ (puerto 80) │ │ │
│ │ └─────────────────┘ │ │
│ │ 🔒 AISLADO │ │
│ └─────────────────────────┘ │
│ │
│ Navegador → localhost:80 │
│ × NO CONECTA │
└─────────────────────────────────┘🎪 Modo Detached: Liberando tu Terminal
El Flag -d (detached)
Para que el contenedor corra en segundo plano:
# Forma correcta: contenedor en segundo plano
docker container run -d docker/getting-startedDiferencia visual:
ANTES (sin -d): DESPUÉS (con -d):
┌─────────────────┐ ┌─────────────────┐
│ $ docker run │ │ $ docker run -d │
│ │ │ container_id │ ← ¡Tu terminal
│ [log línea 1] │ │ $ │ queda libre!
│ [log línea 2] │ │ │
│ [log línea 3] │ │ El contenedor │
│ │ │ sigue corriendo │
│ Presiono Ctrl+C │ │ en bg │
│ → Contenedor se │ │ │
│ detiene │ │ │
└─────────────────┘ └─────────────────┘Gestionando Contenedores Detached
# Ver contenedores activos
docker container ls
# Detener un contenedor
docker container stop <id_o_nombre>
# Ver los logs sin bloquear
docker container logs <id>Importante: Con -d, Ctrl+C ya no detiene el contenedor. ¡Debes usar docker container stop!
🌉 Publicando Puertos: Conectando el Interior con el Exterior
El Flag -p (publish)
Para conectar un puerto de tu máquina con un puerto del contenedor:
# Sintaxis: -p PUERTO_HOST:PUERTO_CONTENEDOR
docker container run -d -p 80:80 docker/getting-started¿Qué significa -p 80:80?
Primer 80: Puerto de TU computadora
Segundo 80: Puerto INTERNO del contenedor
Traducción: "Lo que esté en el puerto 80 del contenedor, hazlo accesible en el puerto 80 de mi máquina"
Ejemplo Práctico con Cambio de Puerto
Si ya tienes algo en el puerto 80 de tu máquina:
# Usa el puerto 8080 de tu máquina en lugar del 80
docker container run -d -p 8080:80 docker/getting-startedAcceso:
Contenedor escucha en: puerto 80 (interno)
Tú accedes por:
http://localhost:8080
Visualización del Mapeo
ANTES (sin -p): DESPUÉS (con -p 8080:80):
┌─────────────────────────┐ ┌─────────────────────────┐
│ LOCALHOST │ │ LOCALHOST │
│ │ │ │
│ NAVEGADOR │ │ NAVEGADOR │
│ ↓ │ │ ↓ │
│ localhost:8080 │ │ localhost:8080 │
│ × No responde │ │ ↓ │
│ │ │ [CONEXIÓN] │
│ ┌─────────────────┐ │ │ ↓ │
│ │ CONTENEDOR │ │ │ ┌─────────────────┐ │
│ │ Aplicación │ │ │ │ CONTENEDOR │ │
│ │ puerto: 80 │ │ │ │ Aplicación │ │
│ └─────────────────┘ │ │ │ puerto: 80 ✓ │ │
└─────────────────────────┘ │ └─────────────────┘ │
└─────────────────────────┘🔄 Ciclo Completo de Vida de un Contenedor
Ejercicio Guiado
# 1. Ejecutar contenedor con nombre personalizado
docker container run -d --name mi-prueba -p 8080:80 docker/getting-started
# 2. Verificar que está corriendo
docker container ls
# 3. Acceder en navegador
# Abre: http://localhost:8080
# 4. Detener el contenedor
docker container stop mi-prueba
# 5. Verificar que se detuvo
docker container ls # No aparece (solo muestra activos)
docker container ls -a # Aparece como detenido
# 6. Re-iniciar el contenedor
docker container start mi-prueba
# 7. Eliminar el contenedor (primero detenerlo si está corriendo)
docker container stop mi-prueba
docker container rm mi-prueba
# 8. Eliminar la imagen
docker image rm docker/getting-startedEliminación Forzada
Si necesitas eliminar un contenedor que está corriendo:
# Opción 1: Detener y luego eliminar
docker container stop mi-contenedor
docker container rm mi-contenedor
# Opción 2: Eliminar forzadamente (detiene y elimina)
docker container rm -f mi-contenedor📊 Resumen Visual de Comandos
INICIO
│
▼
docker run -dp 8080:80 getting-started
│
├──► Contenedor corre en segundo plano (-d)
└──► Puerto 8080 local → puerto 80 contenedor (-p)
│
▼
http://localhost:8080 ✓
│
▼
docker container ls # Ver estado
│
▼
docker container stop <id> # Detener
│
▼
docker container rm <id> # Eliminar
│
▼
docker image rm getting-started # Limpiar imagen🎓 Consejos Finales
Nombra tus contenedores: Usa
--name mi-nombrepara facilitar su gestiónPuertos altos: Usa puertos > 1024 (8080, 3000, etc.) para evitar conflictos
Verifica siempre: Usa
docker container lsdespués de cada operaciónLimpia regularmente: Contenedores e imágenes detenidos ocupan espacio
✅ Práctica Recomendada
La imagen docker/getting-started incluye un tutorial interactivo excelente. Una vez que tengas el contenedor corriendo (con -dp 8080:80), visita http://localhost:8080 y completa el tutorial oficial de Docker. ¡Te tomará unos 30-60 minutos y reforzará todo lo aprendido aquí!
¿Listo para continuar?
Siguiente paso: Aprender sobre volúmenes y redes en Docker
Comentarios
Publicar un comentario