¿Que es docker y como usarlo para ejecutar contenedores?

contenedores de docker
Índice de contenido
  1. Qué es Docker y cómo funciona
  2. Por qué usar Docker: beneficios reales para desarrolladores y equipos
  3. Sistemas operativos compatibles con Docker
  4. Cómo usar Docker: flujo completo paso a paso
    1. Paso 1: crear el Dockerfile
    2. Paso 2: ejecutar un contenedor con docker run
    3. Paso 3: Docker Compose v5 para múltiples servicios
    4. Paso 4: volúmenes persistentes para datos
  5. Ejemplo real: PHP 8 + Apache con Docker
  6. Variables de entorno con .env en Docker
  7. Comandos Docker esenciales que debes conocer
  8. Novedades de Docker en 2026 que debes conocer
    1. Docker Debug ahora es gratuito para todos los usuarios
    2. Soporte experimental para MCP (Model Context Protocol)
    3. Docker Compose v5 con SDK oficial en Go
  9. Errores comunes al empezar con Docker que debes evitar
  10. Buenas prácticas de seguridad en Docker
  11. En pocas palabras
  12. Conclusión

Si alguna vez te has encontrado con el problema de que una aplicación funciona en tu máquina pero falla en el servidor de producción, Docker es la solución. Esta guía te explica qué es Docker, por qué se ha convertido en el estándar de la industria para empaquetar y desplegar aplicaciones, y cómo empezar a usarlo paso a paso: desde tu primer Dockerfile hasta orquestar múltiples servicios con docker compose y persistir datos con volúmenes. Al terminar tendrás un entorno reproducible y listo para desarrollo o producción, con los comandos esenciales y las buenas prácticas actualizadas a la versión 29 del motor.

Qué es Docker y cómo funciona

Docker es una plataforma de contenedorización que empaqueta una aplicación junto con todas sus dependencias en una unidad estandarizada llamada contenedor. A diferencia de una máquina virtual, un contenedor no incluye un sistema operativo completo: comparte el kernel del host y solo aísla el proceso y sus dependencias. El resultado son unidades ligeras, portátiles y que se comportan de forma idéntica en cualquier máquina con Docker instalado.

Tres conceptos son fundamentales para entender cómo funciona Docker:

  • Imagen: plantilla inmutable con capas que contiene el SO base, las librerías y tu aplicación. Se construye a partir de un Dockerfile.
  • Contenedor: instancia en ejecución de una imagen. Es efímero por naturaleza: cuando se detiene, los datos no persistidos desaparecen.
  • Registro: repositorio donde se almacenan y distribuyen imágenes. Docker Hub es el más usado, pero existen alternativas como GitHub Container Registry o registros privados.
Esquema del flujo de Docker: imagen, contenedor y registro
Imagen 1. Flujo básico de Docker: el Dockerfile genera una imagen que se ejecuta como contenedor y puede publicarse en un registro.

Por qué usar Docker: beneficios reales para desarrolladores y equipos

La adopción de Docker en equipos de desarrollo no es una tendencia pasajera: resuelve problemas concretos que cualquier persona que haya trabajado con entornos de desarrollo reconocerá de inmediato.

  • Portabilidad total: la imagen funciona igual en tu laptop, en el servidor de staging y en producción, sin importar el sistema operativo del host.
  • Aislamiento de dependencias: cada contenedor tiene sus propias versiones de librerías. Puedes tener Node 18 y Node 20 corriendo simultáneamente sin conflictos.
  • Despliegues reproducibles: etiquetar imágenes con versiones concretas permite hacer rollback en segundos si un despliegue falla.
  • Onboarding acelerado: un nuevo miembro del equipo puede tener el entorno completo funcionando con un solo comando, sin instalar dependencias manualmente.
  • Escalabilidad horizontal: los contenedores son la unidad base de orquestadores como Kubernetes, lo que facilita escalar servicios según demanda.

Sistemas operativos compatibles con Docker

Docker Engine (versión 29, la actual) es compatible con las distribuciones Linux más populares de forma nativa. Para Windows y macOS, la vía recomendada es Docker Desktop, que incluye el motor, la CLI, Docker Compose v5 y una interfaz gráfica integrada.

  • Linux (Ubuntu, Debian, Fedora, RHEL): soporte nativo mediante kernel namespaces y cgroups. Es la plataforma de referencia para producción.
  • Windows 10/11 y Windows Server 2019+: Docker Desktop usa WSL2 para correr contenedores Linux de forma transparente.
  • macOS (Intel y Apple Silicon): Docker Desktop levanta una máquina virtual Linux ligera. Requiere macOS Sonoma (versión 14) o superior en las versiones recientes.

