Skip to content

使用容器运行数据墙DBW

数据墙DBW 以容器镜像形式发布,可以直接拉取运行,也可以基于 .NET 运行时构建自定义镜像。本教程将带你完成从零搭建容器化数据墙DBW 服务的完整流程。

前提条件

  • Docker 已安装并正常运行。
  • 一个可访问的关系型数据库(本教程以 SQL Server 为例)。

第一步:准备数据库和数据

如果还没有可用的数据库,用 Docker 快速启动一个 SQL Server 实例:

bash
docker run \
    --name mssql \
    --publish 1433:1433 \
    --detach \
    --env "ACCEPT_EULA=Y" \
    --env "MSSQL_SA_PASSWORD=YourPassword123!" \
    mcr.microsoft.com/mssql/server:2022-latest

创建示例数据库和表:

sql
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);
GO

TIP

如果已有运行中的数据库,跳过这一步,直接使用你的数据库连接信息即可。

第二步:创建配置文件

在本地创建一个工作目录,编写 dab-config.json

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 工具,只需将配置文件复制进去:

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:latest .

方式二:基于 .NET 运行时构建

如果没有官方镜像的访问权限,可以基于 .NET 运行时手动安装 dab

dockerfile
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"]
bash
docker build -t dab-api:latest .

两种方式效果相同,构建后都会得到一个可直接运行的容器镜像。

第四步:启动容器

启动容器时需要传入数据库连接字符串环境变量,并将服务的 5000 端口映射到宿主机:

bash
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:latest

IMPORTANT

host.docker.internal 是 Docker Desktop 中容器访问宿主机服务的特殊 DNS 名称。在 Linux 上可能需要使用 --add-host host.docker.internal:host-gateway 或在连接字符串中直接使用宿主机的 IP 地址。如果数据库同样运行在 Docker 中且与数据墙DBW 容器在同一 Docker 网络,可以直接使用数据库容器的名称或 IP。

第五步:验证服务

查看容器日志

bash
docker logs dab-api

确认输出中包含 Now listening on: http://[::]:5000

测试 REST API

bash
curl http://localhost:5000/api/Book

预期返回:

json
{
  "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

bash
curl -X POST http://localhost:5000/graphql \
  -H "Content-Type: application/json" \
  -d '{"query": "{ books { items { id title year pages } } }"}'

健康检查

bash
curl http://localhost:5000/health

常用操作

停止和启动

bash
docker stop dab-api
docker start dab-api

查看日志

bash
# 实时跟踪
docker logs -f dab-api

# 最近 50 行
docker logs --tail 50 dab-api

更新配置后重新部署

修改 dab-config.json 后,重新构建镜像并重启容器:

bash
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

进入容器内部

bash
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 中:

yaml
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:
      - db
bash
docker compose up -d

depends_on 确保数据库先启动。容器间通过服务名 db 直接通信。

下一步

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