部署到容器平台
完成本地开发后,将数据墙DBW 部署到容器平台是上线的最常见路径。无论是单机 Docker 还是托管容器服务,流程基本一致。
构建生产镜像
生产镜像仅包含运行时必需的文件,不包含开发工具和调试信息:
dockerfile
FROM mcr.microsoft.com/azure-databases/data-api-builder:latest
COPY dab-config.json /App/dab-config.jsonbash
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.mode | production | 禁用 Swagger 和详细错误信息 |
graphql.allow-introspection | false | 不暴露完整的 API schema |
connection-string | @env() | 密钥不进镜像 |
| 日志级别 | Warning 或 Error | 减少日志量,关注异常 |
启动参数
生产环境推荐指定日志级别:
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容器内的所有日志默认输出到 stdout 和 stderr,可通过 docker logs dab-api 或 docker compose logs api 直接查看。
反向代理与 HTTPS
生产环境不应直接将数据墙DBW 暴露在 HTTP 端口上。推荐在容器前放置反向代理(Nginx、Traefik),由代理处理 HTTPS 终止:
text
客户端 → HTTPS (443) → 反向代理 → HTTP (5000) → 数据墙DBWNginx 配置示例
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 指令注入。
下一步
- 部署到 Kubernetes — 多实例水平扩展的容器编排方案。
- 健康检查 —
/health端点配置。
