🐳

Docker Básico

🧑‍🎓 Aprendiz

¿Qué problema resuelve Docker?

Imagina este escenario (que pasa TODO el tiempo):

SituaciónLo que escuchas
Desarrollador"En mi máquina funciona perfecto"
Servidor de producciónError 500, crash, dependencias faltantes
Nuevo desarrollador"Llevo 2 días configurando el entorno"
DevOps"¿Qué versión de Node usaste? ¿Y de Python?"

Docker resuelve esto empaquetando tu aplicación CON TODO lo que necesita: código, runtime, librerías, configuración. Si funciona en Docker, funciona en cualquier lado.


🖥️ Máquinas Virtuales vs Contenedores

    MÁQUINA VIRTUAL                    CONTENEDOR (DOCKER)
    ─────────────────                  ────────────────────

    ┌─────────────────┐               ┌──────┐ ┌──────┐ ┌──────┐
    │      App        │               │ App1 │ │ App2 │ │ App3 │
    ├─────────────────┤               ├──────┴─┴──────┴─┴──────┤
    │  Libs/Binaries  │               │     Libs/Binaries      │
    ├─────────────────┤               ├────────────────────────┤
    │   Guest OS      │  ← SO completo│     Docker Engine      │
    │  (Ubuntu 8GB)   │               │       (~100MB)         │
    ├─────────────────┤               ├────────────────────────┤
    │   Hypervisor    │               │        Host OS         │
    ├─────────────────┤               ├────────────────────────┤
    │    Host OS      │               │       Hardware         │
    ├─────────────────┤               └────────────────────────┘
    │   Hardware      │
    └─────────────────┘

    🐢 Pesado: 10-20 GB por VM        🚀 Ligero: 100-500 MB
    ⏱️ Boot: 1-2 minutos              ⏱️ Boot: 1-2 segundos
    📦 Aislamiento completo           📦 Aislamiento a nivel proceso

💰 Ahorro de recursos

MétricaVM TradicionalContenedor Docker
RAM por instancia1-8 GB50-500 MB
Disco10-40 GB100 MB - 2 GB
Tiempo de inicio30s - 2min1-5 segundos
Apps por servidor5-10 VMs50-100+ contenedores
CPU overhead15-20%1-5%

💡 En un servidor con 32GB RAM: puedes correr ~4 VMs o ~50 contenedores haciendo lo mismo.


¿Por qué es esencial para el desarrollador moderno?

UsoBeneficio
Desarrollo localEl mismo entorno que producción
OnboardingNuevo dev productivo en minutos, no días
CI/CDTests en ambiente idéntico a producción
MicroserviciosCada servicio en su contenedor
ExperimentarProbar tecnologías sin ensuciar tu sistema
EscalabilidadKubernetes orquesta miles de contenedores

🔧 Alternativas a Docker

Docker popularizó los contenedores, pero no es la única opción:

TecnologíaCreadorCaracterísticas
DockerDocker IncEl más popular, Docker Hub, Docker Desktop
PodmanRed HatSin daemon, rootless, compatible con Docker CLI
containerdCNCFRuntime usado por Docker y Kubernetes
LXC/LXDCanonicalContenedores de sistema (más parecido a VMs)
ColimaOpen SourceDocker en macOS/Linux sin Docker Desktop

💡 Tip: Si usas Linux y quieres evitar Docker Desktop, Podman es la alternativa más popular. Los comandos son casi idénticos: podman run en lugar de docker run.


Conceptos clave

ConceptoQué esAnalogía
ImagenPlantilla inmutableReceta escrita
ContenedorInstancia de una imagenPlatillo preparado
DockerfileInstrucciones para crear imagenPasos de la receta
RegistryRepositorio de imágenesBiblioteca de recetas
VolumenDatos persistentesIngredientes que guardas
RedComunicación entre contenedoresConexión entre cocinas

Instalación

SistemaOpción recomendadaAlternativa ligera
macOSbrew install --cask dockerColima + Docker CLI
WindowsDocker Desktop (WSL2)Podman Desktop
LinuxDocker EnginePodman (sin daemon)
# Verificar instalación
docker --version
docker run hello-world

Ciclo de vida de un contenedor

    Dockerfile     docker build      Imagen        docker run      Contenedor
    ──────────  ─────────────────▶  ────────  ───────────────────▶  ──────────
    (receta)                        (platillo                       (servido)
                                    congelado)

    docker push                     docker pull
    ───────────▶ Docker Hub ◀───────────────────
                 (registro)

Tu primer contenedor

# Prueba que Docker funciona
docker run hello-world

# Ejecutar Ubuntu interactivo
docker run -it ubuntu bash

# Dentro del contenedor:
cat /etc/os-release  # Ubuntu!
exit                 # Salir

Comandos esenciales

# ===== CONTENEDORES =====
docker ps                    # Ver corriendo
docker ps -a                 # Ver todos
docker run -d nginx          # Ejecutar en background
docker run -p 8080:80 nginx  # Mapear puerto
docker stop <id>             # Parar
docker rm <id>               # Eliminar
docker logs <id>             # Ver logs
docker exec -it <id> bash    # Entrar a contenedor

# ===== IMÁGENES =====
docker images                # Ver imágenes locales
docker pull node:20          # Descargar imagen
docker rmi <imagen>          # Eliminar imagen

# ===== LIMPIEZA =====
docker system prune          # Eliminar todo lo no usado

Ejemplo práctico: Servidor web en 10 segundos

# Nginx sirviendo archivos de tu carpeta actual
docker run -d -p 8080:80 -v $(pwd):/usr/share/nginx/html nginx

# Abre http://localhost:8080

Tu primer Dockerfile

# Imagen base
FROM node:20-alpine

# Directorio de trabajo
WORKDIR /app

# Copiar dependencias primero (mejor cache)
COPY package*.json ./
RUN npm ci

# Copiar código
COPY . .

# Puerto que expone
EXPOSE 3000

# Comando al iniciar
CMD ["npm", "start"]
# Construir imagen
docker build -t mi-app .

# Ejecutar
docker run -p 3000:3000 mi-app

Casos de uso comunes

# Base de datos PostgreSQL (datos persistentes)
docker run -d \
  --name postgres \
  -e POSTGRES_PASSWORD=secreto \
  -v pgdata:/var/lib/postgresql/data \
  -p 5432:5432 \
  postgres:16

# Redis para cache
docker run -d --name redis -p 6379:6379 redis:alpine

# Adminer (interfaz web para DBs)
docker run -d -p 8081:8080 adminer

¿Cuándo NO usar Docker?

SituaciónPor qué
Apps GUI desktopDocker es para servicios, no para apps visuales
Máximo rendimientoEl overhead es mínimo pero existe
Scripts simplesOverkill para un script de 10 líneas
Hardware específicoGPUs requieren configuración extra

Siguiente nivel

Docker Compose — Orquesta múltiples contenedores


🍳 Practica

Docker Hello World — Tu primer contenedor


Enlaces útiles