Node.js 指南(Docker化Node.js Web应用程序)

45次阅读

共计 3487 个字符,预计需要花费 9 分钟才能阅读完成。

Docker 化 Node.js Web 应用程序
此示例的目的是向你展示如何将 Node.js 应用程序放入 Docker 容器中,该指南旨在用于开发,而不用于生产部署,本指南还假设你有一个有效的 Docker 安装,并且基本了解 Node.js 应用程序的结构。
在本指南的第一部分中,我们将在 Node.js 中创建一个简单的 Web 应用程序,然后我们将为该应用程序构建一个 Docker 镜像,最后我们将该镜像作为容器运行。
Docker 允许你将具有所有依赖关系的应用程序打包到一个称为容器的标准化单元中,用于软件开发,容器是 Linux 操作系统分离出的基础版本,镜像是你加载到容器中的软件。
创建 Node.js 应用程序
首先,创建一个所有文件都将存在于其中的新目录,在此目录中,创建一个描述你的应用及其依赖项的 package.json 文件:
{
“name”: “docker_web_app”,
“version”: “1.0.0”,
“description”: “Node.js on Docker”,
“author”: “First Last <first.last@example.com>”,
“main”: “server.js”,
“scripts”: {
“start”: “node server.js”
},
“dependencies”: {
“express”: “^4.16.1”
}
}
使用新的 package.json 文件,运行 npm install,如果你使用的是 npm 版本 5 或更高版本,则会生成一个 package-lock.json 文件,该文件将被复制到你的 Docker 镜像中。
然后,创建一个使用 Express.js 框架定义 Web 应用程序的 server.js 文件:
‘use strict’;

const express = require(‘express’);

// Constants
const PORT = 8080;
const HOST = ‘0.0.0.0’;

// App
const app = express();
app.get(‘/’, (req, res) => {
res.send(‘Hello world\n’);
});

app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);
在接下来的步骤中,我们将了解如何使用官方 Docker 镜像在 Docker 容器中运行此应用程序,首先,你需要构建应用程序的 Docker 镜像。
创建 Dockerfile
创建一个名为 Dockerfile 的空文件:
touch Dockerfile
在你喜欢的文本编辑器中打开 Dockerfile。
我们需要做的第一件事是定义我们想要构建的镜像,在这里,我们将使用 Docker Hub 提供的最新 LTS(长期支持)版本 8 node:
FROM node:8
接下来,我们创建一个目录来保存镜像中的应用程序代码,这将是你的应用程序的工作目录:
# Create app directory
WORKDIR /usr/src/app
这个镜像已经安装了 Node.js 和 NPM,所以接下来我们需要做的是使用 npm 二进制文件安装你的应用程序依赖项,请注意,如果你使用的是 npm 版本 4 或更早版本,则不会生成 package-lock.json 文件。
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm install –only=production
请注意,我们只复制 package.json 文件,而不是复制整个工作目录,这使我们可以利用缓存的 Docker 层,bitJudo 在这里有一个很好的解释。
要将应用程序的源代码捆绑在 Docker 镜像中,请使用 COPY 指令:
# Bundle app source
COPY . .
你的应用程序绑定到端口 8080,因此你将使用 EXPOSE 指令让 docker 守护程序映射它:
EXPOSE 8080
最后但并非最不重要的是,使用定义你运行时的 CMD 定义运行你应用程序的命令,这里我们将使用基本的 npm start 来运行 node server.js 来启动你的服务器:
CMD [“npm”, “start”]
你的 Dockerfile 现在应该如下所示:
FROM node:8

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm install –only=production

# Bundle app source
COPY . .

EXPOSE 8080
CMD [“npm”, “start”]
.dockerignore 文件
在与 Dockerfile 相同的目录中创建一个.dockerignore 文件,其中包含以下内容:
node_modules
npm-debug.log
这样可以防止将本地模块和调试日志复制到 Docker 镜像上,并可能覆盖镜像中安装的模块。
构建你的镜像
转到具有 Dockerfile 的目录,然后运行以下命令来构建 Docker 镜像,使用 - t 标志可以标记镜像,以便以后使用 docker images 命令更容易找到:
$ docker build -t <your username>/node-web-app .
你的镜像现在将由 Docker 列出:
$ docker images

# Example
REPOSITORY TAG ID CREATED
node 8 1934b0b038d1 5 days ago
<your username>/node-web-app latest d64d3505b0d2 1 minute ago
运行镜像
使用 - d 运行镜像以分离模式运行容器,使容器在后台运行,- p 标志将公共端口重定向到容器内的私有端口,运行你之前构建的镜像:
$ docker run -p 49160:8080 -d <your username>/node-web-app
打印应用程序的输出:
# Get container ID
$ docker ps

# Print app output
$ docker logs <container id>

# Example
Running on http://localhost:8080
如果你需要进入容器内部,你可以使用 exec 命令:
# Enter the container
$ docker exec -it <container id> /bin/bash
测试
要测试你的应用程序,请获取 Docker 映射的应用端口:
$ docker ps

# Example
ID IMAGE COMMAND … PORTS
ecce33b30ebf <your username>/node-web-app:latest npm start … 49160->8080
在上面的示例中,Docker 将容器内部的 8080 端口映射到计算机上的端口 49160。
现在,你可以使用 curl 调用你的应用程序(如果需要,请通过以下方式安装:sudo apt-get install curl):
$ curl -i localhost:49160

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
ETag: W/”c-M6tWOb/Y57lesdjQuHeB1P/qTV0″
Date: Mon, 13 Nov 2017 20:53:59 GMT
Connection: keep-alive

Hello world
我们希望本教程可以帮助你在 Docker 上启动并运行一个简单的 Node.js 应用程序。
你可以在以下位置找到有关 Docker 和 Node.js 的更多信息:

官方 Node.js Docker 镜像
Node.js Docker 最佳实践指南
官方 Docker 文档
Stack Overflow 上的 Docker 标记
Docker Subreddit

上一篇:轻松分析 Node.js 应用程序

正文完
 0