Lanza un VPS Docker autoalojado en minutos
Contenedores autoalojados en un servidor que controlas tú. Contrata un VPS Docker, pega un bloque de instalación del repositorio oficial de Docker y unos minutos después ejecuta tu primer docker compose up.
Qué puedes hacer con un VPS Docker autoalojado
Un servidor y tantos contenedores como quepan. La aplicación, la base de datos, la cola y el proxy inverso conviven ahí, cada uno en su contenedor y con sus propias dependencias.
Levanta toda la stack desde un archivo
Usa imágenes listas en vez de configurar servidores
Publica actualizaciones sin perder datos
Ejecuta una arquitectura de microservicios en un servidor
Sobrevive a los reinicios sin intervención manual
Ejecuta Docker sin privilegios de root
Elige un plan de hosting VPS Docker
Docker Engine ocupa poco por sí mismo, así que dimensiona el plan por lo que corre dentro de los contenedores. Te recomendamos comenzar con un VPS Start con 2 núcleos de CPU y 2 GB de RAM. Para una pila típica de Compose con una base de datos y un proxy inverso, elige un VPS Medium con 4 GB de RAM.
Aumente los recursos de su servidor VPS
Descubra cómo puede cambiar la configuración de su VPS. Puede comprar espacio adicional en disco, aumentar el rendimiento del CPU, agregar RAM y aprovechar servicios adicionales sin tener que cambiar a un nuevo plan.
Cómo desplegar Docker en un VPS
De un VPS Ubuntu limpio a una stack Docker corriendo detrás de HTTPS en cinco pasos.
Step 01 — Contrata el VPS y conéctate
Elige un VPS Ubuntu en una ubicación cercana a tus usuarios o a las APIs externas que consultan tus contenedores y conéctate por SSH. Los comandos de abajo corren en una shell root.
ssh root@your-server-ipSi el acceso directo como root está deshabilitado, conéctate con tu cuenta habitual y ejecuta sudo -i.
Step 02 — Instala Docker Engine y Compose
Instala Docker Engine y el plugin Compose desde el repositorio apt oficial de Docker:
apt updateapt install ca-certificates curlinstall -m 0755 -d /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg \ -o /etc/apt/keyrings/docker.ascchmod a+r /etc/apt/keyrings/docker.asc tee /etc/apt/sources.list.d/docker.sources <<EOFTypes: debURIs: https://download.docker.com/linux/ubuntuSuites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")Components: stableArchitectures: $(dpkg --print-architecture)Signed-By: /etc/apt/keyrings/docker.ascEOF apt updateapt install docker-ce docker-ce-cli containerd.io \ docker-buildx-plugin docker-compose-pluginsystemctl enable --now dockerdocker run --rm hello-worldStep 03 — Apunta tu dominio al VPS
Crea un registro A que apunte el dominio de tu aplicación al VPS Docker. Caddy necesita que el dominio resuelva correctamente antes de emitir el certificado HTTPS.
Type: AName: appValue: your-server-ipPermite el tráfico TCP entrante en los puertos 80 y 443 en el firewall del servidor y en el panel de tu proveedor.
Step 04 — Define la stack de Docker
Crea el directorio del proyecto:
mkdir -p /opt/docker-appcd /opt/docker-appCrea el archivo .env y reemplaza el valor de ejemplo por una contraseña larga y segura para URL:
POSTGRES_PASSWORD=replace-with-a-long-random-stringCrea el Caddyfile:
app.yourdomain.com { reverse_proxy app:8080}Crea compose.yaml. Reemplaza your-org/your-app:1.4.2 por la imagen y la versión que usa tu aplicación. El nombre antiguo docker-compose.yml sigue siendo válido.
services: app: image: your-org/your-app:1.4.2 restart: unless-stopped environment: DATABASE_URL: postgres://app:${POSTGRES_PASSWORD}@db:5432/app depends_on: db: condition: service_healthy db: image: postgres:16 restart: unless-stopped environment: POSTGRES_DB: app POSTGRES_USER: app POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - db-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U app -d app"] interval: 5s timeout: 5s retries: 10 caddy: image: caddy:2 restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy-data:/data - caddy-config:/config volumes: db-data: caddy-data: caddy-config:Solo Caddy publica puertos en el host. La aplicación y la base de datos quedan disponibles únicamente dentro de la red privada de Compose.
Step 05 — Levanta la stack
Protege el archivo de entorno, levanta los contenedores y revisa su estado:
chmod 600 .envdocker compose up -ddocker compose psCaddy obtiene y renueva el certificado HTTPS automáticamente y redirige las solicitudes HTTP a HTTPS. Los volúmenes nombrados conservan los datos de la base y los certificados de Caddy cuando se recrean los contenedores.
Problemas frecuentes
- La aplicación arranca antes de que la base esté lista — un depends_on simple garantiza el orden de arranque, no que el servicio esté listo. Dale un health check a la base y depende de ella con condition: service_healthy, como arriba.
- Los puertos publicados ignoran ufw — Docker enruta el tráfico de los contenedores en la tabla nat, antes de las cadenas que usa ufw, así que un puerto publicado responde aunque ufw lo dé por cerrado. Publica solo el proxy; enlazar a 127.0.0.1 también publica el puerto, solo que limitado a la interfaz de loopback.
- Los pulls empiezan a fallar a mitad del despliegue — Docker Hub permite 100 pulls cada 6 horas por dirección IPv4 o subred IPv6 /64 sin autenticación, y 200 cada 6 horas en una cuenta Personal gratuita. Ejecuta docker login en el servidor antes de un despliegue que descargue muchas imágenes.
- Los datos desaparecieron al recrear el contenedor — los datos guardados en la capa escribible desaparecen cuando se elimina ese contenedor. Mantén los datos persistentes en un volumen nombrado o en un bind mount.