Cómo usar Docker: flujo completo paso a paso

El flujo habitual con Docker tiene cuatro etapas: escribir el Dockerfile, construir la imagen, ejecutar el contenedor y —si el proyecto tiene varios servicios— orquestarlos con docker compose. A continuación cada etapa con ejemplos reales.

Paso 1: crear el Dockerfile

El Dockerfile es el archivo de instrucciones que define cómo construir la imagen. Cada línea genera una capa cacheada, lo que acelera los builds posteriores si solo cambia el código fuente y no las dependencias.

Ejemplo para una app Node.js:

# Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

Construye la imagen con un tag de versión:

docker build -t my-app:1.0.0 .

Usar node:20-alpine en lugar de la imagen completa reduce el tamaño final de forma significativa. Alpine es la base recomendada para producción cuando no necesitas herramientas adicionales del sistema.

Paso 2: ejecutar un contenedor con docker run

Con la imagen construida, levanta un contenedor mapeando el puerto del host al del contenedor:

docker run -d --name my-app -p 8080:3000 my-app:1.0.0

El flag -d ejecuta el contenedor en segundo plano. Ahora puedes acceder a la app en http://localhost:8080. Para ver los logs en tiempo real:

docker logs -f my-app

Paso 3: Docker Compose v5 para múltiples servicios

Cuando el proyecto requiere más de un servicio (una app web más una base de datos, por ejemplo), docker compose permite definirlos todos en un único archivo compose.yml y levantarlos con un solo comando. La versión 5 introduce un SDK oficial en Go que permite integrar Compose directamente en aplicaciones sin depender de la CLI.

# compose.yml
services:
  web:
    build: .
    image: my-app:1.0.0
    container_name: web
    ports:
      - "8080:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=mysql://user:pass@db:3306/appdb
    depends_on:
      - db
  db:
    image: mysql:8.4
    container_name: db
    ports:
      - "3306:3306"
    environment:
      - MYSQL_DATABASE=appdb
      - MYSQL_USER=user
      - MYSQL_PASSWORD=pass
      - MYSQL_ROOT_PASSWORD=rootpass
    volumes:
      - db_data:/var/lib/mysql
volumes:
  db_data:

Levanta todos los servicios en segundo plano:

docker compose up -d

Nota importante: el archivo ya no necesita el campo version en Compose v5. Su uso está obsoleto y genera advertencias en las versiones recientes.

Servicios orquestados con Docker Compose v5
Imagen 2. Múltiples servicios orquestados con Docker Compose, cada uno en su propio contenedor con red interna compartida.

Paso 4: volúmenes persistentes para datos

Los contenedores son efímeros por diseño: cuando se eliminan, los datos internos desaparecen. Los volúmenes de Docker son la solución para persistir datos más allá del ciclo de vida del contenedor. Son indispensables para bases de datos, archivos subidos por usuarios y cualquier información que no pueda perderse.

# Crear un volumen nombrado
docker volume create my_data

# Montar el volumen al iniciar MySQL
docker run -d --name mysql \
  -e MYSQL_ROOT_PASSWORD=rootpass \
  -v my_data:/var/lib/mysql \
  -p 3306:3306 mysql:8.4
Panel de volúmenes y contenedores en Docker Desktop
Imagen 3. Volúmenes y contenedores visibles en el panel de Docker Desktop.

Ejemplo real: PHP 8 + Apache con Docker

Este Dockerfile prepara un entorno PHP 8 con Apache listo para aplicaciones típicas que requieren MySQL, GD, Zip y reescritura de URLs:

# Dockerfile (PHP 8 + Apache)
FROM php:8.2-apache

ARG DEBIAN_FRONTEND=noninteractive

RUN docker-php-ext-install mysqli

