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