使用容器运行数据墙DBW
数据墙DBW 以容器镜像形式发布,可以直接拉取运行,也可以基于 .NET 运行时构建自定义镜像。本教程将带你完成从零搭建容器化数据墙DBW 服务的完整流程。
前提条件
- Docker 已安装并正常运行。
- 一个可访问的关系型数据库(本教程以 SQL Server 为例)。
第一步:准备数据库和数据
如果还没有可用的数据库,用 Docker 快速启动一个 SQL Server 实例:
docker run \
--name mssql \
--publish 1433:1433 \
--detach \
--env "ACCEPT_EULA=Y" \
--env "MSSQL_SA_PASSWORD=YourPassword123!" \
mcr.microsoft.com/mssql/server:2022-latest创建示例数据库和表:
CREATE DATABASE Library;
GO
USE Library;
GO
CREATE TABLE dbo.Books (
id int NOT NULL PRIMARY KEY,
title nvarchar(1000) NOT NULL,
[year] int NULL,
pages int NULL
);
GO
INSERT INTO dbo.Books VALUES
(1000, '深入浅出 SQL Server', 2020, 326),
(1001, '数据库设计实战', 2019, 444),
(1002, 'SQL 性能优化指南', 2020, 528),
(1003, '现代数据架构', 2022, 506);
GOTIP
如果已有运行中的数据库,跳过这一步,直接使用你的数据库连接信息即可。
第二步:创建配置文件
在本地创建一个工作目录,编写 dab-config.json:
{
"$schema": "https://github.com/Azure/data-api-builder/releases/latest/download/dab.draft.schema.json",
"data-source": {
"database-type": "mssql",
"connection-string": "@env('SQL_CONN_STRING')"
},
"runtime": {
"rest": { "enabled": true },
"graphql": { "enabled": true },
"host": { "mode": "production" }
},
"entities": {
"Book": {
"source": { "object": "dbo.Books", "type": "table" },
"permissions": [
{ "role": "anonymous", "actions": ["read"] }
]
}
}
}NOTE
连接字符串使用 @env('SQL_CONN_STRING') 引用环境变量。容器运行时通过 Docker 环境变量注入实际的连接信息。
第三步:构建容器镜像
方式一:使用官方镜像(推荐)
官方镜像已内置 dab 工具,只需将配置文件复制进去:
FROM mcr.microsoft.com/azure-databases/data-api-builder:latest
COPY dab-config.json /App/dab-config.jsondocker build -t dab-api:latest .方式二:基于 .NET 运行时构建
如果没有官方镜像的访问权限,可以基于 .NET 运行时手动安装 dab:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
RUN dotnet tool install --global Microsoft.DataApiBuilder
ENV PATH="${PATH}:/root/.dotnet/tools"
COPY dab-config.json /App/dab-config.json
WORKDIR /App
EXPOSE 5000
ENTRYPOINT ["dab", "start"]docker build -t dab-api:latest .两种方式效果相同,构建后都会得到一个可直接运行的容器镜像。
第四步:启动容器
启动容器时需要传入数据库连接字符串环境变量,并将服务的 5000 端口映射到宿主机:
docker run \
--name dab-api \
--publish 5000:5000 \
--detach \
--env "SQL_CONN_STRING=Server=host.docker.internal,1433;Database=Library;User Id=sa;Password=YourPassword123!;TrustServerCertificate=true;Encrypt=true;" \
dab-api:latestIMPORTANT
host.docker.internal 是 Docker Desktop 中容器访问宿主机服务的特殊 DNS 名称。在 Linux 上可能需要使用 --add-host host.docker.internal:host-gateway 或在连接字符串中直接使用宿主机的 IP 地址。如果数据库同样运行在 Docker 中且与数据墙DBW 容器在同一 Docker 网络,可以直接使用数据库容器的名称或 IP。
第五步:验证服务
查看容器日志
docker logs dab-api确认输出中包含 Now listening on: http://[::]:5000。
测试 REST API
curl http://localhost:5000/api/Book预期返回:
{
"value": [
{ "id": 1000, "title": "深入浅出 SQL Server", "year": 2020, "pages": 326 },
{ "id": 1001, "title": "数据库设计实战", "year": 2019, "pages": 444 },
{ "id": 1002, "title": "SQL 性能优化指南", "year": 2020, "pages": 528 },
{ "id": 1003, "title": "现代数据架构", "year": 2022, "pages": 506 }
]
}测试 GraphQL API
curl -X POST http://localhost:5000/graphql \
-H "Content-Type: application/json" \
-d '{"query": "{ books { items { id title year pages } } }"}'健康检查
curl http://localhost:5000/health常用操作
停止和启动
docker stop dab-api
docker start dab-api查看日志
# 实时跟踪
docker logs -f dab-api
# 最近 50 行
docker logs --tail 50 dab-api更新配置后重新部署
修改 dab-config.json 后,重新构建镜像并重启容器:
docker build -t dab-api:latest .
docker stop dab-api && docker rm dab-api
docker run --name dab-api --publish 5000:5000 --detach \
--env "SQL_CONN_STRING=..." dab-api:latest进入容器内部
docker exec -it dab-api /bin/bash容器中的连接字符串
容器环境下连接字符串需要注意网络寻址:
| 场景 | 连接字符串中的主机地址 |
|---|---|
| 数据库在宿主机上,Docker Desktop(Windows/Mac) | host.docker.internal |
| 数据库在宿主机上,Docker Linux | 宿主机 IP 地址 或 --add-host |
| 数据库在另一个 Docker 容器中 | 数据库容器名(需在同一 Docker 网络) |
| 数据库在远程服务器上 | 远程服务器的 IP 或域名 |
同一 Docker 网络中,推荐将数据库容器和数据墙DBW 容器放在同一个 Docker Compose 编排中管理。
Docker Compose 编排
将数据库和数据墙DBW 编排在一个 docker-compose.yml 中:
version: "3.8"
services:
db:
image: mcr.microsoft.com/mssql/server:2022-latest
environment:
ACCEPT_EULA: "Y"
MSSQL_SA_PASSWORD: "YourPassword123!"
ports:
- "1433:1433"
api:
build: .
ports:
- "5000:5000"
environment:
SQL_CONN_STRING: "Server=db,1433;Database=Library;User Id=sa;Password=YourPassword123!;TrustServerCertificate=true;Encrypt=true;"
depends_on:
- dbdocker compose up -ddepends_on 确保数据库先启动。容器间通过服务名 db 直接通信。
