¿Que es docker y como usarlo para ejecutar contenedores?

- Qué es Docker y cómo funciona
- Por qué usar Docker: beneficios reales para desarrolladores y equipos
- Sistemas operativos compatibles con Docker
- Cómo usar Docker: flujo completo paso a paso
- Ejemplo real: PHP 8 + Apache con Docker
- Variables de entorno con .env en Docker
- Comandos Docker esenciales que debes conocer
- Novedades de Docker en 2026 que debes conocer
- Errores comunes al empezar con Docker que debes evitar
- Buenas prácticas de seguridad en Docker
- En pocas palabras
- 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.

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.

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

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

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

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
latesten producción: cambia con cada build y rompe la reproducibilidad. Usa versiones específicas comonode:20.11-alpine. - No usar
.dockerignore: sin él, el build incluyenode_modules,.gity 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 prunelo 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