中的一些,并支持多种架构(amd64、arm32v6、arm32v7、arm64v8 和 s390x)。
从 Node-RED 1.0 开始,Docker Hub上的存储库 已重命名为nodered/node-red.
快速开始
要以最简单的形式在 Docker 中运行,只需运行:
docker run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red
让我们剖析一下这个命令:
docker run - run this container, initially building locally if necessary
-it - attach a terminal session so we can see what is going on
-p 1880:1880 - connect local port 1880 to the exposed internal port 1880
-v node_red_data:/data - mount a docker named volume called `node_red_data` to the container /data directory so any changes made to flows are persisted
--name mynodered - give this machine a friendly local name
nodered/node-red - the image to base it on - currently Node-RED v1.2.0
运行该命令应该会给出一个终端窗口,其中包含正在运行的 Node-RED 实例。
Welcome to Node-RED
===================
10 Oct 12:57:10 - [info] Node-RED version: v1.2.0
10 Oct 12:57:10 - [info] Node.js version: v10.22.1
10 Oct 12:57:10 - [info] Linux 4.19.76-linuxkit x64 LE
10 Oct 12:57:11 - [info] Loading palette nodes
10 Oct 12:57:16 - [info] Settings file : /data/settings.js
10 Oct 12:57:16 - [info] Context store : 'default' [module=memory]
10 Oct 12:57:16 - [info] User directory : /data
10 Oct 12:57:16 - [warn] Projects disabled : editorTheme.projects.enabled=false
10 Oct 12:57:16 - [info] Flows file : /data/flows.json
10 Oct 12:57:16 - [info] Creating new flow file
10 Oct 12:57:17 - [warn]
---------------------------------------------------------------------
Your flow credentials file is encrypted using a system-generated key.
If the system-generated key is lost for any reason, your credentials
file will not be recoverable, you will have to delete it and re-enter
your credentials.
You should set your own key using the 'credentialSecret' option in
your settings file. Node-RED will then re-encrypt your credentials
file using your chosen key the next time you deploy a change.
---------------------------------------------------------------------
10 Oct 12:57:17 - [info] Starting flows
10 Oct 12:57:17 - [info] Started flows
10 Oct 12:57:17 - [info] Server now running at http://127.0.0.1:1880/
[...]
然后,您可以浏览以http://{host-ip}:1880获取熟悉的 Node-RED 桌面。
这样做的好处是,通过给它命名(mynodered)我们可以更容易地操作它,并且通过修复我们知道我们熟悉的主机端口。当然,这确实意味着我们一次只能运行一个实例……但是一次只能运行一个步骤。
如果我们对所看到的感到满意,我们可以将终端与Ctrl-p Ctrl-q- 容器将继续在后台运行。
要重新连接到终端(查看日志记录),请运行:
docker attach mynodered
如果您需要重新启动容器(例如在重新启动或重新启动 Docker 守护程序之后):
docker start mynodered
并在需要时再次停止:
docker stop mynodered
图像变化
Node-RED 映像基于官方 Node JS Alpine Linux映像,以使它们尽可能小。使用 Alpine Linux 减少了构建的映像大小,但删除了本机模块编译所需的标准依赖项。如果要添加具有本机依赖项的依赖项,请在运行的容器上使用缺少的包扩展 Node-RED 映像或构建新映像,请参阅docker -custom,它在 Node-RED Docker 项目中的README.md上进行了扩展。
有关详细的图像、标签和清单信息,请参阅Github 项目自述文件。
例如:假设您在具有arm32v7as 架构的 Raspberry PI 3B 上运行。然后只需运行以下命令来拉取镜像(由 标记1.2.0-10-arm32v7),然后运行容器。
docker run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red:latest
相同的命令可用于在 amd64 系统上运行,因为 Docker 发现它在 amd64 主机上运行并拉取带有匹配标签 ( 1.2.0-10-amd64) 的映像。
这样做的好处是您不需要知道/指定您正在运行的架构,并使 docker run 命令和 docker compose 文件更加灵活且可跨系统交换。
注意:目前 Docker 的体系结构检测中存在一个错误,arm32v6例如 Raspberry Pi 零或 1。对于这些设备,您当前需要指定完整的图像标签,例如:
docker run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red:1.2.0-10-arm32v6
管理用户数据
使用 Docker 运行 Node-RED 后,我们需要确保在容器被破坏时不会丢失任何添加的节点或流。可以通过将数据目录挂载到容器外部的卷来保存此用户数据。这可以使用绑定挂载或命名数据卷来完成。
Node-RED 使用/data容器内的目录来存储用户配置数据。
使用主机目录进行持久化(绑定挂载)
要将容器内的 Node-RED 用户目录保存到容器外的主机目录,可以使用以下命令。要允许访问此主机目录,容器内的 node-red 用户(默认 uid=1000)必须与主机目录的所有者具有相同的 uid。
docker run -it -p 1880:1880 -v /home/pi/.node-red:/data --name mynodered nodered/node-red
在此示例中,主机/home/pi/.node-red目录绑定到容器/data目录。
注意:从 0.20 版迁移到 1.0 版的用户需要确保任何现有/data 目录都具有正确的所有权。从 1.0 开始,这需要是1000:1000. 这可以通过命令强制sudo chown -R 1000:1000 path/to/your/node-red/data
有关权限的详细信息,请参阅wiki。
使用命名数据卷
Docker 还支持使用命名数据卷 在容器外存储持久或共享数据。
创建一个新的命名数据卷来保存我们的用户数据并使用该卷运行一个新容器。
$ docker volume create --name node_red_data
$ docker volume ls
DRIVER VOLUME NAME
local node_red_data
$ docker run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red
如果你需要从挂载的卷中备份数据,你可以在容器运行时访问它。
$ docker cpmynodered:/data/your/backup/directory
使用 Node-RED 创建和部署一些示例流程,我们现在可以销毁容器并启动一个新实例,而不会丢失我们的用户数据。
$ docker stop mynodered
$ docker rm mynodered
$ docker run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red
更新
由于 /data 现在保存在容器之外,因此更新基本容器映像现在就像
$ docker pull nodered/node-red
$ docker stop mynodered
$ docker rm mynodered
$ docker run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red
Docker 堆栈/Docker 撰写
下面是一个可以由docker stack或运行的 Docker Compose 文件示例docker-compose。有关Docker 堆栈和Docker compose的更多信息,请参阅官方 Docker 页面。
################################################################################# Node-RED Stack or Compose################################################################################# docker stack deploy node-red --compose-file docker-compose-node-red.yml# docker-compose -f docker-compose-node-red.yml -p myNoderedProject up################################################################################version: "3.7"services:
node-red:
image: nodered/node-red:latest
environment:
- TZ=Europe/Amsterdam
ports:
- "1880:1880"
networks:
- node-red-net
volumes:
- node-red-data:/datavolumes:
node-red-data:networks:
node-red-net:
上面的撰写文件:
创建节点红色服务
拉取最新的节点红色图像
将时区设置为欧洲/阿姆斯特丹
将容器端口 1880 映射到主机端口 1880
创建一个 node-red-net 网络并将容器附加到该网络
/data将容器内的目录持久化到node-red-dataDocker 中的卷
在本地资源中复制的 Dockerfile
使用本地目录中的文件填充 Node-RED Docker 映像有时会很有用(例如,如果您希望将整个项目保存在 git 存储库中)。为此,您需要本地目录如下所示:
Dockerfile
README.md
package.json # add any extra nodes your flow needs into your own package.json.
flows.json # the normal place Node-RED store your flows
flows_cred.json # credentials your flows may need
settings.js # your settings file
注意:如果您想在外部挂载 /data 卷,此方法不适合。如果您需要使用外部卷进行持久性,则将您的设置和流文件复制到该卷。
以下 Dockerfile 在基础 Node-RED Docker 映像上构建,但另外将您自己的文件移动到该映像中:
FROM nodered/node-red
# Copy package.json to the WORKDIR so npm builds all
# of your added nodes modules for Node-RED
COPY package.json .
RUN npm install --unsafe-perm --no-update-notifier --no-fund --only=production
# Copy _your_ Node-RED project files into place
# NOTE: This will only work if you DO NOT later mount /data as an external volume.
# If you need to use an external volume for persistence then
# copy your settings and flows files to that volume instead.
COPY settings.js /data/settings.js
COPY flows_cred.json /data/flows_cred.json
COPY flows.json /data/flows.json
# You should add extra nodes via your package.json file but you can also add them here:
#WORKDIR /usr/src/node-red
#RUN npm install node-red-node-smooth
注意:该package.json文件必须在脚本部分中包含一个启动选项。例如默认容器是这样的:
"scripts": {
"start": "node $NODE_OPTIONS node_modules/node-red/red.js $FLOWS",
...
Dockerfile 顺序和构建速度
虽然没有必要,但最好COPY package... npm install...尽早执行这些步骤,因为尽管flows.json在 Node-RED 中工作时会经常更改,但package.json只有在更改项目中的模块时才会更改。而且由于在更改npm install时需要执行的步骤package.json有时可能很耗时,因此最好在 Dockerfile 中更早地执行耗时的、通常不变的步骤,以便可以重用这些构建映像,从而使后续的整体构建更快。
凭据、机密和环境变量
当然,你永远不想在任何地方硬编码凭证,所以如果你需要在 Node-RED 项目中使用凭证,上面的 Dockerfile 会让你在你的settings.js…
module.exports = {
credentialSecret: process.env.NODE_RED_CREDENTIAL_SECRET // add exactly this
}
…然后当你在 Docker 中运行时,你将一个环境变量添加到你的run命令中…
docker run -e "NODE_RED_CREDENTIAL_SECRET=your_secret_goes_here"
构建和运行
您通常构建此 Dockerfile:
docker build -t your-image-name:your-tag .
要在本地运行以进行开发,其中更改会立即写入并且仅将您正在使用的本地目录cd写入项目目录,然后运行:
docker run --rm -e "NODE_RED_CREDENTIAL_SECRET=your_secret_goes_here" -p 1880:1880 -v `pwd`:/data --name a-container-name your-image-name
启动
可以将环境变量传递到容器中以配置 Node-RED 的运行时。
流配置文件使用环境参数 ( FLOWS ) 设置,默认为'flows.json'。这可以在运行时使用以下命令行标志进行更改。
docker run -it -p 1880:1880 -v node_red_data:/data -e FLOWS=my_flows.json nodered/node-red
注意:如果您设置-e FLOWS="",则可以通过文件中的flowFile 属性设置流settings.js文件。
其他有用的环境变量包括
-e NODE_RED_ENABLE_SAFE_MODE=false# 设置为 true 以安全(非运行)模式启动 Node-RED
-e NODE_RED_ENABLE_PROJECTS=false # 设置为 true 启动 Node-RED 并启用项目功能
Node.js 运行时参数可以使用环境参数 ( NODE_OPTIONS ) 传递给容器。例如,要修复 Node.js 垃圾收集器使用的堆大小,您可以使用以下命令。
docker run -it -p 1880:1880 -v node_red_data:/data -e NODE_OPTIONS="--max_old_space_size=128" nodered/node-red
关键词:工业网关