ProgramaciónDevToolsDockerBackend

Docker para principiantes: qué es y por qué lo necesitas

· · 11 min de lectura

Ver todo: Programación

“En mi máquina sí funciona.”

Esas cuatro palabras son responsables de más reuniones innecesarias, más bugs en producción y más noches de debugging que cualquier otro fenómeno en el desarrollo de software moderno. Alguien escribe código en su laptop con Ubuntu 24.04, lo sube al servidor que corre CentOS 7 con una versión diferente de Python, y el universo colapsa.

Docker es la solución directa a ese problema. No una solución parcial, no un workaround — la solución real, la que la industria adoptó de manera masiva y que hoy es habilidad prácticamente obligatoria en cualquier stack de desarrollo profesional.

Lo esencial de Docker antes de arrancar

  • Docker empaqueta tu app + su entorno en una unidad portable llamada contenedor — corre igual en tu laptop, en el servidor y en el CI
  • Un contenedor no es una máquina virtual — comparte el kernel del host, arranca en segundos y consume menos recursos
  • Docker Engine 29.x es la versión actual (junio 2026); el Containerd image store es ahora el default en instalaciones nuevas
  • Tres conceptos clave: imagen (plantilla), contenedor (instancia corriendo), volumen (datos persistentes)
  • Docker Compose es la herramienta correcta para apps multi-servicio — define todo en un archivo YAML y levanta el stack con un solo comando
  • El flujo real de trabajo no es memorizar todos los flags — es entender qué problema resuelve cada pieza y saber dónde buscar el resto

Si quieres más recursos del ecosistema, visita Programación en Geekshop.


El problema que Docker realmente resuelve

Antes de instalar nada, vale entender el diagnóstico correcto. El problema no es que los desarrolladores sean descuidados — es que el software tiene dependencias, y las dependencias tienen versiones, y las versiones chocan.

Tu app Node.js necesita la versión 20. El sistema del cliente tiene la 18. Tu script de Python asume que libpq está instalado. El servidor de CI no la tiene. Tu configuración de base de datos asume un puerto específico. En producción ese puerto ya lo está usando otro servicio.

EL PROBLEMA REAL

Dependencias, entornos y la promesa rota de 'en mi máquina funciona'

La solución tradicional era documentar con precisión quirúrgica todos los pasos de instalación y esperar que nadie se los saltara. O usar máquinas virtuales completas — que funcionaban, pero consumían varios gigas de RAM y tardaban minutos en arrancar.

Docker resuelve esto de raíz: empaqueta la aplicación junto con exactamente el entorno que necesita — sistema operativo base, runtime, dependencias, variables de entorno y configuración — en una unidad portable que corre de manera idéntica en cualquier lugar donde Docker esté instalado. No “casi igual”. Idéntica.

El resultado práctico: el onboarding de un proyecto nuevo pasa de “sigue estas 40 instrucciones y reza porque algo siempre falla” a docker compose up y tienes el stack completo corriendo en minutos.


Contenedores vs. máquinas virtuales: la diferencia que importa

ARQUITECTURA

Por qué los contenedores arrancan en segundos (y las VMs en minutos)

Una máquina virtual incluye un sistema operativo completo — kernel, drivers, gestión de memoria — encima de otro sistema operativo. Eso es lo que la hace pesada: estás ejecutando un sistema operativo dentro de otro sistema operativo.

Un contenedor Docker es diferente en su núcleo: comparte el kernel del sistema operativo host. Lo que aísla son el sistema de archivos, los procesos y las interfaces de red — pero no duplica el kernel. El resultado:

  • Un contenedor arranca en milisegundos o pocos segundos, no en minutos
  • Ocupa decenas de megabytes de RAM base, no gigabytes
  • Puedes correr docenas de contenedores en una laptop de desarrollo sin que el sistema colapse

La compensación: un contenedor Linux no puede correr en un kernel Windows nativo y viceversa (Docker Desktop maneja esto con una capa de virtualización ligera, pero la arquitectura base sigue siendo la del host). Para los casos de uso típicos de desarrollo web y backend, esto no importa.


Los tres conceptos que tienes que dominar

