node.js + docker用于在使用docker的node.js中显示出良好的默认值
这试图成为开始在Docker中使用Node.js的“良好默认”示例,并以基本的铃铛,哨子和最佳实践运输到生产中。问题/PR欢迎。
请注意,我有更高级的node.js dockerfiles示例,并在我的Dockercon 2022 Talk and Repostority中撰写文件。我在8小时视频课程Docker for Node.js中也有更多关于Docker和node.js的信息。
另请注意,我在Docker和Kubernetes上还有其他资源。
本地发展功能
- DEV尽可能接近产品。 Docker构建了一个本地开发图像,就像生产图像一样,除了图像中所需的以下功能。目的是让开发环境尽可能接近测试和产品,同时仍然提供所有不错的工具,使您成为快乐的开发人员。
- 防止在主机上需要节点/npm 。这将在容器映像中安装node_modules外部的node_modules,因此本地开发不会遇到与本地源代码上绑定安装的问题。这意味着它将在容器构建上运行NPM安装后,您无需在主机上或每个Docker运行上运行NPM。如果您更改软件包。
- 一行启动。使用Docker构成本地开发服务器的单线构建和运行。
- 代码在容器中运行时本地编辑。 Docker撰写使用主机源代码的适当绑定安装到容器中,因此您可以在Linux容器中运行代码时在本地编辑。
- 在容器中使用Nodemon 。当您在主机上更改文件时,Docker Compose使用Nodemon用于开发容器中的node.js。
- 启用从主机到容器的调试。打开检查端口9229,用于使用基于主机的调试(例如Chrome Tools或VS代码)。 nodemon启用 – 默认情况下,docker组成。
- 提供测试的VSCODE调试配置和任务。对于Visual Studio Code粉丝,VSCODE Directory具有@jplemelin。
- 小图像和快速重建。复制package.json并运行npm安装,然后在源代码中复制。这节省了构建时间,并保持容器图像精益。
- 绑定软件包。这允许实时添加软件包而无需重建图像。例如Docker Compose Exec -W /opt /node_app节点NPM安装-Save <软件包名称>
以生产为意为生产的功能
- 使用Docker内置的Healthchecks 。这使用dockerfile HealthCheck使用 /Healthz路线,以帮助Docker知道您的容器是否正常运行(例如,始终返回200个,但您可以理解这个想法)。
- 适当的node_env使用。默认为node_env = dockerfile中的生产,并覆盖docker-compose的开发本地开发。
- 不要在生产图像中添加DEV依赖项。正确的Node_env使用意味着默认情况下不会在图像中安装DEV依赖项。默认情况下,使用Docker Compose将与它们一起构建。
- 启用适当的SIGTERM/SIGINT以获得优雅的出口。默认为node index.js,而不是NPM,用于允许优雅的节点关闭。 NPM无法正确传递Sigterm/Sigint(在前景中运行Docker时,您无法CTRL-C)。要使节点索引。JS到优雅的退出,需要额外的信号捕获代码。 Dockerfile和Index.js记录了已知问题的选项和链接。
- 在容器中以节点用户而不是root运行node.js。
- 使用Docker-stack.yml示例进行Docker群的部署。
假设
- 您已经安装了Docker和Docker Compose(Mac/Windows/Linux的Docker桌面)。
- 您想将Docker用于本地开发(即不需要在主机上安装node.js/npm),并且具有DEV和POD DOCKER映像尽可能近。
- 您不想在开发人员工作流程中失去忠诚。您需要使用本地编辑器,Node.js调试/Inspect,本地代码存储库进行简单的环境设置,而Node.js Server则在容器中运行。
- 您仅将Docker-Compose用于本地开发(无论如何,Docker-Compose从未打算成为生产部署工具)。
- Docker-compose.yml不适合Docker STACK部署在Docker Swarm中,而是为了愉快的地方发展。使用Docker-stack.yml进行群。
入门
如果这是您的node.js应用程序,请开始本地开发,您将:
- 您需要运行的Docker组成。它将:
- 构建自定义本地图像启用开发(Nodemon,node_env =开发)。
- 从该图像启动端口80和9229打开的容器(在Localhost上)。
- 从nodemon开始,以重新启动node.js on主机pwd中的文件更改。
- 将PWD安装到App DIR中。
- 如果您需要其他服务(例如数据库),只需添加以撰写文件,然后将其添加到此应用程序上的自定义Docker网络中。
- 撰写不会自动重建,因此要么在更改软件包后运行Docker组成构建。
- 完成后,请确保使用Docker撰写进行清理。
如果您想在Docker-Compose运行您的应用程序时添加一个包:
- Docker Compose exec -w /opt /node_app节点npm npm安装-Save <Package name>
- 这将其安装在运行的容器中。
- Nodemon将检测到更改并重新启动。
- – 保存将其添加到包装中。
要执行单位测试,您将:
- 执行Docker撰写Exec Node NPM测试,它将:
- 在容器中运行进程NPM测试。
- 您可以使用config docker Test(附件9230)使用VSCODE来调试单位测试,它将:
- 在容器中启动调试过程,并在debuggger中启动,这是通过VSCODE任务完成的
- 如果存在,它还将杀死先前的调试过程。
改善安全性的方法
将Node.js运行为非root用户
如官方Docker Node.js图像文档中所述,Docker将图像作为root运行。这可能会构成潜在的安全问题。
作为安全性最佳实践,建议Node.js应用程序在此处提到的非私有端口上收听。
其他资源
- https://blog.h***asura.io/an-exhustive-guide-to-writing-dockerfiles-for-node-js-js-web-apps-bbee6bd2f3c4
