cd ../blog
docker-y-docker-compose.md

$ cat docker-y-docker-compose.md

Docker y Docker Compose

5 de abril de 2026
dockerdocker-compose

Docker y Docker Compose

¿Qué son?

Docker es una plataforma de contenedores que permite empaquetar aplicaciones y sus dependencias en unidades estandarizadas llamadas contenedores.

Docker Compose es una herramienta para definir y ejecutar aplicaciones multi-contenedor usando un archivo YAML.

Ventajas en el Desarrollo de Software

🔄 Consistencia entre entornos

  • Elimina el "funciona en mi máquina"
  • Mismo entorno desde desarrollo hasta producción

Rápida configuración

  • Levantar entornos complejos con un solo comando
  • Eliminar horas de configuración manual

📦 Aislamiento

  • Cada servicio (BD, backend, frontend) en su contenedor
  • Sin conflictos de versiones o dependencias

🚀 Productividad

  • Integración continua simplificada
  • Onboarding rápido de nuevos desarrolladores

💾 Eficiencia de recursos

  • Más livianos que máquinas virtuales
  • Comparten el kernel del sistema operativo

🔧 Escalabilidad

  • Fácil replicar servicios
  • Ideal para microservicios

Comandos Principales de Docker

Gestión de Contenedores

# Ejecutar un contenedor
docker run nginx

# Ejecutar en modo detached (background)
docker run -d nginx

# Listar contenedores activos
docker ps

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

# Detener un contenedor
docker stop <id>

# Iniciar un contenedor detenido
docker start <id>

# Reiniciar un contenedor
docker restart <id>

# Eliminar un contenedor
docker rm <id>

# Eliminar contenedor forzosamente
docker rm -f <id>

Gestión de Imágenes

# Listar imágenes locales
docker images

# Descargar una imagen
docker pull ubuntu:latest

# Construir una imagen desde Dockerfile
docker build -t mi-app:1.0 .

# Eliminar una imagen
docker rmi <image-id>

# Ver historial de capas de una imagen
docker history <image-name>

Logs y Debugging

# Ver logs de un contenedor
docker logs <id>

# Ver logs en tiempo real
docker logs -f <id>

# Ejecutar comando dentro de contenedor en ejecución
docker exec -it <id> bash

# Ver procesos dentro del contenedor
docker top <id>

# Ver estadísticas de recursos
docker stats

Networking y Volúmenes

# Listar redes
docker network ls

# Crear red personalizada
docker network create mi-red

# Listar volúmenes
docker volume ls

# Crear volumen
docker volume create mi-volumen

Limpieza

# Eliminar contenedores detenidos
docker container prune

# Eliminar imágenes no utilizadas
docker image prune

# Eliminar todo (contenedores, redes, volúmenes no usados)
docker system prune -a

Comandos de Docker Compose

Archivo básico docker-compose.yml

version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - .:/app
    environment:
      - NODE_ENV=development
  
  database:
    image: postgres:14
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: myapp
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  postgres_data:

Comandos esenciales

# Levantar todos los servicios (modo detached)
docker-compose up -d

# Levantar y reconstruir imágenes
docker-compose up -d --build

# Ver servicios activos
docker-compose ps

# Ver logs de todos los servicios
docker-compose logs

# Ver logs de un servicio específico
docker-compose logs web

# Detener servicios (mantiene contenedores)
docker-compose stop

# Detener y eliminar contenedores
docker-compose down

# Detener y eliminar también volúmenes
docker-compose down -v

# Reiniciar servicios
docker-compose restart

# Ejecutar comando en un servicio
docker-compose exec web npm install

# Verificar sintaxis del compose file
docker-compose config

# Escalar un servicio
docker-compose up -d --scale web=3

Ejemplo Práctico: Aplicación Node.js + PostgreSQL

Estructura del proyecto

mi-app/
├── Dockerfile
├── docker-compose.yml
├── package.json
└── index.js

Dockerfile

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

docker-compose.yml

version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      - DB_HOST=db
      - DB_USER=postgres
      - DB_PASSWORD=secret
      - DB_NAME=myapp
    volumes:
      - .:/app
      - /app/node_modules

  db:
    image: postgres:14-alpine
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=myapp
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Comandos para este proyecto

# Primera vez: construir y levantar
docker-compose up -d --build

# Ver logs de la app
docker-compose logs -f app

# Acceder a la base de datos
docker-compose exec db psql -U postgres -d myapp

# Detener todo
docker-compose down

Mejores Prácticas

  1. Usar .dockerignore - Evita copiar archivos innecesarios
  2. Imágenes pequeñas - Prefiere alpine cuando sea posible
  3. Un proceso por contenedor - No ejecutes múltiples servicios
  4. Versiones específicas - Usa tags específicos, no latest
  5. Volúmenes para datos - No guardes datos dentro del contenedor
  6. Variables de entorno - No hardcodees configuraciones
  7. Healthchecks - Configura verificaciones de salud

Recursos Útiles