本地 jar 如何制作成镜像并启动
正文与配图来自原稿。示例版本为 3.4.2、基础镜像 openjdk11;你若是 4.3.x,流程相同,请把 jar 名、JDK 大版本按自己工程调整(见文末补充)。
上一篇:本地修改代码后如何打成可执行 JAR
1、概述
之前在群里看到很多兄弟们再问修改了 ThingsBoard 的代码,我如何打包——上一节已经讲了,而且测试过了。然后又有兄弟伙问如何打成镜像。对于我们 Java 开发人员来说,只要有了 jar 包,那么打镜像就是非常简单的了。这是最简单的一种方式,也是单节点部署。下面具体讲一下如何操作。
2、实现方式
2.1、直接启动 jar 方式
2.1.1、介绍
上一节讲了如何打包。因为在你本地程序的 thingsboard.yml 中修改了自己的数据库地址,并且打成的 jar 是 Spring Boot 可执行 jar,可以拖到服务器上直接使用:
java -jar thingsboard-3.4.2-boot.jar或者后台启动:
nohup java -jar thingsboard-3.4.2-boot.jar &注意必坑:
我使用上面命令执行虽然可以启动,但是在打开 ThingsBoard 的系统层进行租户创建的时候会报错:
Not valid working directory: " + workDir + ". Please use either root project directory, application module directory or specify valid "install.data_dir" ENV variable to avoid automatic data directory lookup!这个错是因为创建租户的时候会去加载默认的规则链配置,如下图:

默认在 thingsboard/application/src/main 下面有一个 data 目录,这个 data 目录就存了一些 json 文件定义默认规则链的配置。上图中 dataDir 就是加载指定的目录,所以需要在 thingsboard.yml 增加配置:
install:
# 需要你将 data 数据目录拷贝到服务器指定位置。
# Windows 环境目录:D:\yuxinwei\AE\thingsboard\application\src\main\data
#data_dir: D:\yuxinwei\AE\thingsboard\application\src\main\data
# Linux 环境目录:/root/thingsboard/data
data_dir: /root/thingsboard/data
# docker 容器内的目录:/usr/share/thingsboard/data
#data_dir: /usr/share/thingsboard/data
loadDemo: true这里是使用 jar 直接运行,就是上面第二个配置:在你服务器上新建一个目录,例如创建 /root/thingsboard,然后将 thingsboard/application/src/main 下面的 data 目录全部拷贝到 /root/thingsboard/ 目录下。上面配置文件指定的也是 /root/thingsboard/data 目录,目的就是加载里面的文件。

2.1.2、启动
前提是这个机器上需要安装 JDK 11 并且配置好环境变量:

java -jar thingsboard-3.4.2-boot.jar后台启动:
nohup java -jar thingsboard-3.4.2-boot.jar &2.1.3、验证

创建租户:

进入租户层:

2.2、使用 Dockerfile 打镜像
2.2.1、修改配置
修改 thingsboard.yml 的配置,使用 docker 容器内的目录:
install:
# 需要你将 data 数据目录拷贝到服务器指定位置。
# Windows 环境目录:D:\yuxinwei\AE\thingsboard\application\src\main\data
#data_dir: D:\yuxinwei\AE\thingsboard\application\src\main\data
# Linux 环境目录:/root/thingsboard/data
#data_dir: /root/thingsboard/data
# docker 容器内的目录:/usr/share/thingsboard/data
data_dir: /usr/share/thingsboard/data
loadDemo: true2.2.2、本地打包
然后在本地进行 mvn install,将程序打成可执行的 jar(上一节讲了)。

2.2.3、编写 Dockerfile
FROM thingsboard/openjdk11:bullseye-slim
MAINTAINER AldrichEugene
ADD data/ /usr/share/thingsboard/data
ADD thingsboard-3.4.2-boot.jar /usr/share/thingsboard/bin/thingsboard.jar
EXPOSE 8080
EXPOSE 1883
EXPOSE 5683/udp
EXPOSE 5685/udp
ENTRYPOINT ["java","-jar","/usr/share/thingsboard/bin/thingsboard.jar"]2.2.4、在服务器上构建镜像
前提是在服务器上安装了 docker 和 docker-compose 环境(前面章节有介绍如何安装)。
上传 jar 和 Dockerfile 文件,只需要这两个文件(以及构建上下文里的 data/ 目录,与 Dockerfile 中 ADD data/ 对应):

