使用 Docker 部署 Node 应用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 Docker 部署 Node 应用相关的知识,希望对你有一定的参考价值。

参考技术A 容器将应用与环境打包整合,解决了应用外部依赖的痛点,打包后通过窗口可方便地部署到任意环境,用过就知道很香。

以 NestJS 为例,先创建一个示例应用。

然后 app.controller.ts 中添加如下 action:

测试一把会得到如下返回,证明我们的 app 一切正常:

先了解 Docker 的两个核心概念:

如果已经安装过,升级可使用如下命令:

然后在程序目录或 Spotlight 中找到并启动 Docker,系统状态栏中会有个鲨鱼图标。

启动后命令行工具已经可用,检查安装:

通过 docker help 查看帮助。

查看具体命令的帮助可在 help 后加上该命令:

Docker 中打包后的应用存在于镜像中,其中便包含了应用及依赖的环境。将这个镜像文件进行分发就可以在其他地方加载运行,实现了在新环境中方便部署,无须再关心外部依赖。

使用 Docker 打包应用需先创建 Dockerfile ,其中包含指导 Docker 如何打包的指令。

一般我们会基于已有镜像来创建自己的镜像,比如这里打包 Node 应用,我们会使用一个已经包含 Node 环境的镜像作为源。通过如下 FROM 语句完成:

创建应用所在的目录:

将文件复制到目标路径,然后进行 npm 包依赖的安装:

复制应用中的源码文件:

依赖和源码都好后,可以编译 Nest 应用,生成 dist 目录了:

可以把镜像看作一个封闭环境,外界要与其中的应用进行交互,比如这里打包的是 Nest 服务,要能正常访问 Nest 中我们编写的 HTTP 接口,就需要 image 向外暴露端口。

因为默认 Nest 应用起的 3000 端口,这里就将其暴露,

最后一条指令,指导 Docker 启动 Nest 应用:

所以完整的 Dockerfile 目前长这样了:

可创建 .dockerignore 文件,将日志,本地无用文件排除在复制的文件列表之外。

通过如下命令根据前面创建的 Dockerfile 生成镜像:

其中 -t 指定镜像名称,一般为 <username>/<image_name> 形式,其中 username 与你在 Docker Hub 中的用户名一致。前面提到镜像可进行分发,当然也能分享,同时我们的 Dockerfile 也是基于名为 node:14 的镜像进行创建的,Docker Hub 则是官方一个分享 image 的平台。

生成镜像过程中如果出现如下错误:

重启一下 Docker 服务即可。

正常的话,可通过如下命令查看到刚刚生成的镜像:

通过如下命令运行镜像:

其中 -p 部分前面为外部环境使用的端口,而 3000 为容器对外 暴露的端口。实际使用时则是使用外部这个 8000。

通过 docker ps 查看运行中的实例。

这里展示下如下 Debug 找出镜像启动失败的原因,即没有生成运行中的容器。

前面启动应用的指令是 CMD [ "node", "dist/main" ] ,而 dist 目录是通过 npm run build 而来,假如我们的 Dockerfile 中没有 build 这个步骤,很明显就没有 dist 目录所以会导致应用启动失败。

启动失败的话, docker ps 输出为空。

此时可加上 -a 参数,它会列出所有容器,包含停止的实例,以查看其状态。

如果看到 STATUS 为 Exited ,原因就是启动失败了。此时需要 Debug 一下看看启动失败的具体原因。

重新启动,并指定名称,方便后面查看日志:

现在查看时可能看一个指定名称为 test 的容器:

然后通过 docker logs 查看其日志:

从日志中就清晰地看到原因了。

修正后成功运行的话,通过 docker ps 看到正常运行的容器了。

调试过程难免会生成很多无用的测试数据,可通过如下命令进行清除。

通过各自对应的 rm 命令来完成。

镜像的删除 :

容器的删除 :

也可通过 docker container prune 将全部容器清除掉。

通过如下命令可在容器中开启一个 shell,在 shell 中可查看其中的文件等。

以上是关于使用 Docker 部署 Node 应用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 docker 高效部署 Node 应用

使用 Docker 部署 Node 应用

使用docker部署node项目(一)

从零开始,使用Docker Swarm部署集群教程

企业运维之 docker 的介绍和部署

如何使用docker部署iis