Antes de tocar un solo comando, los tres conceptos clave:

Imagen: es la plantilla, el plano. Define el sistema operativo base, los archivos instalados, los comandos disponibles y la configuración. Las imágenes son inmutables — no cambias una imagen corriendo, creas una nueva. Se definen en un Dockerfile o se descargan de registros como Docker Hub.

Contenedor: es una instancia corriendo de una imagen. De una misma imagen puedes crear diez contenedores corriendo en paralelo. Los contenedores son efímeros por diseño — si lo detienes y lo eliminas, los cambios internos se pierden (a menos que uses volúmenes).

Volumen: el mecanismo para persistir datos fuera del ciclo de vida del contenedor. La base de datos de tu app vive en un volumen — cuando el contenedor de PostgreSQL se reinicia, los datos siguen ahí.


Tabla comparativa: Docker vs. alternativas

Herramienta Enfoque Overhead Portabilidad Ecosistema
Docker Contenedores de app Muy bajo Total (donde Docker esté) Inmenso
Podman Contenedores sin daemon Muy bajo Alto Creciendo
VMs (VMware/VirtualBox) OS completo Alto (GB de RAM) Moderada Maduro
venv / pyenv Solo entornos Python Nulo Manual Específico de Python
Nix/Guix Entornos reproducibles Bajo Moderada Nicho

Docker domina el ecosistema de contenedores en 2026. Podman es una alternativa legítima (sin daemon root, compatible con Docker CLI) que vale la pena conocer, especialmente en entornos empresariales con políticas de seguridad estrictas.


Los comandos que usarás el 90% del tiempo

Docker Engine tiene cientos de subcomandos. En la práctica diaria, este es el conjunto que realmente usas:

# Descargar una imagen de Docker Hub
docker pull python:3.12-slim

# Correr un contenedor interactivo
docker run -it ubuntu:24.04 bash

# Correr un servidor web en background, exponiendo el puerto 80
docker run -d -p 8080:80 nginx:alpine

# Ver contenedores corriendo
docker ps

# Ver TODOS los contenedores (incluyendo detenidos)
docker ps -a

# Detener un contenedor
docker stop <container_id>

# Eliminar un contenedor detenido
docker rm <container_id>

# Ver imágenes locales
docker images

# Eliminar una imagen
docker rmi <image_id>

# Ver logs de un contenedor
docker logs <container_id>

# Entrar a un contenedor corriendo
docker exec -it <container_id> bash
No memorices los flags — entiende qué problema resuelve cada comando y usa docker --help y la documentación oficial para el resto. Así es como trabajan los profesionales.

Tu primer Dockerfile

Un Dockerfile define cómo construir una imagen personalizada para tu app. Ejemplo para una API en Python:

# Imagen base — Python 3.12 versión slim (más ligera)
FROM python:3.12-slim

# Directorio de trabajo dentro del contenedor
WORKDIR /app

# Copiar dependencias primero (para aprovechar el cache de capas)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copiar el resto del código
COPY . .

# Puerto que expone el contenedor
EXPOSE 8000

# Comando que se ejecuta al iniciar el contenedor
CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

Construyes la imagen con:

docker build -t mi-api:v1 .

Y la corres con:

docker run -d -p 8000:8000 mi-api:v1

Docker Compose: el paso que cambia todo

Cuando tu stack tiene más de un servicio — una API, una base de datos, un cache de Redis — manejar cada contenedor por separado se vuelve tedioso. Docker Compose resuelve esto: defines todos los servicios en un archivo docker-compose.yml y los levantas con un solo comando.

# docker-compose.yml — stack típico de desarrollo
services:
  api:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgresql://user:password@db:5432/mydb
    depends_on:
      - db
      - redis

  db:
    image: postgres:16-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=mydb

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres_data:

Con este archivo en tu proyecto:

# Levantar todo el stack en background
docker compose up -d

# Ver los logs de todos los servicios
docker compose logs -f

# Detener todo
docker compose down

# Detener y eliminar volúmenes (cuidado: borra datos)
docker compose down -v

Eso es todo. Un comando para tener PostgreSQL 16, Redis 7 y tu API corriendo en local — sin instalar Postgres ni Redis en tu sistema operativo host.

