Node-RED作为一款开源的流程编排工具,在物联网和自动化领域有着广泛应用。它基于Node.js构建,采用可视化编程方式,让用户通过拖拽节点来创建数据流。而Docker作为轻量级容器技术,能够将应用及其依赖打包成标准化的运行单元,实现快速部署和环境一致性。
为什么选择Docker部署Node-RED?传统直接安装方式需要手动配置Node.js环境、处理依赖关系,且难以保证多环境一致性。Docker方案则具有以下优势:
在开始前,建议先检查宿主机环境:
bash复制# 查看Docker是否安装
docker --version
# 查看系统资源
free -h
df -h
对于生产环境,建议:
合理的目录结构能提高后期维护效率。建议采用以下结构:
code复制/home/node_red/
├── data/ # 容器挂载主目录
│ ├── flows.json # 主流程文件
│ ├── flows_cred.json # 凭证文件
│ ├── lib/ # 自定义节点目录
│ ├── nodes/ # 额外安装的节点
│ └── settings.js # 配置文件
└── logs/ # 日志目录(需额外挂载)
创建目录时注意权限问题:
bash复制mkdir -p /home/node_red/{data,logs}
chmod -R 777 /home/node_red # 开发环境简化权限设置
生产环境应配置更精细的权限,建议将目录所有者设为特定用户:
bash复制useradd node-red-user chown -R node-red-user:node-red-user /home/node_red
获取最新官方镜像:
bash复制docker pull nodered/node-red:latest
验证镜像完整性:
bash复制docker images --digests | grep nodered/node-red
对于生产环境,建议:
基础运行命令:
bash复制docker run -d \
--restart=always \
--name nodered \
-p 1880:1880 \
-v /home/node_red/data:/data \
nodered/node-red:latest
参数解析:
-d: 后台运行--restart=always: 容器退出时自动重启--name: 指定容器名称-p 1880:1880: 端口映射(宿主机端口:容器端口)-v /home/node_red/data:/data: 数据卷挂载建议添加以下参数:
bash复制docker run -d \
--restart=unless-stopped \
--name nodered-prod \
--cpus 1 \
--memory 512m \
--memory-swap 1g \
-p 1880:1880 \
-p 1881:1881 \
-v /home/node_red/data:/data \
-v /home/node_red/logs:/var/log/node-red \
-e TZ=Asia/Shanghai \
-e NODE_RED_ENABLE_PROJECTS=true \
nodered/node-red:2.2.2-minimal
关键增强点:
Docker挂载分为三种类型:
Node-RED推荐使用绑定挂载,因为:
settings.js 核心配置项:
javascript复制module.exports = {
uiPort: process.env.PORT || 1880,
credentialSecret: process.env.NODE_RED_CREDENTIAL_SECRET,
adminAuth: {
type: "credentials",
users: [{
username: "admin",
password: "$2a$08$..." // bcrypt哈希值
}]
},
logging: {
console: {
level: "info"
}
}
}
安全建议:
开发与生产环境差异化配置:
javascript复制// settings.js
const isProd = process.env.NODE_ENV === 'production'
module.exports = {
editorTheme: {
projects: {
enabled: !isProd // 开发环境启用项目功能
}
},
logging: {
console: {
level: isProd ? 'warn' : 'info'
}
}
}
通过环境变量切换:
bash复制docker run -e NODE_ENV=production ...
查看运行状态:
bash复制docker ps -f name=nodered
查看日志:
bash复制docker logs -f --tail 100 nodered
进入容器:
bash复制docker exec -it nodered /bin/bash
备份数据:
bash复制tar -czvf node-red-backup-$(date +%Y%m%d).tar.gz /home/node_red/data
问题1:端口冲突
解决方案:
bash复制# 查看端口占用
netstat -tulnp | grep 1880
# 修改映射端口
docker run -p 1882:1880 ...
问题2:权限错误
现象:
code复制Error: EACCES: permission denied...
解决:
bash复制chown -R 1000:1000 /home/node_red/data
问题3:节点丢失
处理方法:
bash复制npm install node-red-dashboard
javascript复制// settings.js
module.exports = {
runtimeState: {
enabled: false // 禁用运行时状态统计
},
contextStorage: {
default: "memoryOnly" // 简单场景使用内存存储
}
}
bash复制docker stats nodered
创建docker-compose.yml:
yaml复制version: '3'
services:
node-red:
image: nodered/node-red:2.2.2
container_name: node-red
restart: unless-stopped
ports:
- "1880:1880"
volumes:
- ./data:/data
- ./logs:/var/log/node-red
environment:
- TZ=Asia/Shanghai
- NODE_RED_CREDENTIAL_SECRET=your-secret-key
deploy:
resources:
limits:
cpus: '1'
memory: 512M
启动命令:
bash复制docker-compose up -d
对于高可用场景:
Redis集成配置:
javascript复制// settings.js
contextStorage: {
default: {
module: "redis",
host: "redis-service",
port: 6379
}
}
Dockerfile示例:
dockerfile复制FROM nodered/node-red:2.2.2-minimal
# 安装额外节点
RUN npm install node-red-dashboard node-red-contrib-modbus
# 添加自定义配置
COPY settings.js /data/settings.js
# 设置健康检查
HEALTHCHECK --interval=30s CMD curl -f http://localhost:1880/ || exit 1
构建命令:
bash复制docker build -t my-node-red .
bash复制docker run -p 2880:1880 ...
javascript复制// settings.js
module.exports = {
https: {
key: require("fs").readFileSync('key.pem'),
cert: require("fs").readFileSync('cert.pem')
}
}
bash复制docker run -p 127.0.0.1:1880:1880 ...
基础认证:
javascript复制adminAuth: {
type: "credentials",
users: [
{
username: "admin",
password: "$2b$08$...",
permissions: ["*"]
}
]
}
OAuth集成示例:
javascript复制adminAuth: {
type:"strategy",
strategy: {
name: "azuread",
label: "Sign in with Azure AD",
icon:"fa-windows",
strategy: require("passport-azure-ad").BearerStrategy,
options: {
identityMetadata: "https://login.microsoftonline.com/..."
}
}
}
创建专用网络:
bash复制docker network create node-red-net
运行容器时指定网络:
bash复制docker run --network=node-red-net ...
配合防火墙规则:
bash复制iptables -A DOCKER-USER -i eth0 -p tcp --dport 1880 -j DROP