Docker para Desarrolladores: Imágenes, Contenedores y Compose

DevOps2026-10-10TryQuickToolBox

Eres desarrollador y has oído hablar de Docker. Quizás lo has probado, pero los conceptos de imágenes, contenedores y Compose te resultan confusos. O estás cansado del "funciona en mi máquina" y quieres un entorno consistente. Esta guía elimina el ruido y te da una comprensión práctica de las piezas centrales de Docker y cómo usarlas eficazmente.

¿Por qué Docker para desarrolladores?

Docker resuelve la inconsistencia de entornos. En lugar de instalar dependencias directamente en tu máquina, empaquetas tu aplicación y sus dependencias en un contenedor. Los contenedores se ejecutan igual en todas partes: tu portátil, el de tu colega y producción. Esto elimina la deriva de configuración y hace que la incorporación sea trivial.

Imágenes: El plano

Una imagen es una plantilla de solo lectura. Contiene el código de tu aplicación, el runtime, las librerías y las variables de entorno. Construyes imágenes a partir de un Dockerfile, un archivo de texto con instrucciones.

Aquí tienes un Dockerfile 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 instrucción crea una capa. Las capas se almacenan en caché, por lo que las reconstrucciones son rápidas cuando solo cambia el código. Las imágenes se almacenan en registros como Docker Hub o un registro privado.

Contenedores: La instancia en ejecución

Un contenedor es una instancia ejecutable de una imagen. Está aislado pero comparte el kernel del sistema operativo anfitrión, lo que lo hace ligero. Inicias un contenedor con docker run.

docker run -p 3000:3000 -d my-app

Esto mapea el puerto 3000 del host al puerto 3000 del contenedor y lo ejecuta en modo detached. Los contenedores son efímeros: los cambios se pierden al eliminarlos a menos que uses volúmenes.

Comandos clave:

Docker Compose: Apps multi-contenedor

Las aplicaciones reales a menudo necesitan múltiples servicios: 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:

version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
    depends_on:
      - db
  db:
    image: postgres:15
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=mydb
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:

Ejecuta docker compose up para iniciar ambos servicios. Compose gestiona la red, por lo que web puede alcanzar db por el nombre del servicio.

Cuándo usar Docker Compose vs. Docker simple

EscenarioUsar
Un solo contenedordocker run
Múltiples servicios (app + DB)Docker Compose
Orquestación en producciónKubernetes, Swarm

Mejores prácticas para desarrolladores

Errores comunes

Conflictos de puertos: Si el puerto 3000 está ocupado, mapea a un puerto host diferente: -p 3001:3000.

Pérdida de datos: Sin volúmenes, los datos de la base de datos desaparecen cuando se elimina el contenedor.

Compilaciones lentas: Ordena las instrucciones del Dockerfile de menor a mayor frecuencia de cambio para aprovechar la caché.

FAQ

¿Cuál es la diferencia entre una imagen y un contenedor?

Una imagen es una plantilla de solo lectura; un contenedor es una instancia en ejecución de esa imagen. Puedes ejecutar varios contenedores desde la misma imagen.

¿Necesito Docker Compose para un solo servicio?

No. Compose brilla cuando tienes múltiples servicios. Para un solo contenedor, docker run es más sencillo.

¿Cómo persisto datos en Docker?

Usa volúmenes. Define un volumen con nombre en Compose o usa -v con docker run para montar un directorio del host o un volumen con nombre.

¿Listo para optimizar tu flujo de trabajo con Docker? Echa un vistazo a nuestro JSON Formatter para validar y formatear rápidamente archivos de configuración JSON como docker-compose.yml o package.json.