Cómo Subir una Imagen Docker a tu Proyecto con un Dockerfile previamente Configurado
¡Hola a todos! En este artículo, quiero compartir con ustedes un método sencillo y eficiente para subir una imagen Docker a su servidor. Este proceso puede parecer complicado al principio, pero con el script adecuado y algunas configuraciones, puedes automatizar todo el flujo de trabajo.
Docker es una herramienta poderosa que permite a los desarrolladores empaquetar aplicaciones junto con todas sus dependencias en contenedores. Estos contenedores aseguran que tu aplicación se ejecute de manera consistente sin importar dónde se despliegue.
Introducción
Primero, vamos a asegurarnos de que tu entorno esté listo para trabajar con Docker. Si estás utilizando Debian, hay algunos paquetes que debes instalar antes de comenzar.
💡 Te recomiendo instalar los paquetes base de Debian antes de continuar puedes encontrarlos aquí: Paquetes Base Debian 11 / Debian 12
Una vez que tengas todo configurado, el siguiente paso es preparar tu Dockerfile. Un Dockerfile bien configurado es crucial para crear imágenes Docker eficientes y funcionales. Puedes ver mis otros artículos del blog donde dejo ejemplos para crear imágenes para NestJS, Vite, NodeJS, etc. Después de eso, el script que te voy a proporcionar se encargará del resto.
Aquí tienes el script:
#!/bin/bash
# Script para subir tu imagen Docker al servidor
# Definir variables
IMAGE_NAME="nombre_de_tu_imagen"
SERVER_IP="tu.ip.ser.vidor"
SERVER_USER="usuario_servidor"
LOCAL_IMAGE_PATH="./${IMAGE_NAME}.tar"
REMOTE_IMAGE_PATH="/ruta/${IMAGE_NAME}.tar"
CONTAINER_PORT="puerto_contenedor"
HOST_PORT="puerto_host"
# Paso 0: Puedes configurar pasos previos, como formatear y validar la sintaxis de tu código con ESLint.
npm run lint
# Paso 1: Compilar la imagen de Docker localmente
echo "Compilando la imagen de Docker ${IMAGE_NAME}..."
docker build -t ${IMAGE_NAME} .
# Paso 2: Guardar la imagen de Docker en un archivo
echo "Guardando la imagen en ${LOCAL_IMAGE_PATH}..."
docker save ${IMAGE_NAME} > ${LOCAL_IMAGE_PATH}
# Eliminar imagen anterior del servidor remoto (si existe)
echo "Limpiando imagen antigua en el servidor remoto..."
ssh ${SERVER_USER}@${SERVER_IP} "docker stop ${IMAGE_NAME} 2> /dev/null; docker rm ${IMAGE_NAME} 2> /dev/null; docker rmi ${IMAGE_NAME} -f 2> /dev/null; true"
# Paso 3: Transferir la imagen de Docker al servidor remoto
echo "Transfiriendo la imagen al servidor remoto..."
scp ${LOCAL_IMAGE_PATH} ${SERVER_USER}@${SERVER_IP}:${REMOTE_IMAGE_PATH}
# Paso 4: Cargar la imagen de Docker en el servidor remoto
echo "Cargando la imagen en el servidor remoto..."
ssh ${SERVER_USER}@${SERVER_IP} "docker load < ${REMOTE_IMAGE_PATH}"
# Paso 5: Correr la imagen en el servidor
echo "Iniciando el contenedor en el servidor remoto..."
ssh ${SERVER_USER}@${SERVER_IP} "docker run --restart always -p ${HOST_PORT}:${CONTAINER_PORT} --name ${IMAGE_NAME} -d ${IMAGE_NAME}"
# Limpiar imagen local y archivo tar
echo "Deteniendo y eliminando contenedor local si existe..."
docker stop ${IMAGE_NAME} 2> /dev/null
docker rm ${IMAGE_NAME} 2> /dev/null
echo "Limpiando recursos locales..."
docker rmi ${IMAGE_NAME} -f
rm ${LOCAL_IMAGE_PATH}
echo "Proceso completado."
💡 Puede resultar útil que configures un acceso SSH mediante llaves a tu servidor desde tu equipo, de esta forma no tendrás que introducir la contraseña por cada paso que requiera la conexión al servidor. No consideré almacenar temporalmente la contraseña en la ejecución del script por motivos de seguridad.
Descripción del Script
- Pasos previos: Antes de comenzar, puedes configurar el script para formatear tu código utilizando Prettier para asegurar una buena calidad del código, por ejemplo. Ajusta esto a tu proyecto.
- Compilar la Imagen Docker: Compila la imagen Docker localmente utilizando tu Dockerfile.
- Guardar la Imagen: Guarda la imagen Docker en un archivo local.
- Limpiar Imagen Anterior: Elimina cualquier imagen previa en el servidor remoto para evitar conflictos.
- Transferir la Imagen: Transfiere el archivo de imagen Docker al servidor remoto.
- Cargar la Imagen en el Servidor: Carga la imagen Docker en el servidor remoto.
- Iniciar el Contenedor: Inicia el contenedor en el servidor remoto y configura el reinicio automático.
- Limpiar Recursos Locales: Detiene y elimina cualquier contenedor local existente y limpia los recursos locales.
Este script es muy útil para automatizar el proceso de despliegue de imágenes Docker en un servidor remoto, asegurando que siempre estés ejecutando la última versión de tu aplicación.
💡 Asegúrate de ajustar las variables según tus necesidades específicas y de tener las credenciales y permisos necesarios para acceder a tu servidor remoto.
¡Espero que este artículo te haya sido útil!