Skip to content

部署到容器平台

完成本地开发后,将数据墙DBW 部署到容器平台是上线的最常见路径。无论是单机 Docker 还是托管容器服务,流程基本一致。

构建生产镜像

生产镜像仅包含运行时必需的文件,不包含开发工具和调试信息:

dockerfile
FROM mcr.microsoft.com/azure-databases/data-api-builder:latest
COPY dab-config.json /App/dab-config.json
bash
docker build -t dab-api:prod .

IMPORTANT

不要在镜像中打包密钥。连接字符串和密码应通过容器运行时的环境变量注入。

生产配置要点

与开发环境相比,生产配置有几处重要差异:

json
{
  "runtime": {
    "host": {
      "mode": "production"
    },
    "graphql": {
      "allow-introspection": false
    }
  },
  "data-source": {
    "connection-string": "@env('SQL_CONN_STRING')"
  }
}
配置项生产建议原因
host.modeproduction禁用 Swagger 和详细错误信息
graphql.allow-introspectionfalse不暴露完整的 API schema
connection-string@env()密钥不进镜像
日志级别WarningError减少日志量,关注异常

启动参数

生产环境推荐指定日志级别:

bash
docker run \
    --name dab-api \
    --publish 5000:5000 \
    --detach \
    --restart unless-stopped \
    --env "SQL_CONN_STRING=Server=db-host;Database=Library;User Id=app;Password=...;Encrypt=true;" \
    dab-api:prod
参数说明
--detach后台运行
--restart unless-stopped容器异常退出时自动重启
--env注入环境变量(连接字符串等)
--publish映射端口

TIP

当使用反向代理处理 HTTPS 时,建议添加 --no-https-redirect 参数启动容器,避免数据墙DBW 尝试自行重定向导致循环。

bash
dab start --no-https-redirect

容器内的所有日志默认输出到 stdoutstderr,可通过 docker logs dab-apidocker compose logs api 直接查看。

反向代理与 HTTPS

生产环境不应直接将数据墙DBW 暴露在 HTTP 端口上。推荐在容器前放置反向代理(Nginx、Traefik),由代理处理 HTTPS 终止:

text
客户端 → HTTPS (443) → 反向代理 → HTTP (5000) → 数据墙DBW

Nginx 配置示例

nginx
server {
    listen 443 ssl;
    server_name api.example.com;

    ssl_certificate     /etc/ssl/certs/api.example.com.crt;
    ssl_certificate_key /etc/ssl/private/api.example.com.key;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

反向代理还可以承担以下职责:

  • 速率限制和请求过滤。
  • 认证注入(将用户身份通过 X-MS-API-ROLE 头传入数据墙DBW)。
  • 请求日志和访问审计。

健康检查与监控

Docker 健康检查

bash
docker run \
    --health-cmd="wget --no-verbose --tries=1 --spider http://localhost:5000/health || exit 1" \
    --health-interval=30s \
    --health-timeout=5s \
    --health-retries=3 \
    ...

Docker 会根据健康检查结果标记容器状态,配合编排工具实现自动恢复。

监控集成

通过 OpenTelemetry 将追踪和指标数据发送到可观测平台:

json
{
  "runtime": {
    "telemetry": {
      "open-telemetry": {
        "enabled": true,
        "endpoint": "http://otel-collector:4317",
        "protocol": "grpc",
        "service-name": "dab-api-prod"
      }
    }
  }
}

将 OpenTelemetry Collector 与数据墙DBW 部署在同一容器网络中,通过服务名访问。

资源限制

为容器设置 CPU 和内存限制,防止单个实例耗尽宿主机资源:

bash
docker run \
    --cpus="2.0" \
    --memory="512m" \
    --memory-swap="1g" \
    ...

数据墙DBW 单个实例内存占用通常在 50–150 MB,具体取决于并发请求数和数据负载。建议从以下配置开始,根据监控数据调整:

流量级别建议 CPU建议内存
低(< 10 req/s)0.5–1 核256 MB
中(10–50 req/s)1–2 核512 MB
高(> 50 req/s)2–4 核1 GB + 水平扩展

Docker Compose 生产编排

yaml
version: "3.8"
services:
  api:
    image: dab-api:prod
    ports:
      - "5000:5000"
    environment:
      SQL_CONN_STRING: "${SQL_CONN_STRING}"
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:5000/health"]
      interval: 30s
      timeout: 5s
      retries: 3
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: "512m"

NOTE

Docker Compose 中 @env() 引用的是宿主机上的 .env 文件或已导出的环境变量,不是 DAB 的 @env() 语法。在 Compose 中应直接写完整的连接字符串或通过 environment 指令注入。

下一步

数据墙DBW 产品文档与开发指南。