Docker para Desarrolladores: Imágenes, Contenedores y Compose

DevOps2026-09-11TryQuickToolBox

Probablemente hayas oído hablar de Docker y de cómo puede simplificar tu flujo de trabajo de desarrollo. Pero si eres nuevo en el mundo de los contenedores, la terminología y los comandos pueden resultar abrumadores. Esta guía elimina el ruido y te ofrece una comprensión práctica de las imágenes, los contenedores y Compose de Docker, para que puedas empezar a usarlos de forma efectiva hoy mismo.

¿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í, lo que significa que puedes ejecutar tu aplicación de forma consistente en tu portátil, en la máquina de un compañero o en un servidor de producción.

¿El beneficio clave? "Funciona en mi máquina" pasa a ser cosa del pasado. Docker garantiza que el entorno en el que se ejecuta tu código sea idéntico en todas partes.

Imágenes vs. Contenedores: los bloques de construcción

Antes de empezar, necesitas entender la diferencia entre una imagen y un contenedor.

En resumen: una imagen es la receta y un contenedor es el plato que cocinas con ella.

Comandos esenciales de Docker para desarrolladores

Estos son los comandos que usarás con más frecuencia:

  1. docker pull <image> – Descarga una imagen desde un registro como Docker Hub.
  2. docker images – Lista todas las imágenes locales.
  3. docker run <image> – Crea e inicia un contenedor a partir de una imagen.
  4. docker ps – Lista los contenedores en ejecución. Añade -a para ver todos los contenedores, incluidos los detenidos.
  5. docker stop <container> – Detiene un contenedor en ejecución de forma ordenada.
  6. docker rm <container> – Elimina un contenedor detenido.
  7. docker rmi <image> – Elimina una imagen.
  8. docker exec -it <container> bash – Abre una shell interactiva dentro de un contenedor en ejecución.

Por ejemplo, para ejecutar un servidor web Nginx sencillo:

docker run -d -p 8080:80 nginx

Esto descarga la imagen nginx (si no está ya presente), inicia un contenedor en modo detached (-d) y mapea el puerto 8080 de tu host al puerto 80 del contenedor (-p 8080:80).

Construir tu propia imagen con un Dockerfile

Para empaquetar tu aplicación, creas un Dockerfile, un archivo de texto con instrucciones. Aquí tienes un ejemplo sencillo para una app de Node.js:

# Use an official Node.js runtime as a parent image
FROM node:18-alpine

# Set the working directory
WORKDIR /usr/src/app

# Copy package.json and install dependencies
COPY package*.json ./
RUN npm install

# 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", "app.js"]

Construye la imagen con:

docker build -t my-node-app .

Después ejecútala:

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

Simplificar apps multi-contenedor con Docker Compose

Las aplicaciones del mundo real a menudo necesitan varios servicios: un servidor web, una base de datos, una caché, etc. Gestionarlos individualmente con docker run se vuelve tedioso. Docker Compose te permite definir y ejecutar aplicaciones multi-contenedor usando un archivo YAML.

Crea un archivo 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:

Después inicia todo con:

docker compose up -d

Compose se encarga de la red, los volúmenes y las dependencias por ti. Para detener y eliminar contenedores, redes y volúmenes, ejecuta docker compose down.

Buenas prácticas para Docker en desarrollo

Errores comunes y cómo evitarlos

Preguntas frecuentes

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

Una imagen es una plantilla de solo lectura que define la aplicación y su entorno. Un contenedor es una instancia en ejecución de esa imagen. Puedes crear muchos contenedores a partir de una sola imagen.

¿Necesito Docker Compose para una app de un solo contenedor?

No necesariamente. Para apps sencillas, docker run es suficiente. Sin embargo, Compose facilita la gestión de variables de entorno, volúmenes y redes, incluso para un solo servicio, y simplifica el escalado posterior.

¿Cómo persisto datos en Docker?

Usa volúmenes. Los volúmenes se almacenan fuera del sistema de archivos del contenedor y persisten incluso si el contenedor se elimina. En Compose, define un volumen y móntalo en una ruta del contenedor (por ejemplo, volumes: - mydata:/var/lib/data).

¿Listo para optimizar tu flujo de trabajo con Docker? Cuando necesites analizar logs de contenedores, prueba nuestro Nginx Log Analyzer para analizar y visualizar rápidamente los datos de los logs, perfecto para depurar servidores web en contenedores.