thingsboard/summary/17-Docker镜像分类分析.md

299 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ThingsBoard Docker 镜像分类分析
## 1. 概述
本文档分析 `docker/` 目录下所有 Docker Compose 配置文件中使用的镜像,区分哪些是 ThingsBoard 自身构建的镜像,哪些是第三方镜像。
## 2. 镜像识别方法
### 2.1 ThingsBoard 自身镜像的特征
ThingsBoard 自身构建的镜像都使用**环境变量**的形式定义:
```yaml
image: "${DOCKER_REPO}/${XXX_DOCKER_NAME}:${TB_VERSION}"
```
其中:
- `DOCKER_REPO`: 默认值为 `thingsboard`(定义在 `msa/pom.xml`
- `TB_VERSION`: ThingsBoard 版本号(如 `4.2.1`
- `XXX_DOCKER_NAME`: 具体服务的镜像名称变量
### 2.2 第三方镜像的特征
第三方镜像直接使用**固定的镜像名称**,如:
- `postgres:16`
- `zookeeper:3.8.1`
- `cassandra:5.0`
## 3. ThingsBoard 自身镜像列表
### 3.1 核心服务镜像
| 服务名称 | 镜像变量 | 实际镜像名称 | 用途 | 配置文件位置 |
|---------|---------|------------|------|------------|
| **tb-core1/tb-core2** | `${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}` | `thingsboard/tb-node` | 核心服务设备管理、用户管理、API | `docker-compose.yml` |
| **tb-rule-engine1/tb-rule-engine2** | `${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}` | `thingsboard/tb-node` | 规则引擎服务 | `docker-compose.yml` |
**说明**
- `tb-core``tb-rule-engine` 使用**同一个镜像** `thingsboard/tb-node`
- 通过环境变量 `TB_SERVICE_TYPE` 区分服务类型:
- `TB_SERVICE_TYPE=tb-core` → 核心服务
- `TB_SERVICE_TYPE=tb-rule-engine` → 规则引擎服务
### 3.2 传输服务镜像
| 服务名称 | 镜像变量 | 实际镜像名称 | 用途 | 配置文件位置 |
|---------|---------|------------|------|------------|
| **tb-mqtt-transport1/2** | `${DOCKER_REPO}/${MQTT_TRANSPORT_DOCKER_NAME}` | `thingsboard/tb-mqtt-transport` | MQTT 传输服务 | `docker-compose.yml` |
| **tb-http-transport1/2** | `${DOCKER_REPO}/${HTTP_TRANSPORT_DOCKER_NAME}` | `thingsboard/tb-http-transport` | HTTP 传输服务 | `docker-compose.yml` |
| **tb-coap-transport** | `${DOCKER_REPO}/${COAP_TRANSPORT_DOCKER_NAME}` | `thingsboard/tb-coap-transport` | CoAP 传输服务 | `docker-compose.yml` |
| **tb-lwm2m-transport** | `${DOCKER_REPO}/${LWM2M_TRANSPORT_DOCKER_NAME}` | `thingsboard/tb-lwm2m-transport` | LWM2M 传输服务 | `docker-compose.yml` |
| **tb-snmp-transport** | `${DOCKER_REPO}/${SNMP_TRANSPORT_DOCKER_NAME}` | `thingsboard/tb-snmp-transport` | SNMP 传输服务 | `docker-compose.yml` |
### 3.3 前端服务镜像
| 服务名称 | 镜像变量 | 实际镜像名称 | 用途 | 配置文件位置 |
|---------|---------|------------|------|------------|
| **tb-web-ui1/2** | `${DOCKER_REPO}/${WEB_UI_DOCKER_NAME}` | `thingsboard/tb-web-ui` | Web UI 前端服务 | `docker-compose.yml` |
### 3.4 辅助服务镜像
| 服务名称 | 镜像变量 | 实际镜像名称 | 用途 | 配置文件位置 |
|---------|---------|------------|------|------------|
| **tb-js-executor** | `${DOCKER_REPO}/${JS_EXECUTOR_DOCKER_NAME}` | `thingsboard/tb-js-executor` | JavaScript 执行器10个副本 | `docker-compose.yml` |
| **tb-vc-executor1/2** | `${DOCKER_REPO}/${TB_VC_EXECUTOR_DOCKER_NAME}` | `thingsboard/tb-vc-executor` | 版本控制执行器 | `docker-compose.yml` |
| **tb-edqs1/2** | `${DOCKER_REPO}/${EDQS_DOCKER_NAME}` | `thingsboard/tb-edqs` | 事件驱动查询服务 | `docker-compose.edqs.yml` |
### 3.5 ThingsBoard 维护的第三方工具镜像
| 服务名称 | 镜像名称 | 用途 | 说明 | 配置文件位置 |
|---------|---------|------|------|------------|
| **haproxy** | `thingsboard/haproxy-certbot:2.2.33-alpine` | 负载均衡器 + SSL 证书管理 | ThingsBoard 维护的 HAProxy 镜像,集成 Certbot | `docker-compose.yml` |
**说明**
- 虽然这个镜像在 `thingsboard/` 命名空间下,但它不是 ThingsBoard 应用服务本身
- 它是 ThingsBoard 团队维护的 HAProxy 镜像,添加了 Certbot 支持
## 4. 第三方镜像列表
### 4.1 数据库镜像
| 服务名称 | 镜像名称 | 版本 | 用途 | 配置文件位置 |
|---------|---------|------|------|------------|
| **postgres** | `postgres:16` | 16 | PostgreSQL 数据库(实体数据) | `docker-compose.postgres.yml`, `docker-compose.hybrid.yml` |
| **cassandra** | `cassandra:5.0` | 5.0 | Apache Cassandra时序数据 | `docker-compose.hybrid.yml` |
### 4.2 消息队列镜像
| 服务名称 | 镜像名称 | 版本 | 用途 | 配置文件位置 |
|---------|---------|------|------|------------|
| **kafka** | `bitnamilegacy/kafka:4.0` | 4.0 | Apache Kafka 消息队列 | `docker-compose.kafka.yml` |
**说明**
- 使用 Bitnami 的 Kafka 镜像legacy 版本)
- 使用 KRaft 模式,不需要 ZooKeeper
### 4.3 缓存镜像
| 服务名称 | 镜像名称 | 版本 | 用途 | 配置文件位置 |
|---------|---------|------|------|------------|
| **valkey** | `bitnamilegacy/valkey:8.0` | 8.0 | Valkey 单节点缓存 | `docker-compose.valkey.yml` |
| **valkey-sentinel** | `bitnamilegacy/valkey-sentinel:8.0` | 8.0 | Valkey 哨兵模式缓存 | `docker-compose.valkey-sentinel.yml` |
| **valkey-cluster** | `bitnamilegacy/valkey-cluster:8.0` | 8.0 | Valkey 集群模式缓存 | `docker-compose.valkey-cluster.yml` |
**说明**
- Valkey 是 Redis 的分支项目
- 使用 Bitnami 的 Valkey 镜像
### 4.4 服务发现镜像
| 服务名称 | 镜像名称 | 版本 | 用途 | 配置文件位置 |
|---------|---------|------|------|------------|
| **zookeeper** | `zookeeper:3.8.1` | 3.8.1 | Apache ZooKeeper 服务发现 | `docker-compose.yml` |
**说明**
- 虽然 Kafka 使用 KRaft 模式不需要 ZooKeeper但 ThingsBoard 微服务架构仍需要 ZooKeeper 进行服务发现
### 4.5 监控镜像
| 服务名称 | 镜像名称 | 版本 | 用途 | 配置文件位置 |
|---------|---------|------|------|------------|
| **prometheus** | `prom/prometheus:v3.1.0` | v3.1.0 | Prometheus 监控系统 | `docker-compose.prometheus-grafana.yml` |
| **grafana** | `grafana/grafana` | latest | Grafana 可视化平台 | `docker-compose.prometheus-grafana.yml` |
**说明**
- 监控服务是可选的,通过 `MONITORING_ENABLED=true` 启用
## 5. 镜像分类统计
### 5.1 ThingsBoard 自身镜像统计
| 类别 | 数量 | 镜像列表 |
|-----|------|---------|
| **核心服务** | 1 | `thingsboard/tb-node` |
| **传输服务** | 5 | `tb-mqtt-transport`, `tb-http-transport`, `tb-coap-transport`, `tb-lwm2m-transport`, `tb-snmp-transport` |
| **前端服务** | 1 | `thingsboard/tb-web-ui` |
| **辅助服务** | 3 | `tb-js-executor`, `tb-vc-executor`, `tb-edqs` |
| **工具镜像** | 1 | `thingsboard/haproxy-certbot` |
| **总计** | **11** | - |
### 5.2 第三方镜像统计
| 类别 | 数量 | 镜像列表 |
|-----|------|---------|
| **数据库** | 2 | `postgres`, `cassandra` |
| **消息队列** | 1 | `bitnamilegacy/kafka` |
| **缓存** | 3 | `bitnamilegacy/valkey`, `bitnamilegacy/valkey-sentinel`, `bitnamilegacy/valkey-cluster` |
| **服务发现** | 1 | `zookeeper` |
| **监控** | 2 | `prom/prometheus`, `grafana/grafana` |
| **总计** | **9** | - |
## 6. 镜像构建位置
### 6.1 ThingsBoard 自身镜像的构建位置
| 镜像名称 | 源码位置 | Docker 构建位置 | 说明 |
|---------|---------|---------------|------|
| `thingsboard/tb-node` | `application/` | `msa/tb-node/` | 核心服务和规则引擎 |
| `thingsboard/tb-mqtt-transport` | `transport/mqtt/` | `msa/transport/mqtt/` | MQTT 传输服务 |
| `thingsboard/tb-http-transport` | `transport/http/` | `msa/transport/http/` | HTTP 传输服务 |
| `thingsboard/tb-coap-transport` | `transport/coap/` | `msa/transport/coap/` | CoAP 传输服务 |
| `thingsboard/tb-lwm2m-transport` | `transport/lwm2m/` | `msa/transport/lwm2m/` | LWM2M 传输服务 |
| `thingsboard/tb-snmp-transport` | `transport/snmp/` | `msa/transport/snmp/` | SNMP 传输服务 |
| `thingsboard/tb-web-ui` | `ui-ngx/` | `msa/web-ui/` | Web UI 前端 |
| `thingsboard/tb-js-executor` | `msa/js-executor/src/` | `msa/js-executor/` | JavaScript 执行器 |
| `thingsboard/tb-vc-executor` | `msa/vc-executor/` | `msa/vc-executor/` | 版本控制执行器 |
| `thingsboard/tb-edqs` | `edqs/` | `msa/edqs/` | 事件驱动查询服务 |
### 6.2 构建方式
所有 ThingsBoard 镜像都通过 Maven 构建:
```bash
# 构建所有镜像
mvn clean install -DskipTests -Ddockerfile.skip=false
# 构建特定镜像
mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/tb-node
```
## 7. 镜像使用模式
### 7.1 镜像命名规律
ThingsBoard 自身镜像遵循以下命名规律:
```
thingsboard/{service-name}:{version}
```
例如:
- `thingsboard/tb-node:4.2.1`
- `thingsboard/tb-mqtt-transport:4.2.1`
- `thingsboard/tb-web-ui:4.2.1`
### 7.2 环境变量映射
`.env` 文件中(需要用户创建),可以设置:
```bash
DOCKER_REPO=thingsboard
TB_VERSION=4.2.1
TB_NODE_DOCKER_NAME=tb-node
JS_EXECUTOR_DOCKER_NAME=tb-js-executor
MQTT_TRANSPORT_DOCKER_NAME=tb-mqtt-transport
HTTP_TRANSPORT_DOCKER_NAME=tb-http-transport
COAP_TRANSPORT_DOCKER_NAME=tb-coap-transport
LWM2M_TRANSPORT_DOCKER_NAME=tb-lwm2m-transport
SNMP_TRANSPORT_DOCKER_NAME=tb-snmp-transport
WEB_UI_DOCKER_NAME=tb-web-ui
TB_VC_EXECUTOR_DOCKER_NAME=tb-vc-executor
EDQS_DOCKER_NAME=tb-edqs
```
## 8. 镜像来源
### 8.1 ThingsBoard 官方镜像
所有 ThingsBoard 自身镜像都发布在 **Docker Hub**
- **组织**: https://hub.docker.com/u/thingsboard
- **镜像列表**:
- https://hub.docker.com/r/thingsboard/tb-node
- https://hub.docker.com/r/thingsboard/tb-mqtt-transport
- https://hub.docker.com/r/thingsboard/tb-http-transport
- https://hub.docker.com/r/thingsboard/tb-coap-transport
- https://hub.docker.com/r/thingsboard/tb-lwm2m-transport
- https://hub.docker.com/r/thingsboard/tb-snmp-transport
- https://hub.docker.com/r/thingsboard/tb-web-ui
- https://hub.docker.com/r/thingsboard/tb-js-executor
- https://hub.docker.com/r/thingsboard/tb-vc-executor
- https://hub.docker.com/r/thingsboard/tb-edqs
### 8.2 第三方镜像来源
| 镜像 | 来源 | 说明 |
|-----|------|------|
| `postgres:16` | Docker Hub Official | PostgreSQL 官方镜像 |
| `cassandra:5.0` | Docker Hub Official | Apache Cassandra 官方镜像 |
| `zookeeper:3.8.1` | Docker Hub Official | Apache ZooKeeper 官方镜像 |
| `bitnamilegacy/kafka:4.0` | Bitnami | Bitnami 维护的 Kafka 镜像 |
| `bitnamilegacy/valkey:8.0` | Bitnami | Bitnami 维护的 Valkey 镜像 |
| `prom/prometheus:v3.1.0` | Prometheus | Prometheus 官方镜像 |
| `grafana/grafana` | Grafana | Grafana 官方镜像 |
## 9. 镜像版本管理
### 9.1 ThingsBoard 镜像版本
- **版本标签**: 使用 `TB_VERSION` 环境变量(如 `4.2.1`
- **最新标签**: 构建时会同时创建 `latest` 标签
- **版本同步**: 所有 ThingsBoard 镜像使用相同的版本号
### 9.2 第三方镜像版本
第三方镜像版本固定,不随 ThingsBoard 版本变化:
- PostgreSQL: `16`
- Cassandra: `5.0`
- ZooKeeper: `3.8.1`
- Kafka: `4.0`
- Valkey: `8.0`
- Prometheus: `v3.1.0`
- Grafana: `latest`
## 10. 总结
### 10.1 ThingsBoard 自身镜像11个
1. **核心服务**: `thingsboard/tb-node`(用于 core 和 rule-engine
2. **传输服务**: 5个MQTT、HTTP、CoAP、LWM2M、SNMP
3. **前端服务**: `thingsboard/tb-web-ui`
4. **辅助服务**: 3个JS Executor、VC Executor、EDQS
5. **工具镜像**: `thingsboard/haproxy-certbot`
### 10.2 第三方镜像9个
1. **数据库**: PostgreSQL、Cassandra
2. **消息队列**: Kafka
3. **缓存**: Valkey3种模式
4. **服务发现**: ZooKeeper
5. **监控**: Prometheus、Grafana
### 10.3 关键发现
1. **镜像复用**: `tb-core``tb-rule-engine` 使用同一个镜像 `tb-node`,通过环境变量区分
2. **版本统一**: 所有 ThingsBoard 镜像使用相同的版本号
3. **构建位置**: 所有 ThingsBoard 镜像的构建配置都在 `msa/` 目录下
4. **第三方依赖**: 使用成熟的第三方镜像,减少维护成本
### 10.4 镜像使用建议
1. **生产环境**: 使用固定版本标签,不要使用 `latest`
2. **开发环境**: 可以从 Docker Hub 拉取官方镜像,也可以从源码构建
3. **自定义**: 如果需要修改 ThingsBoard 代码,需要从源码构建镜像
4. **镜像源**: 可以配置私有镜像仓库来加速拉取或提供定制镜像
通过这个分析,可以清楚地了解 ThingsBoard Docker 部署中哪些是自身构建的镜像,哪些是依赖的第三方镜像。