Qué necesitas antes de empezar
- Un VPS funcional (preferentemente Ubuntu o Debian).
- Docker y Docker Compose instalados tanto en tu entorno local como en el VPS.
- Acceso SSH al VPS.
- La imagen Docker de tu proyecto ya construida y probada localmente.
- Si tu proyecto incluye una base de datos, un plan para exportarla y migrarla también (no solo la imagen de la aplicación).
Paso 1: Exportar la imagen Docker desde tu entorno local
Primero, identifica la imagen exacta que quieres migrar:
docker images Luego, expórtala a un archivo .tar:
docker save -o tu_proyecto.tar tu_imagen:tag Usa un nombre descriptivo para el archivo (por ejemplo mi_proyecto_laravel.tar) para evitar confusiones si manejas varios proyectos.
Paso 2: Exportar la base de datos (si tu proyecto la usa)
Accede al contenedor de la base de datos:
docker exec -it nombre_del_contenedor_db bash Genera un volcado (dump) de la base de datos dentro del contenedor:
mysqldump -u usuario -p nombre_base_datos > backup.sql Y cópialo desde el contenedor hacia tu máquina local:
docker cp nombre_del_contenedor_db:/ruta/al/backup.sql ./ Paso 3: Preparar el VPS
Actualiza el sistema:
sudo apt update && sudo apt upgrade -y Instala Docker y Docker Compose:
sudo apt install docker.io -y
sudo systemctl enable docker
sudo systemctl start docker
sudo docker --version
sudo apt install docker-compose -y Crea un usuario sin privilegios de root, con acceso al grupo docker para no depender de sudo en cada comando:
adduser tu_usuario
usermod -aG docker tu_usuario
su - tu_usuario Configura el firewall para permitir SSH y tráfico web:
sudo ufw allow OpenSSH
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable Paso 4: Transferir los archivos al VPS
Usa scp para copiar la imagen exportada y el backup de la base de datos:
scp tu_proyecto.tar tu_usuario@ip_del_vps:/home/tu_usuario/
scp backup.sql tu_usuario@ip_del_vps:/home/tu_usuario/ Si tu conexión es lenta o el archivo es muy grande, rsync suele ser más eficiente al soportar reanudación de transferencias interrumpidas:
rsync -avz --progress tu_proyecto.tar tu_usuario@ip_del_vps:/home/tu_usuario/ Paso 5: Cargar la imagen en el VPS
docker load -i /home/tu_usuario/tu_proyecto.tar
docker images Confirma que la imagen aparece en la lista con el mismo nombre y tag que tenía en tu entorno local.
Paso 6: Restaurar la base de datos en el VPS
Levanta un contenedor nuevo de la base de datos con las mismas credenciales que usará tu aplicación:
docker run --name db \
-e MYSQL_ROOT_PASSWORD=tu_root_password \
-e MYSQL_DATABASE=laravel_db \
-e MYSQL_USER=laravel_user \
-e MYSQL_PASSWORD=tu_contraseña_segura \
-d mysql:5.7 Copia el backup dentro del contenedor y restáuralo:
docker cp /home/tu_usuario/backup.sql db:/backup.sql
docker exec -it db bash
mysql -u root -p laravel_db < /backup.sql
exit Paso 7: Crear el archivo Docker Compose para producción
En lugar de contenedores sueltos, orquesta todo con un docker-compose.yml bien indentado:
version: '3.8'
services:
app:
image: tu_imagen:tag
ports:
- "80:80"
- "443:443"
volumes:
- .:/var/www/html
environment:
- APP_ENV=production
- APP_DEBUG=false
- DB_HOST=db
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: laravel_db
MYSQL_USER: laravel_user
MYSQL_PASSWORD: tu_contraseña_segura
MYSQL_ROOT_PASSWORD: tu_root_password
volumes:
- db_data:/var/lib/mysql
volumes:
db_data: Nota importante: la indentación en YAML es significativa. Un error de espacios puede hacer que Docker Compose interprete mal la jerarquía de servicios, así que revisa el archivo con cuidado antes de levantarlo (o valídalo con docker-compose config).
Paso 8: Levantar los contenedores
docker-compose up -d Para monitorear los logs en tiempo real y confirmar que todo arrancó correctamente:
docker-compose logs -f Paso 9: Configurar HTTPS con Let's Encrypt
Instala Certbot:
sudo apt install certbot -y Genera el certificado (usando el modo standalone, que requiere que el puerto 80 esté libre momentáneamente):
sudo certbot certonly --standalone -d tu_dominio.com Monta los certificados generados dentro de tu contenedor agregando estos volúmenes al servicio app en tu docker-compose.yml:
volumes:
- .:/var/www/html
- /etc/letsencrypt/live/tu_dominio.com/fullchain.pem:/etc/ssl/certs/ssl-cert.pem:ro
- /etc/letsencrypt/live/tu_dominio.com/privkey.pem:/etc/ssl/private/ssl-cert.key:ro Y reinicia los contenedores para aplicar los cambios:
docker-compose down && docker-compose up -d Paso 10: Verificar que todo funcione correctamente
Usa herramientas como [SSL Labs](https://www.ssllabs.com/ssltest/) para confirmar que tu certificado SSL está bien configurado y no presenta advertencias de seguridad. Revisa también que la aplicación responda correctamente accediendo desde el navegador, y que la base de datos esté sirviendo los datos migrados sin errores.
Migrar un proyecto Docker de local a producción se reduce, en esencia, a cinco pasos: exportar la imagen y la base de datos, preparar el VPS, transferir y restaurar los datos, orquestar todo con Docker Compose, y cerrar el proceso con HTTPS. Seguir este orden evita la mayoría de los problemas comunes, especialmente los relacionados con indentación incorrecta en el docker-compose.yml o credenciales de base de datos que no coinciden entre el entorno local y el de producción. Si tienes dudas durante la implementación, nuestro equipo de soporte técnico está disponible 24/7 para ayudarte.
LiteSpeed hosting, NVMe and 24/7 support from $3/mo.