将docker的node-red容器连同安装的节点保存为docker镜像
一、基础准备
- 在服务器1上安装docker,参考链接(实战总结):【docker使用安装教程】
- 通过docker下载node-red镜像,启动node-red容器,参考链接(实战总结):【docker部署多个node-red操作过程】
我这边启动的docker容器为:
- 通过node-red容器安装常用的节点
这里我工作中常用的节点如下:
(1)数据库相关:
- mysql操作: node-red-contrib-stackhero-mysql@1.0.5
- redis操作: node-red-contrib-redis@1.3.9
- SqlServer操作:node-red-contrib-mssql@0.0.7
(2)数采相关:
- node-red-contrib-modbus@5.30.0
- node-red-contrib-opcua@0.2.323
- node-red-contrib-s7@3.1.0
- node-red-node-serialport@2.0.2
- @meowwolf/node-red-contrib-amqp@2.4.1
(3)其他:
- 定时器:node-red-contrib-cron-plus@2.1.0
- ftp文件远程:node-red-contrib-ftp-sftp@1.8.8
- 数组循环:node-red-contrib-loop-processing@0.5.1
- 时钟转换:node-red-contrib-moment@5.0.0
- 数据转换:node-red-contrib-buffer-parse
二、构建容器镜像, 将docker容器保存为 tar 包
构建容器镜像有两种方法,通过docker commit或Dockerfile构建镜像,这里我们使用的是docker commit 构建镜像。步骤如下:
- 确保容器是运行状态,执行命令:
# 查看docker容器,展示的STATUS为容器状态
docker ps -a
# 如果容器状态为Exited关闭,则需要启动容器
docker start 容器名称
# 或者通过容器ID启动
docker start 容器ID
其他命令,如下:
# 关闭容器
docker stop 容器ID或容器名称
# 删除容器 - 删除前必须先关闭容器
docker rm 容器ID或容器名称
- 要想将node-red容器包含安装的节点一起保存,需要将节点的安装包目录复制到容器内部的2个目录:
- /usr/local/lib/node_modules/:全局安装Node.js模块。当使用npm(Node.js的包管理器)以全局模式安装模块时,这些模块会被放置在这个目录下。
- **/usr/src/node-red/node_modules/:**Node-RED项目的本地node_modules目录,会存储Node-RED项目所需要的所有Node.js模块。这些模块是项目依赖的一部分,而不是全局安装的。
(1) 先找到该容器安装节点的安装包目录,选择一个节点名称全局搜索:find / -name 节点名称
(2)找到对应的目录后,将node_modules目录下的所有内容复制到容器内部的/usr/local/lib/node_modules/和/usr/src/node-red/node_modules/目录,命令如下:
docker cp 节点安装目录/. 容器ID:复制的目标目录
# 示例
docker cp /home/node_red/node_modules/. 3eb052b27233:/usr/local/lib/node_modules/
docker cp /home/node_red/node_modules/. 3eb052b27233:/usr/src/node-red/node_modules/
- 通过docker commit 命令,将一个运行中的容器保存为镜像,详细如下:
docker commit 容器id 自定义镜像名称:镜像版本
# 示例
docker commit 3eb052b27233 mynodered:1.2
-
查看镜像是否保存成功,执行命令:
docker images
-
通过镜像创建容器,看镜像是否正确,执行命令:
docker run -u root:node-red -v /home/dataStore:/usr/src/node-red/data --privileged=true -p 端口号:1880 --name 容器名 -d 镜像名称:镜像版本
# 示例
docker run -u root:node-red -v /home/dataStore:/usr/src/node-red/data --privileged=true -p 1882:1880 --name nodered2 -d mynodered:1.2 --restart=always
成功运行后,进入页面看是否包含指定节点:
6. 打包镜像文件,执行命令:
docker save -o /存放目录/自定义镜像文件名称.tar 镜像名称:镜像版本
# 示例
docker save -o /home/mynodered1.2.tar mynodered:1.2
打包成功后,在对应的目录下能看到tar文件。
三、从 tar 包导入docker镜像
- 将上面打好的tar包传输到需要运行这个镜像的服务器2上面
- 从 tar 包导入镜像,执行命令:
docker load -i <tar包名>.tar
# 示例
docker load -i mynodered1.2.tar
3. 查看镜像是否成功导入,执行命令:docker images
4. 通过镜像启动容器,执行命令:
docker run -u root:node-red -v /home/dataStore:/usr/src/node-red/data --privileged=true -p 端口号:1880 --name 容器名 -d 镜像名称:镜像版本
# 示例
docker run -u root:node-red -v /home/dataStore:/usr/src/node-red/data --privileged=true -p 1882:1880 --name nodered2 -d mynodered:1.2 --restart=always
成功运行后,进入页面看是否包含指定节点: