Node-RED 和 Docker 入门
Docker 容器可用于在 PLCnext 设备上运行 node-RED 服务器。虽然这里描述的另一种方法要快一些。使用 OCI 容器具有一些优势。例如,当为应用程序重复使用相同的包时,构建标准映像并从 Docker 中心下载它会很有用。 Docker也可以用来在我们需要的时候启动和停止node-red服务器。
这个博客将解释这一点。首先,我将指导您完成 Docker 的安装过程,我们将检查安装。我们将构建一个自定义镜像,其中包含我们喜欢的软件包,预装了一个 Dockerfile,并从我们新创建的镜像创建一个容器。最后,我们将确保我们的容器将在控制器启动时启动并将我们的镜像推送到 Dockerhub。
安装 Balena – 引擎
当我说 Docker 容器可用于在 PLCnext 设备上运行 node-RED 运行时时,我有点撒谎。如您所见,我们使用 Balena 引擎作为运行容器的引擎,更具体地说,我们将使用 OCI(Open Container Initiative)容器。通过命名法为我们带来了一个 Makersblog,但在此博客末尾的进一步阅读部分,我为感兴趣的人添加了一些链接。
安装过程相当简单,可以在这里找到完整的参考,但出于实用性的原因,命令也在下一节中给出。
确保您以 root 用户身份登录,要创建新的 root 密码,请在 shell 中键入以下命令并输入您的管理员密码,然后输入两次新的 root 密码。
sudo passwd root
输入 su 后跟新创建的密码,以 root 用户身份登录。
克隆 git 仓库并进入新文件夹
git clone https://github.com/PLCnext/Docker_GettingStarted.git
cd Docker_GettingStarted
使设置脚本可执行并执行所述脚本。
chmod +x setup.sh
./setup.sh
从您的容器中获取互联网访问权限
有时在安装过程中,nft 表设置错误。幸运的是,这是一个简单的修复。
完整的参考指南可以在这里找到,但下面给出了进展的简短描述。
在你的 shell 类型中
ifconfig
弹出网络接口的配置。其中一个叫Balena,记下这个接口的Inet地址。
它应该是这样的:172.17.0.1
在您的 shell 中输入以下命令,并将上一步中收到的 Inet 地址与脚本中的第二行进行比较。
这两个地址应该是一样的,如果是的话可以进入下一节。
如果不是,请在 shell 中转换下一个命令并更改第二行的地址以匹配 ifconfig 收到的地址。
nano /etc/nftables/balena.nft
停止并启动 balena-engine-daemon 以重新加载 nft 表。
/etc/init.d/balena stop
/etc/init.d/balena start
我的第一个容器
要下载你的第一个容器,请使用 next 命令,标志将在稍后解释,现在不用担心它们。现在我们将下载一个没有 costum 包的节点红色容器。如果你不需要定制包,你可以在这里停下来浏览控制器的 1880 端口。
balena-engine run -d -p 1880:1880 --name nodered --restart always nodered/node-red
Docker 中心
上一节中使用的 arm32v7/debian 镜像是从 Docker Hub 下载的。
Docker Hub 本质上是一个收集容器镜像并可以轻松下载的地方。
我可以推荐组织 arm32v7,该组织创建与 AXC F 2152 架构兼容的图像。
node-red 组织创建了一个与 AXC F 2152 兼容的镜像,我们将在下一节中使用这个镜像,但首先我想提一下,如果你会经常使用容器,你应该在 Docker Hub 上创建一个帐户并使用它的存储库。创建免费帐户后,您将获得几乎无限的公共存储库和一个私有存储库。我有一段时间拒绝使用 Docker Hub,但它花费了我很多时间。
在这篇博客的最后一节中,我将通过展示如何登录重新标记图像并将图像推送到 Docker Hub 来稍微平缓使用 Docker Hub 的学习曲线。
Dockerfile
docker 文件在某种意义上是 docker 镜像的秘诀。在这篇博客中,我们将使用 Dockerfile 来创建我们自己的 node-red 镜像,并安装我们需要的包。
Dockerfile 的第一行几乎总是 FROM 命令。使用这个命令,我们定义了一个基础镜像,我们将从这里构建我们自己的镜像。
在 FROM 语句之后,我们开始构建我们的镜像。在 Dockerfile 中可以使用很多可能的命令,但这里我们只使用 RUN。
进一步阅读部分提供了 Dockerfile 参考链接。
RUN 语句将执行我们正在构建的容器内的命令。
所以要安装一个新的包,例如我们声明的 SNMP 包: RUN npm install node-red-node-snmp
理论结束后,让我们构建一个 Dockerfile。希望您仍处于 SSH 会话中(确保您回到 AXC F 2152 而不是两节前的 debian 包含!)。
您可以使用 nano 创建 Dockerfile 并将内容复制粘贴到新文件中。保存(ctrl + s)并退出(ctrl + x).nano Dockerfile
FROM nodered/node-red:latest-minimal
RUN npm install node-red-node-snmp
现在是时候建立我们的新形象了!
balena-engine build . --tag myimage
当您收到图像已成功标记的消息时,您已经构建了您的第一个图像!
要查看您刚刚构建的图像,请使用以下命令:balena-engine images
运行我们的新图像
最后,我们准备好运行我们的镜像并从中创建一个容器!
在 shell 中强制转换以下命令以交互运行容器。
交互式意味着我们可以在终端中看到容器内发生的事情。
对面是分离的,用标志-d标记
balena-engine run -it -p 1880:1880 --name nodered myimage
要退出容器并使其保持运行,请使用 ctrl + p ctrl +q
当您浏览到控制器的 IP 地址和端口 1880 时,节点红色环境显示,我们看到已安装 snmp 包!
在启动时启动映像并在 docker run flags 上入门
每次重启 AXC F 2152 时手动启动容器是不切实际的。幸运的是,我们可以告诉 Docker 为我们启动它,而且很容易!
只需使用下面列出的命令。这也是更好地了解所使用的 docker 标志的时候了。对于初学者来说,标志是我们在命令之后给出的东西,以 - 或 - 开头。
到目前为止,我们只看到了 -it 以交互方式运行容器和 -d 以分离方式运行容器(在后台)。
标志 -p 将容器的端口映射到主机的端口。首先是主机的端口号,然后是容器的端口号。
我们可以使用 –name 标志为容器命名。当您使用 balena-engine ps 列出所有活动容器或使用 balena-engine ps -a 列出所有容器时,将显示此名称。
当没有使用 –name 标志时,balena-daemon 将为容器分配一个随机名称。
最后但并非最不重要的一点是,可以使用 –restart 标志将重启策略分配给容器。
可以在进一步阅读中列出的参考链接中找到可能的设置。
现在——重新启动总是可以解决问题的!我们的命令是:
balena-engine run -it -p 1880:1880 --name nodered --restart always myimage
推送到 Docker 中心
当您不想在不同的控制器上使用您的图像时。将图像上传到 Docker Hub 是个好主意。
假设您已经有一个帐户并创建了一个 docker 存储库,我们将继续。首先,我们需要登录我们的帐户。这可以通过输入 balena-engine login 然后输入您的用户名和密码来完成。现在可以从私有存储库下载图像并将您的图像推送到 Docker 中心。
要将您的图像推送到 Docker 集线器,重要的是要正确命名。当我创建了一个存储库 myrep 并且我的用户帐户是 myaccount 时,图像的名称应该是 myaccount/myrep。
如果在构建镜像时没有这样命名,则必须使用 balena-engine tag oldimagetag newimagetag 重新标记镜像。在我们的例子中,这将是:
balena-engine tag myimage myaccount/myrep
当没有更多定义时,最好获得最新的标签。可以在标签处添加 :和标签名称。例如:
balena-engine tag myimage myaccount/myrep:alabel
唯一剩下的就是使用以下命令将我们的图像推送到 Docker 中心:
balena-engine push myaccount/myrep
进一步阅读和参考
https://github.com/PLCnext/Docker_GettingStarted/blob/master/getting-started/Part-01/README.md
https://www.docker.com/resources/what-container
https://docs.docker.com/engine/reference/builder/
https://hub.docker.com/
https://hub.docker.com/r/nodered/node-red
工业技术