Hay una frase que cualquier programador escuchó alguna vez: "En mi máquina funciona."
Es la frase más frustrante del desarrollo de software. El código anda perfecto en la computadora del desarrollador y falla en producción porque la versión de Python es distinta, porque falta una librería, porque el sistema operativo del servidor tiene otra configuración.
Docker resuelve exactamente ese problema.
Qué es Docker
Docker es una plataforma que empaqueta una aplicación junto con todo lo que necesita para funcionar —el código, las dependencias, las configuraciones, las librerías— en un contenedor. Ese contenedor corre igual en cualquier máquina que tenga Docker instalado.
La metáfora del contenedor es intencional. Igual que un contenedor de carga marítimo que puede ir en un barco, un tren o un camión sin importar qué hay adentro, un contenedor de Docker corre en tu laptop, en un servidor de AWS o en la computadora de otro desarrollador y siempre funciona igual.
La diferencia con una máquina virtual
Si conocés las máquinas virtuales (VM), Docker parece similar pero es diferente:
Máquina virtual: emula hardware completo. Corre un sistema operativo entero. Ocupa mucho espacio (GB) y tarda minutos en iniciar.
Contenedor Docker: comparte el kernel del sistema operativo del host. No emula hardware. Ocupa MB (no GB). Inicia en segundos.
Un servidor puede correr decenas de contenedores donde una VM sería imposible.
Los conceptos básicos
Imagen: es la plantilla. Una imagen de Docker define el sistema base, las dependencias y cómo se inicia la aplicación. Las imágenes se crean con un `Dockerfile`.
Contenedor: es una imagen en ejecución. Podés crear muchos contenedores a partir de la misma imagen.
Dockerfile: es el archivo de instrucciones para construir una imagen. Se parece a una receta:
```
FROM python:3.12
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
```
Esto le dice a Docker: "Empezá con Python 3.12, copiá el código, instalá las dependencias, y cuando arranque el contenedor corré app.py."
Docker Hub: el repositorio público de imágenes. Tiene imágenes oficiales de Python, Node.js, MySQL, Nginx y miles de aplicaciones más, listas para usar.
Un ejemplo real
Supongamos que tenés una aplicación web en Node.js. Sin Docker:
- Cada desarrollador instala Node.js localmente
- Diferentes versiones producen comportamientos distintos
- El servidor de producción tiene otra versión todavía
- Cada nuevo desarrollador tarda horas en configurar el entorno
Con Docker:
- El `Dockerfile` define exactamente qué versión de Node.js usar
- `docker build` crea la imagen
- `docker run` la inicia
- Todos trabajan en el mismo entorno, siempre
Para qué se usa Docker en la práctica
Desarrollo local consistente: todos los miembros de un equipo tienen exactamente el mismo entorno de desarrollo.
Microservicios: en lugar de una aplicación monolítica, muchas empresas corren sus servicios como contenedores independientes. El frontend en un contenedor, el backend en otro, la base de datos en otro.
CI/CD (integración y despliegue continuo): los sistemas de testing y deployment corren los tests en contenedores, garantizando que el entorno de test es igual al de producción.
Despliegue en la nube: plataformas como AWS, Google Cloud y Azure tienen servicios específicos para desplegar contenedores Docker (ECS, GKE, AKS).
Docker Compose
Para aplicaciones con múltiples servicios, se usa Docker Compose. Define todos los contenedores en un archivo `docker-compose.yml` y los inicia con un solo comando:
```yaml
services:
web:
build: .
ports:
- "3000:3000"
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
```
`docker compose up` inicia tanto la aplicación web como la base de datos, con la red entre ellas ya configurada.
Cómo empezar
1. Instalá Docker Desktop (disponible para Windows, Mac y Linux): docker.com/get-started
2. Corré tu primer contenedor: `docker run hello-world`
3. Probá algo más útil: `docker run -it ubuntu bash` (abre una terminal Ubuntu)
4. Aprendé a escribir tu primer Dockerfile
La curva de aprendizaje inicial es real pero no es larga. En un día podés tener tu primera aplicación corriendo en Docker.
---
Fuente original: Un Mundo Loco
Fuentes consultadas: Docker Documentation — Overview