进入到对应的目录下,最好是在有 Dockerfile 的那个目录,默认就会寻找 Dockerfile 文件来构建镜像:

docker build -t thingsboard:v1 .2.2.5、启动
方便看日志,就没有使用后台启动:
docker run --name thingsboard-v1 -p 8080:8080 thingsboard:v1或者:
docker run -d --name thingsboard-v1 -p 8080:8080 -p 1883:1883 thingsboard:v1
2.2.6、验证
进入登录界面:

进入系统层:

进入租户层:

一切都是这么的顺利进行~~~
2.3、如何使用源码来构建镜像
2.3.1、开启服务器的 Docker 远程服务
要实现本地代码打包,需要有 Docker 环境。其实 IDEA 很强大,本地可以配置远程的 Docker 环境,例如你公司服务器上面的 Docker 环境,又或者你自己虚拟机的 Docker 环境,都是可以的。但是前提是需要你开启 Docker 的远程访问,下面就教大家如何开启。
首先登录到服务器上:

编辑:
vi /usr/lib/systemd/system/docker.service找到 [Service] 节点,修改 ExecStart 属性,增加 -H tcp://0.0.0.0:2375:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
重新加载 Docker 配置生效:
systemctl daemon-reload
systemctl restart docker2.3.2、IDEA 自动构建镜像配置
IDEA 需要安装 Docker 插件:

假设有一个 Dockerfile 文件,注意看文件是不是有一个可以启动的按钮:

点击那个绿色的按钮,进行配置:

这里配置的就是你的服务 IP 加上 Docker 默认外网端口 2375:


就是配置打镜像需要的一些参数,然后就可以打镜像了。
2.3.3、本地打镜像
2.3.3.1、修改 thingsboard.yml
切记 thingsboard.yml 里面的数据库配置一定要记得改成生产环境的数据地址。
install:
# 需要你将 data 数据目录拷贝到服务器指定位置。
# Windows 环境目录:D:\aaa\AE\thingsboard\application\src\main\data
#data_dir: D:\aaa\AE\thingsboard\application\src\main\data
# Linux 环境目录:/root/thingsboard/data
#data_dir: /root/thingsboard/data
# docker 容器内的目录:/usr/share/thingsboard/data
data_dir: /usr/share/thingsboard/data
loadDemo: true2.3.3.2、编写 Dockerfile
在 thingsboard 目录下创建 Dockerfile 文件:

编写 Dockerfile:
#
# Copyright © 2016-2022 The Thingsboard Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
FROM thingsboard/openjdk11:bullseye-slim
MAINTAINER AldrichEugene
ADD application/target/thingsboard-3.4.2-boot.jar /usr/share/thingsboard/bin/thingsboard.jar
ADD application/src/main/data /usr/share/thingsboard/data
EXPOSE 8080
EXPOSE 1883
EXPOSE 5683/udp
EXPOSE 5685/udp
ENTRYPOINT ["java","-jar","/usr/share/thingsboard/bin/thingsboard.jar"]2.3.3.3、构建镜像

2.3.3.4、启动
构建成功之后会在你的服务器上自动启动,你可以把自动启动的容器删除,然后再使用自己的命令重新启动即可:
docker run -d --name thingsboard -p 8080:8080 -p 1883:1883 thingsboard:v12.3.3.5、验证
首页访问:

新增一个租户:

添加租户:

默认规则链都是有的:

添加设备:

连接成功:

发送数据:

成功接收数据:

补充(辅)
- 4.3.x:jar 名多为
thingsboard-4.3.1.8-boot.jar;编译/运行常用 JDK 17+,Dockerfile 基础镜像请换成对应 OpenJDK(不要再死用 openjdk11)。 install.data_dir:jar / 镜像部署时务必指向真实存在的data目录,否则创建租户等操作会踩原稿里的「必坑」。- Docker 远程
0.0.0.0:2375:无 TLS 时等于把 Docker 暴露公网,仅建议内网/实验;生产请用 SSH、TLS 或受限网段。 - 官方现成镜像 / Compose 部署见:Ubuntu系统部署 ThingsBoard 4.3.x。
