Docker en VPS
Guía para trabajar con Docker en tu VPS, aprovechando que ya tienes n8n instalado.
Estado Actual
Section titled “Estado Actual”Tu VPS ya tiene Docker instalado (viene con n8n), así que puedes usarlo directamente.
Verificar Instalación
Section titled “Verificar Instalación”# Ver versión de Dockerdocker --version
# Ver versión de Docker Composedocker compose version
# Ver contenedores en ejecucióndocker ps
# Ver todos los contenedoresdocker ps -a
# Ver imágenes descargadasdocker imagesConceptos Básicos
Section titled “Conceptos Básicos”Contenedores vs Imágenes
Section titled “Contenedores vs Imágenes”- Imagen: Plantilla inmutable (como un instalador)
- Contenedor: Instancia ejecutable de una imagen (aplicación corriendo)
Docker vs Instalación Tradicional
Section titled “Docker vs Instalación Tradicional”Instalación Tradicional:
# Muchas dependencias en el sistemaapt install nodejs nginx php mysql# Posibles conflictos entre proyectosCon Docker:
# Todo aislado en contenedoresdocker compose up -d# Sin conflictos, entornos independientesComandos Esenciales
Section titled “Comandos Esenciales”Gestión de Contenedores
Section titled “Gestión de Contenedores”# Listar contenedores corriendodocker ps
# Listar todos los contenedoresdocker ps -a
# Iniciar contenedordocker start nombre-contenedor
# Detener contenedordocker stop nombre-contenedor
# Reiniciar contenedordocker restart nombre-contenedor
# Eliminar contenedordocker rm nombre-contenedor
# Ver logsdocker logs nombre-contenedor
# Logs en tiempo realdocker logs -f nombre-contenedor
# Entrar a un contenedordocker exec -it nombre-contenedor bash# o con sh si bash no está disponibledocker exec -it nombre-contenedor shGestión de Imágenes
Section titled “Gestión de Imágenes”# Listar imágenesdocker images
# Descargar imagendocker pull nginx:alpine
# Eliminar imagendocker rmi nombre-imagen
# Construir imagen desde Dockerfiledocker build -t mi-imagen:tag .
# Ver historial de una imagendocker history nombre-imagenDocker Compose
Section titled “Docker Compose”# Iniciar servicios (en segundo plano)docker compose up -d
# Ver logs de todos los serviciosdocker compose logs -f
# Detener serviciosdocker compose down
# Detener y eliminar volúmenesdocker compose down -v
# Reconstruir serviciosdocker compose up -d --build
# Ver estado de serviciosdocker compose ps
# Reiniciar servicio específicodocker compose restart nombre-servicioEstructura Típica de Proyecto
Section titled “Estructura Típica de Proyecto”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 fuenteEjemplo: docker-compose.yml
Section titled “Ejemplo: docker-compose.yml”version: '3.8'
services: web: build: . container_name: mi-web restart: unless-stopped ports: - "3000:80" networks: - mi-red
networks: mi-red: driver: bridgeNetworking en Docker
Section titled “Networking en Docker”# Listar redesdocker network ls
# Inspeccionar reddocker network inspect bridge
# Crear red personalizadadocker network create mi-red
# Conectar contenedor a reddocker network connect mi-red nombre-contenedor
# Desconectar contenedordocker network disconnect mi-red nombre-contenedorVolúmenes (Persistencia de Datos)
Section titled “Volúmenes (Persistencia de Datos)”# Listar volúmenesdocker volume ls
# Crear volumendocker volume create mi-volumen
# Inspeccionar volumendocker volume inspect mi-volumen
# Eliminar volumendocker volume rm mi-volumen
# Eliminar volúmenes no usadosdocker volume pruneTipos de Montaje
Section titled “Tipos de Montaje”1. Named Volume (recomendado para datos):
volumes: - mi-datos:/app/data2. Bind Mount (archivos del host):
volumes: - ./config:/app/config3. Anonymous Volume:
volumes: - /app/tmpLimpieza y Mantenimiento
Section titled “Limpieza y Mantenimiento”# Ver uso de disco de Dockerdocker system df
# Limpiar todo lo no usadodocker system prune -a
# Limpiar solo contenedores paradosdocker container prune
# Limpiar imágenes sin usardocker image prune -a
# Limpiar volúmenes sin usardocker volume prune
# Limpiar redes sin usardocker network pruneMonitoreo de Recursos
Section titled “Monitoreo de Recursos”# Ver uso de recursos en tiempo realdocker stats
# Ver uso de un contenedor específicodocker stats nombre-contenedor
# Ver procesos dentro de contenedordocker top nombre-contenedor
# Inspeccionar configuración completadocker inspect nombre-contenedorVariables de Entorno
Section titled “Variables de Entorno”En docker-compose.yml
Section titled “En docker-compose.yml”services: app: environment: - NODE_ENV=production - DATABASE_URL=postgres://... # O desde archivo env_file: - .envEn línea de comandos
Section titled “En línea de comandos”docker run -e NODE_ENV=production -e PORT=3000 imagenHealth Checks
Section titled “Health Checks”services: app: healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 30s timeout: 10s retries: 3 start_period: 40s# Ver estado de saluddocker inspect --format='{{.State.Health.Status}}' contenedorMejores Prácticas
Section titled “Mejores Prácticas”- Usar .dockerignore: Excluir node_modules, .git, etc.
- Multi-stage builds: Imágenes más pequeñas
- No usar latest: Especifica versiones concretas
- Un proceso por contenedor: Mejor separación
- Named volumes: Para datos persistentes
- Health checks: Detectar fallos automáticamente
- Limitar recursos: Evitar consumo excesivo
Limitar Recursos
Section titled “Limitar Recursos”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# Ver logs con timestampsdocker logs --timestamps nombre-contenedor
# Ver últimas N líneasdocker logs --tail 100 nombre-contenedor
# Seguir logs en tiempo realdocker logs -f nombre-contenedor
# Logs desde una fechadocker logs --since 2024-01-01 nombre-contenedorBackup y Restore
Section titled “Backup y Restore”Backup de Contenedor
Section titled “Backup de Contenedor”# Crear imagen desde contenedordocker commit nombre-contenedor backup-imagen
# Exportar imagendocker save -o backup.tar backup-imagenBackup de Volumen
Section titled “Backup de Volumen”# Backup de volumendocker run --rm -v mi-volumen:/data -v $(pwd):/backup \ alpine tar czf /backup/volumen-backup.tar.gz /dataRestore
Section titled “Restore”# Importar imagendocker load -i backup.tar
# Restaurar volumendocker run --rm -v mi-volumen:/data -v $(pwd):/backup \ alpine tar xzf /backup/volumen-backup.tar.gz -C /Solución de Problemas Comunes
Section titled “Solución de Problemas Comunes”Contenedor se detiene inmediatamente
Section titled “Contenedor se detiene inmediatamente”# Ver logs para identificar errordocker logs nombre-contenedor
# Ver último comando ejecutadodocker inspect --format='{{.State.ExitCode}}' nombre-contenedorPuerto ya en uso
Section titled “Puerto ya en uso”# Ver qué proceso usa el puertosudo lsof -i :puerto
# Cambiar puerto en docker-compose.ymlports: - "3001:80" # Usar otro puerto del hostSin espacio en disco
Section titled “Sin espacio en disco”# Ver uso de Dockerdocker system df
# Limpiar tododocker system prune -a --volumesContenedor no tiene acceso a internet
Section titled “Contenedor no tiene acceso a internet”# Verificar DNSdocker run --rm alpine nslookup google.com
# Reiniciar Dockersudo systemctl restart dockerSeguridad
Section titled “Seguridad”# No ejecutar como root dentro del contenedor# En Dockerfile:USER node # O otro usuario no-root
# Escanear vulnerabilidadesdocker scan nombre-imagen
# Limitar capabilitiesdocker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE imagenSiguiente Paso
Section titled “Siguiente Paso”- Desplegar Astro con Docker
- Configurar múltiples proyectos con Docker
- Usar Traefik como reverse proxy para gestionar dominios