🐳

Docker Hello World

🧑‍🎓 Aprendiz⏱️ 45 minutos

📋 Prerequisitos sugeridos

  • Terminal básica
  • 4GB RAM mínimo

Lo que vas a construir

Vas a instalar Docker y crear tu primer contenedor: una app Node.js empaquetada que funciona igual en cualquier computadora. Aprenderás a correr contenedores de Ubuntu, bases de datos como PostgreSQL, y a usar volúmenes para no perder datos. Al terminar, tendrás una app Dockerizada con su Dockerfile, docker-compose.yml, y la capacidad de levantar servicios con un comando. Es la base para trabajar en equipos donde "en mi máquina funciona" ya no será un problema.


Paso 1: Instalar Docker

SistemaInstalación
macOSDocker Desktop
WindowsDocker Desktop
Linux`curl -fsSL https://get.docker.com

Verifica:

docker --version
docker run hello-world

⚠️ Windows: Necesitas WSL2 habilitado. Docker Desktop te guía en la instalación.


Paso 2: Tu primer contenedor

# Descarga y corre Ubuntu en segundos
docker run -it ubuntu bash

# Ahora estás DENTRO del contenedor
cat /etc/os-release   # Verás "Ubuntu"
apt update            # Funciona como Linux real
exit                  # Sales del contenedor

¿Qué pasó? Docker descargó una imagen de Ubuntu (~30MB, no 4GB) y la ejecutó aislada de tu sistema.


Paso 3: Corre servicios útiles

Docker brilla cuando necesitas bases de datos o servicios sin instalar nada permanente:

# PostgreSQL listo en 10 segundos
docker run -d --name mi-postgres \
  -e POSTGRES_PASSWORD=secreto \
  -p 5432:5432 \
  postgres:16-alpine

# Redis para caché
docker run -d --name mi-redis -p 6379:6379 redis:alpine

# Adminer (interfaz web para bases de datos)
docker run -d --name adminer -p 8080:8080 adminer

Abre http://localhost:8080 para ver Adminer funcionando.

⚠️ PROBLEMA: Si haces docker rm mi-postgres, pierdes TODOS los datos. Sigue leyendo para solucionarlo.


Paso 4: Volúmenes (Datos Persistentes)

El problema más común de principiantes: Crean una base de datos, guardan datos, eliminan el contenedor... y pierden todo.

¿Por qué pasa esto?

SIN VOLUMEN:
┌─────────────────────────┐
│     Contenedor          │
│  ┌─────────────────┐    │
│  │   Base de datos │    │  ← Los datos viven DENTRO
│  │   (tus datos)   │    │     del contenedor
│  └─────────────────┘    │
└─────────────────────────┘
        ↓
   docker rm postgres
        ↓
   💀 DATOS PERDIDOS

CON VOLUMEN:
┌─────────────────────────┐      ┌─────────────────┐
│     Contenedor          │      │    Volumen      │
│  ┌─────────────────┐    │ ──── │  (tu disco)     │
│  │   Base de datos │────│──────│   tus datos     │
│  └─────────────────┘    │      └─────────────────┘
└─────────────────────────┘              ↓
        ↓                         Los datos están
   docker rm postgres             FUERA del contenedor
        ↓                                ↓
   Contenedor eliminado           ✅ DATOS SEGUROS

Crear PostgreSQL con volumen persistente

# Crea un volumen con nombre
docker volume create postgres_data

# Corre PostgreSQL usando ese volumen
docker run -d --name mi-postgres \
  -e POSTGRES_PASSWORD=secreto \
  -e POSTGRES_USER=dev \
  -e POSTGRES_DB=miapp \
  -p 5432:5432 \
  -v postgres_data:/var/lib/postgresql/data \
  postgres:16-alpine

La magia está en -v postgres_data:/var/lib/postgresql/data:

  • postgres_data = nombre del volumen en tu máquina
  • /var/lib/postgresql/data = donde Postgres guarda datos dentro del contenedor

Prueba que funciona

# Conecta y crea una tabla
docker exec -it mi-postgres psql -U dev -d miapp -c "CREATE TABLE test (id INT);"
docker exec -it mi-postgres psql -U dev -d miapp -c "INSERT INTO test VALUES (1), (2), (3);"

# Elimina el contenedor
docker stop mi-postgres && docker rm mi-postgres

# Crea uno nuevo con el MISMO volumen
docker run -d --name mi-postgres \
  -e POSTGRES_PASSWORD=secreto \
  -e POSTGRES_USER=dev \
  -e POSTGRES_DB=miapp \
  -p 5432:5432 \
  -v postgres_data:/var/lib/postgresql/data \
  postgres:16-alpine

# Verifica que los datos siguen ahí
docker exec -it mi-postgres psql -U dev -d miapp -c "SELECT * FROM test;"
# Resultado: 1, 2, 3 ✅

Comandos de volúmenes

ComandoQué hace
docker volume create nombreCrea un volumen
docker volume lsLista todos los volúmenes
docker volume inspect nombreVer detalles (ubicación real)
docker volume rm nombreElimina volumen (¡y sus datos!)
docker volume pruneElimina volúmenes no usados

Tipos de montaje

TipoSintaxisUso
Named Volume-v mi_volumen:/dataProducción, bases de datos
Bind Mount-v ./local:/dataDesarrollo, ver cambios en vivo
Anonymous-v /dataTemporal, no recomendado

Ejemplo de Bind Mount para desarrollo:

# Tu código local se sincroniza con el contenedor
docker run -d --name mi-app \
  -v $(pwd):/app \
  -p 3000:3000 \
  node:20-alpine npm start

Cambias un archivo → el contenedor lo ve inmediatamente.


Paso 5: Crea tu propia imagen

Ahora que entiendes contenedores y volúmenes, crea tu propia imagen.

Crea una carpeta docker-hello con estos 3 archivos:

Dockerfile:

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "index.js"]

index.js:

console.log("¡Hola desde Docker! 🐳");
console.log("Fecha:", new Date().toISOString());
console.log("Node version:", process.version);

package.json:

{ "name": "docker-hello", "version": "1.0.0" }

Construye y ejecuta:

docker build -t mi-app .
docker run mi-app

Paso 6: Instala Portainer (Gestión Visual)

Portainer es una interfaz web para Docker. Perfecto para principiantes:

# Crea un volumen para persistir datos
docker volume create portainer_data

# Instala Portainer
docker run -d -p 9000:9000 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

Abre http://localhost:9000 y crea tu usuario admin.

¿Qué puedes hacer con Portainer?

  • Ver todos tus contenedores en una tabla
  • Iniciar/detener/eliminar con un click
  • Ver logs en tiempo real
  • Crear contenedores sin comandos
  • Gestionar imágenes, volúmenes, redes

💡 Tip: Deja Portainer corriendo siempre. Es como el "Finder" o "Explorer" pero para Docker.


🛠️ Herramientas de gestión

HerramientaTipoIdeal para
PortainerUI local/servidorGestionar Docker visualmente
Docker DesktopApp desktopMac/Windows, incluye UI básica
LazydockerTUI terminalFans de la terminal

Para deploy en producción

HerramientaDescripciónCosto
EasyPanelDeploy como Heroku, pero en tu VPSGratis self-hosted
CoolifyOpen source, muy completoGratis self-hosted
DokkuMini-Heroku en tu servidorGratis
CapRoverPaaS simple con Let's EncryptGratis

🎯 Recomendación para principiantes: Usa Portainer para aprender, luego EasyPanel o Coolify cuando quieras deploy fácil.


Comandos esenciales

ComandoQué hace
docker run -d nombreCorre en background
docker psLista contenedores activos
docker ps -aLista TODOS (incluso detenidos)
docker logs nombreVer logs
docker logs -f nombreLogs en tiempo real
docker stop nombreDetener contenedor
docker rm nombreEliminar contenedor
docker imagesLista imágenes descargadas
docker rmi nombreEliminar imagen
docker system pruneLimpia todo lo no usado

Si algo falló

ErrorCausaSolución
daemon not runningDocker no está corriendoAbre Docker Desktop
permission deniedSin permisosLinux: sudo usermod -aG docker $USER y reinicia sesión
port already in usePuerto ocupadoCambia el puerto: -p 9001:9000
no space leftDisco lleno de imágenesdocker system prune -a
cannot connect a localhostContenedor no expone puertoAgrega -p puerto:puerto

Lo que aprendiste

✅ Instalar Docker y verificar que funcione ✅ Correr contenedores pre-hechos (Ubuntu, Postgres, Redis) ✅ Usar volúmenes para no perder datos (el error #1 de principiantes) ✅ Crear tu propia imagen con Dockerfile ✅ Usar Portainer para gestión visual ✅ Comandos esenciales para el día a día


Próximos pasos

Consumir una API JSON — Conecta tu app con datos reales → Deploy con Docker — Lleva tu contenedor a producción → Docker Básico (teoría) — Entiende containers vs VMs