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
# 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
# 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.
# 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.
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
# 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
- Usa imágenes Alpine o Distroless: Mantén las imágenes pequeñas para reducir la superficie de ataque y acelerar los despliegues.
- No ejecutes como root: Define un usuario sin privilegios en tu
Dockerfile(USER node). - Aprovecha el caché de capas: Copia primero tus archivos de dependencias (
package.json,requirements.txt) antes de copiar todo el código fuente. - Utiliza
.dockerignore: Excluye carpetas comonode_modules,.gity archivos.envpara evitar subir información sensible o basura a la imagen.