Docker para desarrolladores: imágenes, contenedores y Compose
Como desarrollador, probablemente hayas enfrentado la frustración de las inconsistencias entre entornos: "¡Funciona en mi máquina!" Docker resuelve esto empaquetando aplicaciones en contenedores. Esta guía explica las imágenes de Docker, los contenedores y Compose para ayudarte a construir, distribuir y ejecutar aplicaciones de forma consistente.
¿Qué es Docker?
Docker es una plataforma para desarrollar, distribuir y ejecutar aplicaciones en contenedores. Los contenedores son paquetes ligeros, autónomos y ejecutables que incluyen todo lo necesario para ejecutar software: código, runtime, herramientas del sistema, librerías y configuraciones.
Imágenes vs. Contenedores
Una imagen es una plantilla de solo lectura con instrucciones para crear un contenedor. Un contenedor es una instancia ejecutable de una imagen. Puedes crear múltiples contenedores a partir de la misma imagen, cada uno aislado de los demás.
Trabajar con imágenes
Las imágenes se construyen a partir de un Dockerfile, un archivo de texto con instrucciones. Aquí tienes un ejemplo simple de Node.js:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Construye la imagen con:
docker build -t my-app .
Lista las imágenes: docker images
Ejecutar contenedores
Inicia un contenedor a partir de una imagen:
docker run -d -p 3000:3000 --name my-container my-app
Esto ejecuta el contenedor en modo detached (-d), mapea el puerto 3000 y lo nombra my-container.
Lista los contenedores en ejecución: docker ps
Detén un contenedor: docker stop my-container
Elimina un contenedor: docker rm my-container
¿Por qué usar Docker Compose?
Cuando tu aplicación depende de múltiples servicios (base de datos, caché, etc.), gestionar contenedores individuales se vuelve tedioso. Docker Compose te permite definir y ejecutar aplicaciones multicontenedor usando un archivo YAML.
Ejemplo de archivo Compose
Crea docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Inicia todos los servicios: docker compose up -d
Detén y elimina: docker compose down
Buenas prácticas para desarrolladores
- Usa .dockerignore: Excluye archivos innecesarios (node_modules, .git) para acelerar las builds.
- Builds multi-stage: Mantén las imágenes de producción pequeñas separando las etapas de build y runtime.
- Aprovecha el caché: Ordena las instrucciones del Dockerfile de la menos a la más cambiante.
- Etiqueta las imágenes correctamente: Evita usar
latesten producción; usa versionado semántico. - Escanea vulnerabilidades: Usa
docker scanpara revisar las imágenes en busca de problemas conocidos.
Chuleta de comandos comunes
| Comando | Descripción |
|---|---|
docker build -t name . | Construir una imagen desde el Dockerfile |
docker run -p host:container image | Ejecutar un contenedor y mapear puertos |
docker ps -a | Listar todos los contenedores |
docker exec -it container bash | Abrir una shell dentro de un contenedor en ejecución |
docker compose up | Iniciar los servicios definidos en el archivo Compose |
docker compose logs -f | Seguir los logs de todos los servicios |
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 crear muchos contenedores a partir de una sola imagen.
¿Cuándo debería usar Docker Compose?
Usa Compose cuando tu aplicación requiera múltiples servicios (por ejemplo, servidor web, base de datos, caché) que necesiten ejecutarse juntos. Simplifica la orquestación para desarrollo y pruebas.
¿Cómo persisto datos en Docker?
Usa volúmenes o bind mounts. Los volúmenes son gestionados por Docker y se almacenan en un área dedicada; los bind mounts se enlazan a un directorio del host. Ambos sobreviven a los reinicios de los contenedores.
¿Listo para optimizar tu flujo de trabajo con Docker? Prueba nuestro Analizador de Logs de Nginx para depurar los logs de tus contenedores rápidamente.