4、使用Docker一键部署ThingsBoard:拉取镜像、编写docker-compose.yml、启动服务、验证部署状态
说实话,部署ThingsBoard这件事,我踩过的坑比你们想象的多。早期版本我手动装过依赖、配过数据库、调过Java参数,那叫一个折腾。后来Docker成熟了,我才真正体会到什么叫「一键部署」。今天咱们就聊聊怎么用Docker Compose把ThingsBoard跑起来。
4.1 准备工作:先看看你的环境
动手之前,先确认几件事。我个人习惯在Ubuntu 20.04或22.04上操作,CentOS也行,但命令稍微不同。你需要:
- 一台Linux服务器(虚拟机也行,我建议至少2核4G内存)
- Docker Engine 20.10+ 和 Docker Compose v2+
- 开放必要的端口:8080(Web UI)、1883(MQTT)、5683(CoAP)
4.2 拉取镜像:别急着跑,先看看版本
ThingsBoard官方维护了两个主要版本:社区版(TB)和专业版(PE)。咱们课程用的是社区版,功能完全够用。拉取镜像很简单:
docker pull thingsboard/tb:latest
嗯,这里要注意。我建议别直接用latest标签,万一哪天官方更新了不兼容的版本呢?我个人习惯指定具体版本号:
docker pull thingsboard/tb:3.6.1
为什么选3.6.1?因为我在项目中测试过这个版本,稳定性和功能都OK。你可以去Docker Hub看看最新稳定版,挑一个经过验证的。
4.3 编写docker-compose.yml:这才是核心
拉完镜像,接下来就是写编排文件。我直接给你一个我常用的模板,你复制过去改改就能用:
version: '3.8'
services:
mytb:
image: thingsboard/tb:3.6.1
container_name: thingsboard
restart: always
ports:
- "8080:8080"
- "1883:1883"
- "5683:5683/udp"
environment:
TB_QUEUE_TYPE: in-memory
TB_DATABASE_TS_TYPE: sql
volumes:
- ./tb-data:/data
- ./tb-logs:/var/log/thingsboard
networks:
- tb-net
networks:
tb-net:
driver: bridge
这个文件里我做了几件事:
- 端口映射:把容器的8080、1883、5683映射到宿主机,这样外部设备才能连上来
- 环境变量:
TB_QUEUE_TYPE: in-memory表示用内存队列,适合小规模测试;TB_DATABASE_TS_TYPE: sql表示时序数据存SQLite,省事 - 数据持久化:挂载了
tb-data和tb-logs目录,这样容器重启数据不会丢
4.4 启动服务:见证奇迹的时刻
文件写好了,启动就一行命令:
docker compose up -d
加上-d参数,后台运行。第一次启动会有点慢,因为ThingsBoard要初始化数据库、创建表结构。我建议你盯着日志看:
docker compose logs -f
看到类似这样的输出,说明启动成功了:
mytb | 2024-01-15 10:23:45.123 INFO [main] o.t.s.ThingsboardServerApplication: Started ThingsBoard Server in 45.678 seconds
嗯,这里有个坑。我曾经等了两分钟还没看到这个日志,以为是卡住了。后来发现是内存不够,容器一直在重启。你可以用docker ps看看容器状态:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 thingsboard/tb:3.6.1 "/usr/bin/run-thingsb…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp, 0.0.0.0:1883->1883/tcp, 0.0.0.0:5683->5683/udp thingsboard
如果STATUS显示Up,那就没问题。如果显示Restarting,八成是内存不够或者端口被占用了。
4.5 验证部署状态:别急着高兴,先测一下
服务跑起来了,怎么确认它真的能用?我一般做三步验证:
- Web UI访问:浏览器打开
http://你的服务器IP:8080,看到登录页面就说明Web服务正常 - 默认账号登录:用户名
tenant@thingsboard.org,密码tenant。能登录进去,说明数据库和认证系统都OK - MQTT端口测试:用MQTT客户端连一下1883端口,比如用
mosquitto_sub:
mosquitto_sub -h 你的服务器IP -p 1883 -t "v1/devices/me/telemetry" -u "你的设备令牌"
如果没报错,说明MQTT端口也通了。
telnet 你的IP 8080先测一下,省得后面抓狂。
4.6 避坑指南:我踩过的那些雷
最后分享几个我实际项目中遇到的坑:
- 端口冲突:如果宿主机上已经跑了Nginx或其他服务占用了8080端口,记得改映射,比如
"9090:8080" - 时区问题:ThingsBoard默认用UTC时间,你可以在环境变量里加
TZ: Asia/Shanghai,否则设备上报的时间会差8小时 - 日志太多:默认日志级别是INFO,跑几天就能吃掉几个G磁盘。我建议在
docker-compose.yml里加个日志限制:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
这样每个日志文件最大10MB,保留3个,磁盘压力小很多。
好了,到这里你的ThingsBoard应该已经跑起来了。下一章咱们聊聊怎么把ESP32设备接进来,那才是真正好玩的部分。