3、单机部署回顾:使用Docker Compose快速搭建单机版ThingsBoard
好,咱们进入第三章。在正式搞集群之前,我强烈建议你先把手里的单机版玩透。为什么?因为集群本质上就是多个单机节点的组合,单机踩过的坑,到了集群里会被放大十倍。我自己带团队时,新人来了第一件事就是——先给我用Docker Compose搭一套单机版,跑通了再聊别的。
3.1 为什么选Docker Compose?
你可能会问:直接装个Java包不就行了?嗯,理论上可以。但实际项目中,我见过太多因为环境不一致导致的诡异问题。比如某次客户现场,明明按照文档一步步装,结果数据库连不上,查了半天发现是PostgreSQL版本对不上。
Docker Compose的好处很明显:
- 环境一致性:你本地能跑,服务器上就能跑,不存在「我机器上好好的啊」这种尴尬
- 依赖一键搞定:PostgreSQL、Redis、Zookeeper……这些组件不用你一个个装
- 快速重置:搞坏了?
docker-compose down -v然后重新来,一分钟的事
我的习惯:每个项目我都会保留一份docker-compose.yml模板。新环境部署时,改几个参数就能用,省心。
3.2 准备工作:你需要什么?
说白了,就三样东西:
- 一台Linux机器(或者Mac/WSL也行,但我建议用Linux,生产环境99%是Linux)
- Docker 和 Docker Compose 已安装
- 网络通畅(需要拉取镜像,国内用户记得配镜像加速)
我记得有一次在客户内网部署,没网,只能手动导镜像包,那叫一个痛苦。所以有条件的话,提前把镜像拉好存到本地仓库。
3.3 实战:一步步搭起来
好,咱们开始动手。我会用ThingsBoard 3.6.2版本做演示,你跟着敲就行。
3.3.1 创建项目目录
mkdir -p ~/tb-single && cd ~/tb-single
我个人习惯把每个服务的配置都放在独立目录下,方便管理。
3.3.2 编写docker-compose.yml
这是核心文件。我直接给你一个生产可用的版本:
version: '3.8'
services:
postgres:
image: postgres:15
environment:
POSTGRES_DB: thingsboard
POSTGRES_USER: tbuser
POSTGRES_PASSWORD: tbpass123
volumes:
- ./data/postgres:/var/lib/postgresql/data
restart: always
redis:
image: redis:7-alpine
command: redis-server --requirepass redispass
volumes:
- ./data/redis:/data
restart: always
tb-node:
image: thingsboard/tb-node:3.6.2
depends_on:
- postgres
- redis
environment:
TB_DATABASE_TYPE: postgres
TB_DATABASE_HOST: postgres
TB_DATABASE_PORT: 5432
TB_DATABASE_NAME: thingsboard
TB_DATABASE_USER: tbuser
TB_DATABASE_PASSWORD: tbpass123
TB_REDIS_HOST: redis
TB_REDIS_PORT: 6379
TB_REDIS_PASSWORD: redispass
TB_QUEUE_TYPE: in-memory
ports:
- "8080:8080"
- "1883:1883"
- "5683:5683/udp"
volumes:
- ./data/tb-node:/data
restart: always
注意:这里我用了
TB_QUEUE_TYPE: in-memory,单机测试没问题。但生产环境千万别这么干!消息丢了就找不回来了。集群部署时我们会换成Kafka或RabbitMQ。
3.3.3 启动服务
docker-compose up -d
第一次启动会拉镜像,大概等3-5分钟。你可以用 docker-compose logs -f tb-node 看日志。当看到类似这样的输出时,就说明启动成功了:
2024-01-15 10:23:45.123 INFO 1 --- [main] o.t.s.ThingsboardServerApplication : Started ThingsboardServerApplication in 45.789 seconds
3.3.4 验证部署
打开浏览器,访问 http://你的IP:8080。默认账号密码:
| 角色 | 用户名 | 密码 |
|---|---|---|
| 系统管理员 | sysadmin@thingsboard.org | sysadmin |
| 租户管理员 | tenant@thingsboard.org | tenant |
能登录进去,就说明单机版跑起来了。简单吧?
3.4 避坑指南
这部分是我用血泪换来的经验,你记一下:
- 端口冲突:8080端口经常被占用。我建议先
netstat -tlnp | grep 8080检查一下。如果被占用了,把映射端口改成8081:8080就行。 - 数据持久化:上面配置里我把数据挂载到了
./data/目录。如果不挂载,容器删了数据就全没了。我曾经手滑docker-compose down -v把测试数据全清了……嗯,从那以后我每次都会检查挂载路径。 - 内存不足:ThingsBoard默认JVM堆内存是1GB。如果你的机器只有2GB内存,建议限制一下:在
environment里加TB_JAVA_OPTS: "-Xmx512m -Xms512m"。
核心要点:单机部署是集群的基础。你在这里学会的每一个配置项,到了集群里都会以更复杂的形式出现。所以别急着跳过去,多跑几遍,把每个参数的含义搞清楚。
3.5 下一步做什么?
单机版跑通之后,我建议你做两件事:
- 创建几个设备,模拟一些数据上传,熟悉一下ThingsBoard的基本操作
- 试试看停掉PostgreSQL再重启,观察ThingsBoard的恢复行为。这能帮你理解高可用为什么重要
下一章,我们就要开始聊集群架构了。你会看到单机版里的每个组件,在集群里是如何被拆解、扩展的。准备好了吗?