本页目录
Docker 部署
本页在 Linux Docker 主机上直接运行 TGateway,不包含 Watchdog。用已发布的 linux-x64 网关目录构建自己的镜像;下载中心的参考镜像仅供 linux-x64 验证。ARM64 部署需同时更换发布包、基础镜像和构建平台。
准备发布目录
从对应平台的完整 Watchdog 包中取得 GatewayApp,或使用同平台的完整 TGateway 发布目录。不要只复制可执行文件,也不要用未发布的源代码目录构建运行镜像。
目录中至少应有 TGateway、appsettings.json、Configuration/ 和随包依赖。使用下面的结构区分程序与工程数据:
| 容器位置 | 用途 |
|---|---|
/app | 当前镜像中的程序与依赖,更新镜像时替换 |
/data | 当前工程的配置、数据库、日志、缓存、脚本、用户插件和证书,挂载持久化卷 |
ProjectDirectory=/data | 让 TGateway 从该工程目录加载业务配置并保存数据 |
工程目录机制详见配置文件说明。配置中填写的外部绝对路径还需单独挂载,不能认为它们自动属于 /data。
构建镜像
在完整发布目录中保存以下 Dockerfile。工程初始文件随镜像准备,首次创建空的命名卷时由 Docker 复制进去;已有卷保留原数据。
FROM mcr.microsoft.com/dotnet/runtime:10.0-noble-amd64
WORKDIR /app
COPY . /app
# 工程与程序分离,首次空卷获得配置和随包工程资源。
RUN chmod +x /app/TGateway \
&& mkdir -p /data \
&& cp /app/appsettings.json /data/appsettings.json \
&& for directory in Configuration DB OTHERDB opc ScriptDlls CustomNodeDlls PluginDlls RuntimeDlls public data files; do \
if [ -d "/app/$directory" ]; then cp -a "/app/$directory" "/data/$directory"; fi; \
done
ENV TZ=Asia/Shanghai
ENV ProjectDirectory=/data
EXPOSE 6100
ENTRYPOINT ["/app/TGateway"]docker build --platform linux/amd64 -t my-tgateway:current .
docker volume create tgateway-project
docker run -d --name tgateway --restart unless-stopped \
--mount type=volume,source=tgateway-project,target=/data \
-p 127.0.0.1:6100:6100 \
my-tgateway:current示例只向宿主机回环地址发布管理端口。在宿主机访问 http://localhost:6100;远程访问通过按现场规划配置的 HTTPS 代理。首次账号与工作区核对见启动与首次登录。
不要把整个 /app 挂载成旧程序目录,否则更换镜像后仍可能运行旧文件。首次使用绑定目录代替命名卷时,需自行准备完整工程配置与写入权限,Docker 不会把镜像中的初始文件自动填入绑定目录。
检查运行与网络
docker ps --filter name=tgateway
docker logs --tail 100 tgateway
docker inspect --format '{{json .Mounts}}' tgateway确认容器持续运行、/data 对应预期卷,且 Web 可以登录。随后用内置仿真器读到一个已知变量,并独立核对实际数据接收端。
- 容器里的
127.0.0.1指向容器自身,连接宿主机或外部设备时使用可达的实际地址。 - 主站客户端连接设备通常不需要发布设备端口;仿真器或协议服务端需要接收外部连接时,才额外映射其监听端口。UDP 协议需明确
/udp。 - 使用串口时按实际设备增加
--device映射并授予容器账号权限;发现和广播类协议还需核对 Docker 网络模式。 - 业务日志默认位于工程内
Logs/。外部数据库、上传路径和绝对历史路径需分别核对可达性与持久化。
验证持久化
- 在测试工程中保存一个可辨识的变量名称或说明,记录当前 Gateway 标识码。
- 停止并删除容器;这会中断该容器中的采集,先安排测试或维护窗口。
- 使用同一个镜像与同一个
tgateway-project卷重新创建:
docker stop tgateway
docker rm tgateway
docker run -d --name tgateway --restart unless-stopped \
--mount type=volume,source=tgateway-project,target=/data \
-p 127.0.0.1:6100:6100 \
my-tgateway:current- 重新登录,确认项目配置、Gateway 标识码和预期记录保留,并确认新的采样继续产生。仅执行
docker restart不能验证删除容器后的恢复能力。
不要删除数据卷来解决配置或授权状态解析错误,处理方法见授权状态文件异常。
备份与更新
先在新的完整发布目录构建 my-tgateway:next,再安排维护窗口。备份前停止当前容器,避免只复制到 SQLite 主文件而遗漏已提交的 WAL 数据:
docker stop tgateway
mkdir -p backups
docker run --rm \
--mount type=volume,source=tgateway-project,target=/data,readonly \
--mount type=bind,source="$(pwd)/backups",target=/backup \
--entrypoint sh my-tgateway:current \
-c 'tar -C /data -czf /backup/gateway-project-before-update.tar.gz .'确认备份文件存在且可解压后,删除旧容器,用上面的运行命令复用原卷,并将镜像改为 my-tgateway:next。已有卷不会自动接收新镜像中的初始配置;按发布说明核对需要调整的配置,保留现场数据库、身份与用户资源。
更新后检查版本、工程、已知变量、转发及历史查询。需要恢复数据时,先停止新容器并保留当前卷副本,再按备份恢复完整工程;原镜像与原卷备份应成对保存。
常见问题
| 现象 | 检查与恢复 |
|---|---|
| 容器不断重启 | 先看 docker logs,核对架构、执行权限和工程配置 |
| Web 可访问但设备超时 | 检查容器到设备的实际路由;不要把宿主机误写成容器的 localhost |
| 重建后点位或身份丢失 | 检查是否复用了正确卷,以及 ProjectDirectory 和外部绝对路径 |
| 无法创建日志或数据库 | 检查卷权限和容器运行账号 |
| 更换镜像后仍是旧版本 | 检查启动镜像标签,以及是否把旧程序挂载到了 /app |