将一个Node.js网页应用容器化

未匹配的标注

在一起学Docker11:镜像构建的最佳实践一文中,有提到过,Node.js官网其实发表过一篇文章,是关于如何将一个 Node.js 网页应用容器化的。矻矻来福一直都比较偏爱官方的教程,一方面是因为比较权威,另一方面是因为一个活跃组织的文档一定是经过很多人雕琢的,所以官方教程其实是一个很好的学习途径。我本身写前端比较多,对于 node.js 一直都很感兴趣,但是一直都没有深入学习的机会。借这个机会,希望以0基础的状态,和大家一起学习文档,互相交流。

教程的目标是将一个Node.js应用移植进Docker容器当中。主要是以开发为目的,和生产环境部署无关。教程需要你正常安装了 Docker,对 Node.js 应用的结构有一个基本了解。

Docker能够让你把应用,连同应用的环境变量,以及所有的依赖,都打包进盒子,这个盒子叫作容器。通常,一个容器由一个运行在简单到不能再简单的Linux操作系统中的应用构成。镜像是容器的蓝图,容器是一个镜像的实例。差不多可以联想到:类和实例的关系。

创建 Node.js 应用

首先,创建一个新路径,所有文件都放在这个路径当中。路径当中,创建一个 package.json 文件,这个文件描述了你的应用,以及应用的依赖:

有了新建的 package.json 文件之后,运行 npm install 。如果你使用 npm 5 或更新版本的话,这个操作会创建 package-lock.json 文件,之后这个文件也会被拷贝进你的 Docker 镜像。

接着,创建一个 server.js 文件,这个文件使用 Express.js 框架定义了一个网页应用:

后续步骤中,我们会看看如何在Docker容器中,使用官方Docker镜像运行应用。首先,需要构建应用的Docker镜像。

创建一个Dockerfile

在Dockerfile中,首先需要定义基于哪个镜像进行构建。我们会使用最新版的LTS版本node 14,镜像在 Docker Hub就有:

接着,创建一个路径,这个路径负责在镜像中存放应用代码,这也会是应用的工作路径:

镜像自带 Node.js 和 npm ,所以我们下一步是使用 npm 命令安装应用依赖。注意,如果使用 npm 4 或更老版本,package-lock.json 文件是不会被创建的。

注意,不要拷贝整个工作路径,而是仅仅拷贝 package.json 文件。这样可以让我们利用 Docker缓存分层。另外,在注释中的 npm ci 命令可以提供更快,更可靠,可重复的生产环境构建。查看npm的官方文档可以了解更多。

要把应用源代码打包放进 Docker 镜像,可以使用 COPY 指令:

应用绑定了 8080 端口,所以要用 EXPOSE 指令让 docker 守护进程将其映射

最后,使用 CMD 指令运行你的应用,它定义了你的运行时环境。我们使用 node server.js 来启动你的服务器:

Dockerfile 文件全貌

.dockerignore 文件

在 Dockerfile 文件所在文件夹,创建 .dockerignore 文件,内容如下:

这个文件能够防止本地模块和debug日志被拷贝进Docker镜像,导致覆盖镜像内部所安装的模块。

构建镜像

进入 Dockerfile 所在路径,运行以下命令构建 Docker 镜像。-t 旗标用来给镜像打标签,之后使用 docker images 命令就可以轻松找到镜像了。

Docker现在就会列出你的镜像了:

运行镜像

使用 -d 以分离模式运行容器,继而运行你的镜像,可以让容器在后台运行。-p 旗标将公共端口重定向到了容器内部的私有端口。

docker run -p 49160:8080 -d krave/node-web-app

打印应用的输出:

如果你需要进入容器,可以使用 exec 命令:

docker exec -it <容器 id> /bin/bash

测试

要测试你的应用,首先要获取 Docker 给你的应用所映射的端口:

例子中,Docker 把容器内部的 8080 端口映射到了主机的 49160 端口。

你现在可以使用 curl 来调用你的应用

curl localhost:49160

你也可以通过网页浏览器如图访问本地地址:

希望这篇教程有帮到你怎么样在 Docker 上启动并运行一个简单的 Node.js 应用。

如果觉得这篇文章对你有帮助的话,欢迎长按点赞并关注。

我们下期不见不散。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
秦晓武
讨论数量: 0
发起讨论 只看当前版本


暂无话题~