Контейнеризация AI-сервиса — это упаковка вашего приложения с AI-функциями в Docker-контейнер для единообразного развёртывания в любом окружении. В этом руководстве мы создадим production-ready контейнер с Python AI-сервисом, который работает через ModelSwitch API.
Оптимальный Dockerfile
Используйте multi-stage сборку для минимизации размера финального образа:
# Dockerfile
FROM python:3.12-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
FROM python:3.12-slim
WORKDIR /app
COPY --from=builder /install /usr/local
COPY . .
# Непривилегированный пользователь
RUN useradd -m appuser
USER appuser
# Health check
HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]
Ключевые моменты: multi-stage сборка уменьшает образ на 200-400 МБ, непривилегированный пользователь повышает безопасность, а health check позволяет оркестратору отслеживать состояние контейнера.
AI-сервис с health check
Создайте FastAPI-приложение с эндпоинтом health check и обработкой AI-запросов:
# main.py
import os
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from openai import AsyncOpenAI
app = FastAPI(title="AI Service")
client = AsyncOpenAI(
base_url=os.environ.get("MODELSWITCH_BASE_URL", "https://api.modelswitch.ru/v1"),
api_key=os.environ["MODELSWITCH_API_KEY"],
)
class ChatRequest(BaseModel):
message: str
model: str = "gpt-4o-mini"
@app.get("/health")
async def health():
return {"status": "ok"}
@app.post("/api/chat")
async def chat(req: ChatRequest):
try:
response = await client.chat.completions.create(
model=req.model,
messages=[{"role": "user", "content": req.message}],
max_tokens=2000,
)
return {
"reply": response.choices[0].message.content,
"model": req.model,
"tokens": response.usage.total_tokens if response.usage else 0,
}
except Exception as e:
raise HTTPException(status_code=502, detail=str(e))
Docker Compose для разработки и продакшена
Настройте docker-compose с Nginx, логированием и автоматическим перезапуском:
# docker-compose.yml
services:
ai-service:
build: .
environment:
- MODELSWITCH_API_KEY=${MODELSWITCH_API_KEY}
- MODELSWITCH_BASE_URL=https://api.modelswitch.ru/v1
deploy:
replicas: 2
resources:
limits:
memory: 512M
cpus: "0.5"
restart: unless-stopped
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- ai-service
restart: unless-stopped
# nginx.conf
upstream ai_backend {
server ai-service:8000;
}
server {
listen 80;
location / {
proxy_pass http://ai_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 120s;
}
location /health {
proxy_pass http://ai_backend/health;
}
}
Управление секретами
Никогда не записывайте API-ключ в Dockerfile или docker-compose.yml. Используйте Docker secrets или переменные окружения через .env файл (добавленный в .dockerignore):
# .env (НЕ коммитить в git!)
MODELSWITCH_API_KEY=msk_ваш_ключ
# Запуск
docker compose --env-file .env up -d
# Проверка health check
curl http://localhost/health
# Тестовый запрос
curl -X POST http://localhost/api/chat -H "Content-Type: application/json" -d '{"message": "Привет!", "model": "gpt-4o-mini"}'
Заключение
Docker-контейнер с AI-сервисом через ModelSwitch — это надёжный и масштабируемый способ деплоя AI-функций. Multi-stage Dockerfile, health checks, Nginx балансировка и правильное управление секретами обеспечивают production-ready развёртывание. ModelSwitch упрощает серверную логику: один API-ключ, один формат запросов для всех 300+ моделей.