使用 msa 构建镜像并上传到 Harbor
正文与配图来自原稿。示例对应较早版本(如 3.4.x);你若是 4.3.x,msa 模块与「改
docker.repo/dockerfile.skip→ install 出镜像」的方法相同,镜像名与版本号按自己仓库调整。
相关:本地 jar 如何制作成镜像并启动 · 本地打好的镜像上传到 Harbor 仓库
1、概述
今天讲解如何使用 ThingsBoard 源码中的 msa 模块来构建镜像。首先说一下这个模块的作用:很多人都不明白 msa 是如何构建镜像的。msa 下面创建了很多模块,每个模块都是一个应用,就像我们平时微服务一样可以独自启动。ThingsBoard 是使用这些模块去其它模块拉取代码过来进行构建的。除了 black-box-tests 模块外,其它的模块都编写了对应的 Dockerfile 文件和启动脚本。说直白一点,就是分模块了,单独来构建镜像,每个模块需要的代码就是去其它模块拷贝过来的。
2、对比
现在将这个模块和官方需要的镜像进行对比,大家就会清晰明了。

官方部署文档中使用 k8s 部署的时候需要使用的镜像有:
docker pull thingsboard/tb-node:3.4.3
docker pull thingsboard/tb-web-ui:3.4.3
docker pull thingsboard/tb-js-executor:3.4.3
docker pull thingsboard/tb-http-transport:3.4.3
docker pull thingsboard/tb-mqtt-transport:3.4.3
docker pull thingsboard/tb-coap-transport:3.4.3
docker pull thingsboard/tb-lwm2m-transport:3.4.3
docker pull thingsboard/tb-snmp-transport:3.4.3
官方 k8s 部署 ThingsBoard 一共使用了 8 个镜像,这 8 个镜像就是通过 msa 包下面的模块打出来的镜像,如下图,希望大家能够看明白:

3、开启 Docker 远程访问
3.1、服务器进行配置
首先登录到服务器上:

编辑 /usr/lib/systemd/system/docker.service:
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 docker3.2、Windows 本地配置环境变量
因为你需要使用远程的 Docker 环境进行构建镜像。有很多人下载 Windows 的 Docker 环境,那个太大了,磁盘占用太多,可以直接借用远程服务器上的 Docker 环境来操作(上一节中也提到了)。你只需要在 Windows 环境变量中配置 Docker 的地址,Maven 在进行构建的时候会去扫描 DOCKER_HOST 变量。
具体配置:


示例:
变量名:DOCKER_HOST
变量值:tcp://你的服务器IP:2375配置后重新打开 IDEA / 命令行,使环境变量生效。
4、打镜像
现在就可以在 ThingsBoard 源码中进行打镜像了。
4.1、修改 msa 父工程下面 pom 的文件
<!--修改到自己的 Harbor 镜像仓库的项目名称-->
<docker.repo>thingsboard</docker.repo>
<dockerfile.skip>false</dockerfile.skip>
docker.repo:名字是你仓库规定的名字,其实可以随便取(通常对应 Harbor 项目名 / 仓库命名空间)。dockerfile.skip:是否跳过 Dockerfile。默认是true,因为你在执行 install 的时候,其实只进行了打包,不会进行构建镜像;当你需要构建镜像的时候,就需要改成false,这样就可以生成镜像。
4.2、执行 mvn install 打镜像
点击项目下面的 install 开始打镜像:

命令行等价写法(在源码根目录或按你工程习惯执行):
mvn clean install -DskipTests(需已把 dockerfile.skip 设为 false,且本机 DOCKER_HOST 指向远程 Docker。)
4.3、如何验证是否开始生成镜像
因为你使用的是远程服务器的 Docker 环境,所以在你的服务器上执行 docker images 就可以看到在生成的镜像内容:

4.4、在服务器推镜像到 Harbor 仓库
镜像全部打成功之后,就在服务器上将镜像使用命令推到 Harbor 仓库。
【其实我觉得应该可以配置直接就将镜像推到 Harbor 仓库更好,应该有这种方式,后续再看看如何配置。】
推送步骤与上一篇一致,示意:
docker login 你的Harbor地址:端口
docker tag 本地镜像名:标签 Harbor地址:端口/项目名/镜像名:版本
docker push Harbor地址:端口/项目名/镜像名:版本详细 Harbor 安装、insecure-registries、建项目与 push 见:本地打好的镜像上传到 Harbor 仓库。
补充(辅)
- msa 与单体 boot jar:上一篇「一个
*-boot.jar打一个镜像」适合单节点;本文 msa 对应官方 K8s / 微服务 那套多镜像(node、web-ui、js-executor、各 transport 等)。 - 4.3.x:msa 下还可能有
edqs、vc-executor、monitoring等,以你当前分支目录为准;官方 pull 列表里的版本号换成 4.3.x 即可。 DOCKER_HOST=tcp://0.0.0.0:2375无 TLS:仅建议内网实验;生产请用 SSH / TLS 并限制来源。- 打完镜像后记得按 Harbor 篇完成 login → tag → push。
