Skip to content

使用 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、对比 ​

现在将这个模块和官方需要的镜像进行对比,大家就会清晰明了。

msa 模块与官方镜像对照示意

官方部署文档中使用 k8s 部署的时候需要使用的镜像有:

bash
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 所需镜像列表

官方 k8s 部署 ThingsBoard 一共使用了 8 个镜像,这 8 个镜像就是通过 msa 包下面的模块打出来的镜像,如下图,希望大家能够看明白:

msa 各子模块与 8 个官方镜像对应关系

3、开启 Docker 远程访问 ​

3.1、服务器进行配置 ​

首先登录到服务器上:

登录服务器

编辑 /usr/lib/systemd/system/docker.service:

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

3.2、Windows 本地配置环境变量 ​

因为你需要使用远程的 Docker 环境进行构建镜像。有很多人下载 Windows 的 Docker 环境,那个太大了,磁盘占用太多,可以直接借用远程服务器上的 Docker 环境来操作(上一节中也提到了)。你只需要在 Windows 环境变量中配置 Docker 的地址,Maven 在进行构建的时候会去扫描 DOCKER_HOST 变量。

具体配置:

新增 DOCKER_HOST 环境变量

DOCKER_HOST 指向 tcp://服务器IP:2375

示例:

text
变量名:DOCKER_HOST
变量值:tcp://你的服务器IP:2375

配置后重新打开 IDEA / 命令行,使环境变量生效。

4、打镜像 ​

现在就可以在 ThingsBoard 源码中进行打镜像了。

4.1、修改 msa 父工程下面 pom 的文件 ​

xml
<!--修改到自己的 Harbor 镜像仓库的项目名称-->
<docker.repo>thingsboard</docker.repo>
<dockerfile.skip>false</dockerfile.skip>

修改 msa 父 pom 中的 docker.repo 与 dockerfile.skip

  • docker.repo:名字是你仓库规定的名字,其实可以随便取(通常对应 Harbor 项目名 / 仓库命名空间)。
  • dockerfile.skip:是否跳过 Dockerfile。默认是 true,因为你在执行 install 的时候,其实只进行了打包,不会进行构建镜像;当你需要构建镜像的时候,就需要改成 false,这样就可以生成镜像。

4.2、执行 mvn install 打镜像 ​

点击项目下面的 install 开始打镜像:

IDEA 执行 install 构建 msa 镜像

命令行等价写法(在源码根目录或按你工程习惯执行):

bash
mvn clean install -DskipTests

(需已把 dockerfile.skip 设为 false,且本机 DOCKER_HOST 指向远程 Docker。)

4.3、如何验证是否开始生成镜像 ​

因为你使用的是远程服务器的 Docker 环境,所以在你的服务器上执行 docker images 就可以看到在生成的镜像内容:

服务器 docker images 查看已构建镜像

4.4、在服务器推镜像到 Harbor 仓库 ​

镜像全部打成功之后,就在服务器上将镜像使用命令推到 Harbor 仓库。

【其实我觉得应该可以配置直接就将镜像推到 Harbor 仓库更好,应该有这种方式,后续再看看如何配置。】

推送步骤与上一篇一致,示意:

bash
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。

相关文章 ​