Skip to content

Docker en VPS

Guía para trabajar con Docker en tu VPS, aprovechando que ya tienes n8n instalado.

Tu VPS ya tiene Docker instalado (viene con n8n), así que puedes usarlo directamente.

Terminal window
# Ver versión de Docker
docker --version
# Ver versión de Docker Compose
docker compose version
# Ver contenedores en ejecución
docker ps
# Ver todos los contenedores
docker ps -a
# Ver imágenes descargadas
docker images
  • Imagen: Plantilla inmutable (como un instalador)
  • Contenedor: Instancia ejecutable de una imagen (aplicación corriendo)

Instalación Tradicional:

Terminal window
# Muchas dependencias en el sistema
apt install nodejs nginx php mysql
# Posibles conflictos entre proyectos

Con Docker:

Terminal window
# Todo aislado en contenedores
docker compose up -d
# Sin conflictos, entornos independientes
Terminal window
# Listar contenedores corriendo
docker ps
# Listar todos los contenedores
docker ps -a
# Iniciar contenedor
docker start nombre-contenedor
# Detener contenedor
docker stop nombre-contenedor
# Reiniciar contenedor
docker restart nombre-contenedor
# Eliminar contenedor
docker rm nombre-contenedor
# Ver logs
docker logs nombre-contenedor
# Logs en tiempo real
docker logs -f nombre-contenedor
# Entrar a un contenedor
docker exec -it nombre-contenedor bash
# o con sh si bash no está disponible
docker exec -it nombre-contenedor sh
Terminal window
# Listar imágenes
docker images
# Descargar imagen
docker pull nginx:alpine
# Eliminar imagen
docker rmi nombre-imagen
# Construir imagen desde Dockerfile
docker build -t mi-imagen:tag .
# Ver historial de una imagen
docker history nombre-imagen
Terminal window
# Iniciar servicios (en segundo plano)
docker compose up -d
# Ver logs de todos los servicios
docker compose logs -f
# Detener servicios
docker compose down
# Detener y eliminar volúmenes
docker compose down -v
# Reconstruir servicios
docker compose up -d --build
# Ver estado de servicios
docker compose ps
# Reiniciar servicio específico
docker compose restart nombre-servicio
proyecto/
├── Dockerfile # Instrucciones para construir imagen
├── docker-compose.yml # Orquestación de servicios
├── .dockerignore # Archivos a ignorar
├── nginx.conf # Configuración Nginx (si aplica)
└── src/ # Código fuente
version: '3.8'
services:
web:
build: .
container_name: mi-web
restart: unless-stopped
ports:
- "3000:80"
networks:
- mi-red
networks:
mi-red:
driver: bridge
Terminal window
# Listar redes
docker network ls
# Inspeccionar red
docker network inspect bridge
# Crear red personalizada
docker network create mi-red
# Conectar contenedor a red
docker network connect mi-red nombre-contenedor
# Desconectar contenedor
docker network disconnect mi-red nombre-contenedor
Terminal window
# Listar volúmenes
docker volume ls
# Crear volumen
docker volume create mi-volumen
# Inspeccionar volumen
docker volume inspect mi-volumen
# Eliminar volumen
docker volume rm mi-volumen
# Eliminar volúmenes no usados
docker volume prune

1. Named Volume (recomendado para datos):

volumes:
- mi-datos:/app/data

2. Bind Mount (archivos del host):

volumes:
- ./config:/app/config

3. Anonymous Volume:

volumes:
- /app/tmp
Terminal window
# Ver uso de disco de Docker
docker system df
# Limpiar todo lo no usado
docker system prune -a
# Limpiar solo contenedores parados
docker container prune
# Limpiar imágenes sin usar
docker image prune -a
# Limpiar volúmenes sin usar
docker volume prune
# Limpiar redes sin usar
docker network prune
Terminal window
# Ver uso de recursos en tiempo real
docker stats
# Ver uso de un contenedor específico
docker stats nombre-contenedor
# Ver procesos dentro de contenedor
docker top nombre-contenedor
# Inspeccionar configuración completa
docker inspect nombre-contenedor
services:
app:
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://...
# O desde archivo
env_file:
- .env
Terminal window
docker run -e NODE_ENV=production -e PORT=3000 imagen
services:
app:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
Terminal window
# Ver estado de salud
docker inspect --format='{{.State.Health.Status}}' contenedor
  1. Usar .dockerignore: Excluir node_modules, .git, etc.
  2. Multi-stage builds: Imágenes más pequeñas
  3. No usar latest: Especifica versiones concretas
  4. Un proceso por contenedor: Mejor separación
  5. Named volumes: Para datos persistentes
  6. Health checks: Detectar fallos automáticamente
  7. Limitar recursos: Evitar consumo excesivo
services:
app:
deploy:
resources:
limits:
cpus: '0.5' # Máximo 50% de 1 CPU
memory: 512M # Máximo 512MB RAM
reservations:
memory: 256M # Mínimo reservado
Terminal window
# Ver logs con timestamps
docker logs --timestamps nombre-contenedor
# Ver últimas N líneas
docker logs --tail 100 nombre-contenedor
# Seguir logs en tiempo real
docker logs -f nombre-contenedor
# Logs desde una fecha
docker logs --since 2024-01-01 nombre-contenedor
Terminal window
# Crear imagen desde contenedor
docker commit nombre-contenedor backup-imagen
# Exportar imagen
docker save -o backup.tar backup-imagen
Terminal window
# Backup de volumen
docker run --rm -v mi-volumen:/data -v $(pwd):/backup \
alpine tar czf /backup/volumen-backup.tar.gz /data
Terminal window
# Importar imagen
docker load -i backup.tar
# Restaurar volumen
docker run --rm -v mi-volumen:/data -v $(pwd):/backup \
alpine tar xzf /backup/volumen-backup.tar.gz -C /
Terminal window
# Ver logs para identificar error
docker logs nombre-contenedor
# Ver último comando ejecutado
docker inspect --format='{{.State.ExitCode}}' nombre-contenedor
Terminal window
# Ver qué proceso usa el puerto
sudo lsof -i :puerto
# Cambiar puerto en docker-compose.yml
ports:
- "3001:80" # Usar otro puerto del host
Terminal window
# Ver uso de Docker
docker system df
# Limpiar todo
docker system prune -a --volumes
Terminal window
# Verificar DNS
docker run --rm alpine nslookup google.com
# Reiniciar Docker
sudo systemctl restart docker
Terminal window
# No ejecutar como root dentro del contenedor
# En Dockerfile:
USER node # O otro usuario no-root
# Escanear vulnerabilidades
docker scan nombre-imagen
# Limitar capabilities
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE imagen