DOCKER COMPOSE

Un comando para levantar todo el stack

El patrón de Docker Compose es lo que hace que Docker sea una herramienta de productividad real, no solo un experimento técnico. Cuando un developer nuevo llega a tu equipo, el onboarding es clonar el repo y ejecutar docker compose up. El stack completo — con la versión exacta de cada dependencia — levanta en minutos.

Para proyectos en equipo, el docker-compose.yml se versiona junto con el código. Eso significa que el entorno de desarrollo es reproducible y auditable. Si el entorno se rompe, puedes ver exactamente qué cambió.


Errores comunes en los primeros días


Docker Compose levanta toda la infraestructura de desarrollo — base de datos, cache, API — con un solo comando. Eso cambia el flujo de trabajo de manera fundamental.

El siguiente paso lógico

Docker es la entrada al mundo de los contenedores, pero no el final del camino. Una vez que dominas lo básico, los siguientes conceptos se vuelven relevantes:

Docker Networks — cómo los contenedores se comunican entre sí y con el exterior. El comportamiento por defecto de Compose crea una red interna automáticamente, pero entender redes te da control fino sobre qué puede hablar con qué.

Imágenes multi-stage — técnica para reducir dramáticamente el tamaño de las imágenes de producción. Compilas el código en una imagen “builder” con todas las herramientas, y copias solo el binario final a una imagen base mínima.

Kubernetes — cuando tienes múltiples instancias de tu app, auto-scaling, y necesitas orquestación en producción. Docker Compose es para desarrollo; Kubernetes es para producción a escala. No saltes a K8s antes de entender bien Docker.

Para el entorno de desarrollo completo más allá de Docker, visita Las mejores herramientas que de verdad usan los desarrolladores. Y si todavía estás eligiendo tu primer lenguaje para programar, esta guía honesta sobre lenguajes para principiantes te va a ahorrar semanas de duda.


FAQ

¿Necesito saber Linux para usar Docker?

No en profundidad, pero sí lo básico: navegar directorios, editar archivos con un editor de texto en terminal, y entender qué es un proceso y un puerto. Si no tienes esa base, el punto de partida correcto es familiarizarte con Linux antes de Docker.

¿Docker Desktop es gratis?

Para uso personal, educativo y proyectos open source, sí. Para uso comercial en empresas con más de 250 empleados o más de $10 millones USD en ingresos anuales, requiere suscripción de pago. Revisa los términos actuales en el sitio oficial de Docker para los detalles exactos — cambiaron en 2022 y pueden seguir cambiando.

¿Docker corre en Windows y macOS?

Sí, a través de Docker Desktop, que incluye una capa de virtualización ligera (en macOS usa Apple Virtualization Framework en ARM, en Windows usa WSL2). El comportamiento es prácticamente idéntico al de Linux nativo para los casos de uso típicos. La única diferencia notable es performance en operaciones de filesystem intensivas — en Linux nativo es más rápido.

¿Cuál es la diferencia entre Docker y Podman?

Podman es una alternativa open source compatible con la CLI de Docker que no requiere un daemon corriendo como root. En la práctica, la mayor parte de los comandos Docker funcionan igual en Podman con un alias. La diferencia principal es arquitectural: Podman es “daemonless” y corre sin privilegios root, lo que lo hace preferido en algunos entornos empresariales con políticas de seguridad más estrictas.

¿Docker sirve para proyectos personales pequeños?

Absolutamente. El overhead de aprender Docker se paga rápido incluso en proyectos pequeños: onboarding en un dispositivo nuevo en minutos, entorno consistente entre computadoras, y la práctica que necesitas para cuando el proyecto crezca. El docker-compose.yml de un proyecto personal es el mismo que el de uno de empresa — solo con más servicios.

Fuentes

Los conceptos y comandos de Docker se apoyan en la documentación oficial:

  • DockerDocker (plataforma de contenedores)
  • Docker DocsDocker (documentación oficial y referencia de comandos)

¿Te late lo que viene?

Regístrate y entérate cuando abramos.

Avísenme cuando abran