Implementación de Servicios con Scripts Shell y Docker

Prerrequisitos

Antes de comenzar, asegúrese de cumplir con estos requisitos:

  • Sistema operatiov Linux o compatible
  • Docker instalado y configurado
  • Conda disponible en el sistema host
  • Archivos del proyecto: código del servicio, pesos de modelos y entornos Conda empaquetados

Estructura del Proyecto

raiz-proyecto/
├── frontend/
│   ├── inicio.py
│   └── ... 
├── modelo/
│   ├── Qwen2___5-7B-Instruct/
│   └── ...
├── entorno_frontend.tar.gz
├── entorno_modelo.tar.gz
├── despliegue_frontend.sh
└── despliegue_modelo.sh

Preparación de Entornos Conda

# Empaquetar entorno frontend
conda activate entorno_frontend
conda pack -o entorno_frontend.tar.gz

# Empaquetar entorno modelo
conda activate entorno_modelo
conda pack -o entorno_modelo.tar.gz

Script de Despliegue para Frontend

#!/bin/bash

NOMBRE_CONTENEDOR="servicio_frontend"
IMAGEN_BASE="ubuntu:20.04"
ARCHIVO_CONDA="entorno_frontend.tar.gz"
PUERTO_HOST=8080
DIRECTORIO_APP="/app/frontend"

# Verificar Docker
if ! command -v docker &> /dev/null; then
    echo "ERROR: Docker no está instalado"
    exit 1
fi

# Eliminar contenedor existente
docker rm -f $NOMBRE_CONTENEDOR &> /dev/null

# Crear nuevo contenedor
docker run -d --name $NOMBRE_CONTENEDOR -p $PUERTO_HOST:8000 $IMAGEN_BASE sleep infinity

# Copiar código y entorno
docker cp frontend/ $NOMBRE_CONTENEDOR:$DIRECTORIO_APP/
docker cp $ARCHIVO_CONDA $NOMBRE_CONTENEDOR:/tmp/

# Configurar entorno dentro del contenedor
docker exec $NOMBRE_CONTENEDOR bash -c "apt-get update && \
    apt-get install -y wget bzip2 && \
    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda.sh && \
    bash /tmp/miniconda.sh -b -p /opt/conda && \
    tar -xzf /tmp/$ARCHIVO_CONDA -C /opt/"

# Iniciar servicio
docker exec $NOMBRE_CONTENEDOR bash -c "export PATH=/opt/conda_env/bin:\$PATH && \
    cd $DIRECTORIO_APP/inicio && \
    python inicio.py &"

echo "Servicio frontend disponible en http://<host>:$PUERTO_HOST"</host>

Script de Despliegue para Modelo

#!/bin/bash

NOMBRE_CONTENEDOR="servicio_modelo"
ARCHIVO_CONDA="entorno_modelo.tar.gz"
PUERTO_HOST=5050
RUTA_MODELO="/app/modelo/Qwen2___5-7B-Instruct"
COMANDO_INICIO="python -m vllm.entrypoints.openai.api_server --model $RUTA_MODELO --port 5000"

# Verificar existencia de modelo
if [ ! -d "modelo/Qwen2___5-7B-Instruct/" ]; then
    echo "ERROR: Directorio de modelo no encontrado"
    exit 1
fi

# Eliminar contenedor existente
docker rm -f $NOMBRE_CONTENEDOR &> /dev/null

# Crear nuevo contenedor
docker run -d --name $NOMBRE_CONTENEDOR -p $PUERTO_HOST:5000 ubuntu:20.04 sleep infinity

# Copiar recursos
docker cp modelo/Qwen2___5-7B-Instruct/ $NOMBRE_CONTENEDOR:$RUTA_MODELO/
docker cp $ARCHIVO_CONDA $NOMBRE_CONTENEDOR:/tmp/

# Configurar entorno
docker exec $NOMBRE_CONTENEDOR bash -c "apt-get update && \
    apt-get install -y wget && \
    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda.sh && \
    bash /tmp/miniconda.sh -b -p /opt/conda && \
    tar -xzf /tmp/$ARCHIVO_CONDA -C /opt/ && \
    /opt/conda_env/bin/pip install vllm"

# Iniciar servicio
docker exec $NOMBRE_CONTENEDOR bash -c "export PATH=/opt/conda_env/bin:\$PATH && $COMANDO_INICIO &"

echo "Servicio de modelo disponible en http://<host>:$PUERTO_HOST"</host>

Ejecución de Despliegue

# Dar permisos de ejecución
chmod +x despliegue_frontend.sh despliegue_modelo.sh

# Desplegar servicios
sudo ./despliegue_frontend.sh
sudo ./despliegue_modelo.sh

# Verificar frontend
curl http://localhost:8080

# Verificar modelo
curl http://localhost:5050/v1/models

Optimizaciones Recomendadas

  • Usar variables de entorno para configuración
  • Implementar registro de logs en archivos
  • Agregar manejo de errores en pasos críticos
  • Crear usuario no-root dentro de contenedores
  • Configurar política de reinicio automático

Manejo de Errores Comunes

  • Contenedor no inicia: revisar logs con docker logs <nombre_contenedor>
  • Problemas de puertos: verificar firewall y asignaciones
  • Fallos de entorno: validar integridad de archivos .tar.gz
  • Errores de permisos: ejectuar scripts con privilegios adecuados

Fundamentos de Shell para Despliegues

Sintaxis Básica

#!/bin/bash
VARIABLE="valor"
echo "Usando $VARIABLE"

Manejo de Condicionales

if [ ! -f "archivo.txt" ]; then
    echo "Archivo no encontrado"
    exit 1
fi

Funciones y Manejo de Errores

iniciar_servicio() {
    docker start $1 || { echo "Error al iniciar"; exit 1; }
}

trap "cleanup" EXIT
cleanup() { 
    rm -f temporales/*
}

Operaciones con Docker

# Crear contenedor
docker run -d --name mi_servicio -p 8080:80 nginx

# Ejecutar comando interno
docker exec mi_servicio nginx -t

# Copiar archivos
docker cp config.conf mi_servicio:/etc/nginx/

Mejores Prácticas

  • Usar nombres descriptivos para variables
  • Modularizar código en funciones
  • Validar parámetros de entrada
  • Evitar información sensible en scripts
  • Implementar registro estructurado de logs

Etiquetas: shell Docker Conda despliegue vLLM

Publicado el 6-23 22:15