Saltar al contenido
Infrastructure 2024-12-29 10 min de lectura

Cómo Migrar un Proyecto Docker de Local a un VPS

Tener un proyecto funcionando perfectamente con Docker en tu entorno local es solo la mitad del camino: el verdadero reto llega al momento de migrarlo a un VPS en producción. Aunque Docker está diseñado precisamente para que "funcione igual en todos lados", el proceso de migración tiene varios pasos que conviene seguir en orden para evitar sorpresas: exportar la imagen, transferir los datos, restaurar la base de datos y, finalmente, asegurar todo con SSL. Esta guía recorre el proceso completo de principio a fin.

Cómo Migrar un Proyecto Docker de Local a un VPS
#Infrastructure#Docker#VPS#DevOps
T
Equipo Terranode
Editorial

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:

bash
docker images

Luego, expórtala a un archivo .tar:

bash
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:

bash
docker exec -it nombre_del_contenedor_db bash

Genera un volcado (dump) de la base de datos dentro del contenedor:

bash
mysqldump -u usuario -p nombre_base_datos > backup.sql

Y cópialo desde el contenedor hacia tu máquina local:

bash
docker cp nombre_del_contenedor_db:/ruta/al/backup.sql ./

Paso 3: Preparar el VPS

Actualiza el sistema:

bash
sudo apt update && sudo apt upgrade -y

Instala Docker y Docker Compose:

bash
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:

bash
adduser tu_usuario
usermod -aG docker tu_usuario
su - tu_usuario

Configura el firewall para permitir SSH y tráfico web:

bash
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:

bash
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:

bash
rsync -avz --progress tu_proyecto.tar tu_usuario@ip_del_vps:/home/tu_usuario/

Paso 5: Cargar la imagen en el VPS

bash
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:

bash
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:

bash
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:

yaml
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

bash
docker-compose up -d

Para monitorear los logs en tiempo real y confirmar que todo arrancó correctamente:

bash
docker-compose logs -f

Paso 9: Configurar HTTPS con Let's Encrypt

Instala Certbot:

bash
sudo apt install certbot -y

Genera el certificado (usando el modo standalone, que requiere que el puerto 80 esté libre momentáneamente):

bash
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:

yaml
    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:

bash
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.

¿Listo para llevar tu sitio al siguiente nivel?

Hosting con LiteSpeed, NVMe y soporte 24/7 desde $3/mes.

Ver planes de hosting

Preguntas frecuentes