Skip to content

本地 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,可以拖到服务器上直接使用:

bash
java -jar thingsboard-3.4.2-boot.jar

或者后台启动:

bash
nohup java -jar thingsboard-3.4.2-boot.jar &

注意必坑:

我使用上面命令执行虽然可以启动,但是在打开 ThingsBoard 的系统层进行租户创建的时候会报错:

text
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!

这个错是因为创建租户的时候会去加载默认的规则链配置,如下图:

创建租户时加载默认规则链与 data 目录

默认在 thingsboard/application/src/main 下面有一个 data 目录,这个 data 目录就存了一些 json 文件定义默认规则链的配置。上图中 dataDir 就是加载指定的目录,所以需要在 thingsboard.yml 增加配置:

yaml
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 目录,目的就是加载里面的文件。

服务器上放置 data 目录

2.1.2、启动 ​

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

服务器 JDK 环境

bash
java -jar thingsboard-3.4.2-boot.jar

后台启动:

bash
nohup java -jar thingsboard-3.4.2-boot.jar &

2.1.3、验证 ​

jar 方式启动后访问验证

创建租户:

创建租户

进入租户层:

进入租户层


2.2、使用 Dockerfile 打镜像 ​

2.2.1、修改配置 ​

修改 thingsboard.yml 的配置,使用 docker 容器内的目录:

yaml
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

2.2.2、本地打包 ​

然后在本地进行 mvn install,将程序打成可执行的 jar(上一节讲了)。

本地 mvn install 打出 boot jar

2.2.3、编写 Dockerfile ​

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/ 对应):

上传 jar 与 Dockerfile

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

在 Dockerfile 目录构建镜像

bash
docker build -t thingsboard:v1 .

2.2.5、启动 ​

方便看日志,就没有使用后台启动:

bash
docker run --name thingsboard-v1 -p 8080:8080 thingsboard:v1

或者:

bash
docker run -d --name thingsboard-v1 -p 8080:8080 -p 1883:1883 thingsboard:v1

docker run 启动容器

2.2.6、验证 ​

进入登录界面:

登录界面

进入系统层:

系统层

进入租户层:

租户层

一切都是这么的顺利进行~~~


2.3、如何使用源码来构建镜像 ​

2.3.1、开启服务器的 Docker 远程服务 ​

要实现本地代码打包,需要有 Docker 环境。其实 IDEA 很强大,本地可以配置远程的 Docker 环境,例如你公司服务器上面的 Docker 环境,又或者你自己虚拟机的 Docker 环境,都是可以的。但是前提是需要你开启 Docker 的远程访问,下面就教大家如何开启。

首先登录到服务器上:

登录服务器

编辑:

bash
vi /usr/lib/systemd/system/docker.service

找到 [Service] 节点,修改 ExecStart 属性,增加 -H tcp://0.0.0.0:2375:

text
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375

修改 docker.service 开启远程

重新加载 Docker 配置生效:

bash
systemctl daemon-reload
systemctl restart docker

2.3.2、IDEA 自动构建镜像配置 ​

IDEA 需要安装 Docker 插件:

安装 Docker 插件

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

Dockerfile 旁的运行按钮

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

配置远程 Docker 连接

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

填写 Engine API URL

远程 Docker 连接成功

就是配置打镜像需要的一些参数,然后就可以打镜像了。

2.3.3、本地打镜像 ​

2.3.3.1、修改 thingsboard.yml ​

切记 thingsboard.yml 里面的数据库配置一定要记得改成生产环境的数据地址。

yaml
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: true
2.3.3.2、编写 Dockerfile ​

在 thingsboard 目录下创建 Dockerfile 文件:

在源码根目录创建 Dockerfile

编写 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、构建镜像 ​

IDEA 远程构建镜像

2.3.3.4、启动 ​

构建成功之后会在你的服务器上自动启动,你可以把自动启动的容器删除,然后再使用自己的命令重新启动即可:

bash
docker run -d --name thingsboard -p 8080:8080 -p 1883:1883 thingsboard:v1
2.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。

相关文章 ​