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

text
┌─────────────────────────────────────────────┐
│           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

bash
# 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-started

Visualización del Comportamiento

text
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

bash
# 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

$ docker container run -d -p 80:80 docker/getting-started

Sintaxis del Comando -p

bash
# 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

text
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

bash
# 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:

bash
# 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-started

Flujo Completo de Trabajo

text
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

bash
# 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 df

Secuencia de Limpieza Paso a Paso

bash
# 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

  1. b) El contenedor ocupa la terminal hasta que lo detengas

  2. b) http://localhost:3000

  3. d) docker run -dp 8080:80 getting-started

  4. b) docker logs abc123

  5. b) Elimina el contenedor aunque esté corriendo

  6. c) Docker elige uno aleatorio disponible

  7. b) stop detiene el contenedor, rm lo elimina

  8. b) 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:

  1. Abre tu navegador web

  2. Visita: http://localhost

  3. Resultado esperado: Deberías ver un error o página en blanco

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

bash
# Forma básica (se bloquea la terminal)
docker container run docker/getting-started

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

text
✓ 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

text
┌─────────────────────────────────┐
│   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:

bash
# Forma correcta: contenedor en segundo plano
docker container run -d docker/getting-started

Diferencia visual:

text
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

bash
# 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:

bash
# 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:

bash
# Usa el puerto 8080 de tu máquina en lugar del 80
docker container run -d -p 8080:80 docker/getting-started

Acceso:

  • Contenedor escucha en: puerto 80 (interno)

  • Tú accedes por: http://localhost:8080

Visualización del Mapeo

text
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

bash
# 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-started

Eliminación Forzada

Si necesitas eliminar un contenedor que está corriendo:

bash
# 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

text
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

  1. Nombra tus contenedores: Usa --name mi-nombre para facilitar su gestión

  2. Puertos altos: Usa puertos > 1024 (8080, 3000, etc.) para evitar conflictos

  3. Verifica siempre: Usa docker container ls después de cada operación

  4. Limpia 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í!

text
¿Listo para continuar?
Siguiente paso: Aprender sobre volúmenes y redes en Docker

Comentarios

Entradas más populares de este blog

12. Hola Mundo en Docker.

11¿Qué es Docker? y ¿Por qué debo saberlo?