Guía Práctica de Docker: Contenedores, Compose y Buenas Prácticas

Docker revolucionó la manera en que desarrollamos, desplegamos y escalamos software. Esta guía abarca desde los conceptos básicos hasta comandos avanzados y optimizaciones para entornos de producción.


1. Conceptos Clave

  • Imagen: Plantilla de solo lectura que contiene las instrucciones para crear un contenedor Docker.
  • Contenedor: Instancia ejecutable de una imagen. Es aislado, ligero y portable.
  • Dockerfile: Archivo de texto con los comandos necesarios para construir una imagen.
  • Docker Volume: Mecanismo preferido para persistentar datos generados y usados por contenedores.

2. Comandos Básicos e Imprescindibles

Gestión de Contenedores

bash
# Iniciar un contenedor en segundo plano (detached)
docker run -d -p 8080:80 --name mi-web nginx

# Listar contenedores activos
docker ps

# Listar todos los contenedores (incluyendo detenidos)
docker ps -a

# Detener y eliminar un contenedor
docker stop mi-web
docker rm mi-web

# Ver logs de un contenedor en tiempo real
docker logs -f mi-web

Gestión de Imágenes

bash
# Descargar una imagen desde Docker Hub
docker pull node:18-alpine

# Listar imágenes locales
docker images

# Eliminar una imagen
docker rmi node:18-alpine

# Limpiar recursos no utilizados (imágenes, contenedores, redes)
docker system prune -a


3. Ejemplo Práctico: Dockerfile Multietapa (Multi-stage Build)

Utilizar multi-stage builds permite reducir drásticamente el tamaño de tus imágenes finales en producción.

dockerfile
# Etapa 1: Build
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Etapa 2: Producción
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]


4. Orquestación Local con Docker Compose

Docker Compose te permite definir y ejecutar aplicaciones compuestas por múltiples contenedores mediante un archivo docker-compose.yml.

yaml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://user:password@db:5432/mi_db
    depends_on:
      - db

  db:
    image: postgres:15-alpine
    restart: always
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mi_db
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  postgres_data:

Comandos de Docker Compose

bash
# Iniciar todos los servicios
docker compose up -d

# Ver el estado de los servicios
docker compose ps

# Detener y remover contenedores, redes y volúmenes
docker compose down -v


5. Buenas Prácticas de Seguridad y Rendimiento

  1. Usa imágenes Alpine o Distroless: Mantén las imágenes pequeñas para reducir la superficie de ataque y acelerar los despliegues.
  2. No ejecutes como root: Define un usuario sin privilegios en tu Dockerfile (USER node).
  3. Aprovecha el caché de capas: Copia primero tus archivos de dependencias (package.json, requirements.txt) antes de copiar todo el código fuente.
  4. Utiliza .dockerignore: Excluye carpetas como node_modules, .git y archivos .env para evitar subir información sensible o basura a la imagen.