Docker para desarrolladores: imágenes, contenedores y Compose
Probablemente hayas oído hablar de Docker y de cómo puede simplificar tu flujo de trabajo de desarrollo. Pero cuando te encuentras por primera vez con términos como imágenes, contenedores y Docker Compose, puede resultar abrumador. Esta guía elimina el ruido y te muestra exactamente cómo usar Docker de forma eficaz en tus proyectos.
¿Qué es Docker y por qué debería importarte?
Docker es una plataforma que empaqueta tu aplicación y sus dependencias en una unidad estandarizada llamada contenedor. Los contenedores son ligeros, portables y están aislados entre sí. Resuelven el clásico problema de "funciona en mi máquina" asegurando que tu app se ejecute de la misma manera en todas partes.
A diferencia de las máquinas virtuales, los contenedores comparten el kernel del sistema operativo anfitrión, lo que los hace más rápidos de iniciar y más eficientes. Por eso Docker se ha convertido en un pilar de los pipelines modernos de desarrollo y despliegue.
Imágenes vs. contenedores: los bloques de construcción
Una imagen es una plantilla de solo lectura que contiene el código de tu aplicación, el runtime, las librerías y la configuración. Un contenedor es una instancia en ejecución de una imagen. Piensa en una imagen como una clase y en un contenedor como un objeto.
Crearás imágenes usando un Dockerfile. Aquí tienes un ejemplo sencillo para una app Node.js:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Cada línea del Dockerfile crea una capa. Las capas se almacenan en caché, por lo que las reconstrucciones son más rápidas cuando solo cambian los pasos posteriores.
Comandos comunes de Docker
docker build -t my-app .— construye una imagen desde el directorio actualdocker run -p 3000:3000 my-app— ejecuta un contenedor y mapea puertosdocker ps— lista los contenedores en ejecucióndocker stop <container_id>— detiene un contenedordocker rmi <image_id>— elimina una imagen
Docker Compose: gestionar apps multi-contenedor
Las apps del mundo real a menudo necesitan más de un servicio: un servidor web, una base de datos, una caché. Docker Compose te permite definir y ejecutar aplicaciones multi-contenedor con un único archivo YAML.
Aquí tienes un docker-compose.yml para una app Node.js con PostgreSQL y Redis:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
cache:
image: redis:7
volumes:
pgdata:
Ejecuta docker compose up y todos los servicios se inician juntos. El depends_on asegura que la base de datos y la caché se inicien antes que el servicio web.
Comandos clave de Compose
docker compose up -d— inicia todos los servicios en modo detacheddocker compose down— detiene y elimina contenedores y redesdocker compose logs -f web— sigue los logs de un servicio específicodocker compose exec web sh— abre una shell dentro de un contenedor en ejecución
Buenas prácticas para desarrollo
- Usa .dockerignore para excluir node_modules, .git y otros archivos innecesarios del contexto de build.
- Mantén las imágenes pequeñas usando imágenes basadas en Alpine y builds multi-stage.
- No ejecutes como root — crea un usuario no root en tu Dockerfile por seguridad.
- Usa volúmenes para datos persistentes y bind mounts para recarga de código en vivo durante el desarrollo.
- Fija versiones en tu Dockerfile y archivo Compose para evitar actualizaciones inesperadas.
Cuándo usar Docker (y cuándo no)
Docker destaca cuando necesitas entornos consistentes entre equipos, gestión sencilla de dependencias o microservicios. Puede ser excesivo para sitios estáticos simples o scripts. Evalúa según la complejidad de tu proyecto y tus necesidades de despliegue.
FAQ
¿Cuál es la diferencia entre una imagen y un contenedor?
Una imagen es una plantilla estática; un contenedor es una instancia en ejecución de esa imagen. Puedes ejecutar múltiples contenedores desde la misma imagen.
¿Necesito Docker Compose para un solo contenedor?
No, para un solo contenedor puedes usar docker run. Compose es útil cuando tienes múltiples servicios que necesitan comunicarse.
¿Cómo persisto datos en Docker?
Usa volúmenes o bind mounts. Los volúmenes son gestionados por Docker y son ideales para bases de datos; los bind mounts mapean un directorio del host dentro del contenedor, útiles para desarrollo.
¿Listo para optimizar tus apps dockerizadas? Si trabajas con logs de Nginx dentro de contenedores, prueba nuestro Analizador de Logs de Nginx para parsear y analizar logs rápidamente.