使用 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 应用的主要内容,如果未能解决你的问题,请参考以下文章