Docker para Desarrolladores: Imágenes, Contenedores y Compose
Probablemente hayas oído hablar de Docker y los contenedores, pero quizás no tengas claro cómo encajan en tu flujo de trabajo diario. O tal vez hayas probado Docker, pero los conceptos de imágenes, contenedores y Compose te resulten confusos. Esta guía te llevará por los aspectos esenciales con ejemplos prácticos, para que puedas empezar a usar Docker de forma efectiva en tus proyectos.
¿Qué son las imágenes y los contenedores de Docker?
Piensa en una imagen de Docker como un plano para tu aplicación. Contiene todo lo necesario para ejecutar tu código: el sistema operativo, el runtime, las librerías y los archivos de tu aplicación. Las imágenes son inmutables y se construyen a partir de un Dockerfile.
Un contenedor es una instancia en ejecución de una imagen. Cuando inicias un contenedor, Docker crea un entorno aislado a partir de la imagen. Puedes ejecutar varios contenedores desde la misma imagen, cada uno con su propio estado.
Diferencias clave
| Imagen | Contenedor |
|---|---|
| Plantilla de solo lectura | Instancia ejecutable |
| Construida desde Dockerfile | Creado desde una imagen |
| Almacenada en un registro | Se ejecuta en el host |
| Inmutable | Efímero (se puede detener, iniciar, eliminar) |
Construyendo tu primera imagen de Docker
Vamos a crear una aplicación simple de Node.js y contenerizarla. Comienza con un Dockerfile en la raíz de tu proyecto:
# Use an official Node.js runtime as a parent image
FROM node:18-alpine
# Set the working directory
WORKDIR /app
# Copy package.json and package-lock.json
COPY package*.json ./
# Install dependencies
RUN npm ci --only=production
# Copy the rest of the application code
COPY . .
# Expose the port the app runs on
EXPOSE 3000
# Define the command to run the app
CMD ["node", "server.js"]
Construye la imagen con:
docker build -t my-node-app .
Ejecuta un contenedor desde la imagen:
docker run -p 3000:3000 -d my-node-app
Tu aplicación ahora es accesible en http://localhost:3000.
Gestionando contenedores
Aquí tienes comandos esenciales para gestionar contenedores:
docker ps– lista los contenedores en ejecucióndocker ps -a– lista todos los contenedores (incluyendo los detenidos)docker stop <container_id>– detiene un contenedor en ejecucióndocker rm <container_id>– elimina un contenedor detenidodocker logs <container_id>– ver los logs del contenedordocker exec -it <container_id> sh– abrir una shell dentro de un contenedor en ejecución
Simplificando aplicaciones multicontenedor con Docker Compose
Las aplicaciones reales a menudo necesitan múltiples servicios: un servidor web, una base de datos, una caché, etc. Gestionarlos con comandos individuales docker run es tedioso. Docker Compose te permite definir y ejecutar aplicaciones multicontenedor usando un archivo YAML.
Crea un docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
depends_on:
- db
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Inicia todos los servicios con:
docker compose up -d
Detén y elimínalos con:
docker compose down
Mejores prácticas para el desarrollo
- Usa .dockerignore para excluir archivos innecesarios (node_modules, .git) del contexto de construcción.
- Aprovecha el caché de capas: ordena las instrucciones del Dockerfile para que las dependencias se instalen antes de copiar el código fuente.
- Usa compilaciones multietapa para mantener las imágenes de producción pequeñas.
- Almacena datos en volúmenes para bases de datos y otros servicios con estado.
- Usa Compose para el desarrollo local para replicar entornos similares a producción.
Preguntas frecuentes
¿Cuál es la diferencia entre una imagen y un contenedor?
Una imagen es una plantilla de solo lectura que define la aplicación y sus dependencias. Un contenedor es una instancia en ejecución de una imagen, con una capa de escritura encima.
¿Puedo usar Docker Compose en producción?
Docker Compose está diseñado principalmente para desarrollo y pruebas. Para producción, considera herramientas de orquestación como Kubernetes o Docker Swarm.
¿Cómo persisto datos en Docker?
Usa volúmenes o bind mounts. Los volúmenes son gestionados por Docker y son la forma preferida de persistir datos generados por los contenedores.
¿Listo para contenerizar tu aplicación? Si necesitas convertir documentación o guías a PDF para tu equipo, prueba nuestro convertidor de Word a PDF para compartir documentos pulidos.