RUN apt-get update && apt-get install -y \
    sendmail libpng-dev libzip-dev zlib1g-dev libonig-dev \
  && rm -rf /var/lib/apt/lists/*

RUN docker-php-ext-install zip mbstring gd

RUN a2enmod rewrite
Dockerfile PHP 8.2 con Apache y extensiones comunes
Imagen 4. Dockerfile PHP 8.2 + Apache con las extensiones más comunes para aplicaciones web.

Variables de entorno con .env en Docker

Guardar credenciales dentro de la imagen es una mala práctica de seguridad. Usa un archivo .env que Docker Compose carga automáticamente. Nunca lo subas al repositorio: agrégalo al .gitignore.

# .env
DATABASE_HOST=db
DATABASE_PORT=3306
DATABASE_NAME=appdb
DATABASE_USERNAME=user
DATABASE_PASSWORD=pass
NODE_ENV=production

Referencia estas variables en compose.yml con la sintaxis ${VARIABLE}:

environment:
  - DATABASE_URL=mysql://${DATABASE_USERNAME}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}

Comandos Docker esenciales que debes conocer

# Ver contenedores en ejecución
docker ps

# Ver todos (incluye detenidos)
docker ps -a

# Ver logs en tiempo real
docker logs -f NOMBRE

# Abrir terminal dentro del contenedor
docker exec -it NOMBRE sh

# Parar, iniciar y eliminar
docker stop NOMBRE
docker start NOMBRE
docker rm NOMBRE

# Limpiar imágenes y contenedores sin usar
docker system prune

# Compose: levantar, ver estado y apagar
docker compose up -d
docker compose ps
docker compose down
Terminal mostrando docker pull y creación de contenedores Docker
Imagen 5. Ejecución de docker pull y creación de contenedores desde la terminal.

Novedades de Docker en 2026 que debes conocer

Docker Debug ahora es gratuito para todos los usuarios

Desde Docker Desktop 4.50, Docker Debug está disponible sin coste en todos los planes. Permite inspeccionar y depurar contenedores en ejecución directamente desde el IDE, con integración nativa con VSCode y Cursor, sin instalar herramientas adicionales dentro de la imagen.

Soporte experimental para MCP (Model Context Protocol)

Docker Desktop incluye soporte experimental para MCP, el protocolo de contexto de modelos impulsado por Anthropic. Esto posiciona a Docker como infraestructura base para flujos de trabajo con agentes de IA, donde los contenedores actúan como entornos de ejecución aislados para tareas autónomas. Si quieres entender mejor qué son estos agentes, consulta nuestra guía sobre qué son los agentes de inteligencia artificial y cómo funcionan.

Docker Compose v5 con SDK oficial en Go

La versión 5 de Docker Compose introduce un SDK oficial en Go para integrar Compose directamente en aplicaciones sin necesidad de invocar la CLI, abriendo la puerta a herramientas que gestionan entornos multi-contenedor de forma programática.

Errores comunes al empezar con Docker que debes evitar

  • Guardar datos sin volumen: si el contenedor se elimina, los datos desaparecen. Cualquier información crítica necesita un volumen.
  • Usar latest en producción: cambia con cada build y rompe la reproducibilidad. Usa versiones específicas como node:20.11-alpine.
  • No usar .dockerignore: sin él, el build incluye node_modules, .git y archivos innecesarios que inflan la imagen.
  • Exponer puertos innecesarios: publicar puertos de bases de datos en el host es un riesgo de seguridad en producción.
  • No limpiar imágenes antiguas: acumulan gigabytes en disco con el tiempo. docker system prune lo resuelve en segundos.

Buenas prácticas de seguridad en Docker

  • Usa solo imágenes oficiales y fija la versión exacta en el FROM.
  • Minimiza el tamaño usando bases Alpine y eliminando cachés en el mismo RUN.
  • Nunca almacenes secretos en la imagen. Usa variables de entorno o el gestor de secretos de tu orquestador.
  • Ejecuta los procesos como un usuario sin privilegios siempre que sea posible.
  • Haz backups regulares de los volúmenes con datos críticos.

Para complementar un entorno de desarrollo bien configurado, mantén el sistema operativo y los drivers del host actualizados. Consulta nuestra guía sobre cómo actualizar controladores en Windows 10 y 11 para evitar problemas de compatibilidad con Docker Desktop.

En pocas palabras

Docker resuelve el problema de portabilidad empaquetando la aplicación y sus dependencias en contenedores que funcionan igual en cualquier entorno. El flujo básico es: escribir un Dockerfile, construir la imagen, ejecutar el contenedor con docker run y usar docker compose para proyectos con múltiples servicios. En 2026 la plataforma está en su versión 29 del motor y Compose v5, con Docker Debug gratuito y soporte experimental para agentes de IA. Los resultados en productividad y consistencia de entornos pueden variar según la arquitectura del proyecto y la experiencia del equipo.

Conclusión

Docker se ha convertido en una habilidad esencial para cualquier desarrollador que trabaje con aplicaciones web, APIs o microservicios. Su curva de aprendizaje inicial es manejable, y los beneficios en reproducibilidad, velocidad de despliegue y colaboración en equipo son inmediatos. El repositorio de ejemplo del artículo original sigue siendo un punto de partida útil: Docker + WordPress en GitHub. Para más guías técnicas, visita sergiocaballero.com.

Deja un comentario

Subir

Discover more from Sergio Caballero

Subscribe now to keep reading and get access to the full archive.

Continue reading