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

Docker化Node.js Web应用程序

此示例的目的是向你展现如何将Node.js应用程序放入Docker容器中,该指南旨在用于开发,而不用于生产部署,本指南还假设你有一个有效的Docker安装,而且基本了解Node.js应用程序的结构。html

在本指南的第一部分中,咱们将在Node.js中建立一个简单的Web应用程序,而后咱们将为该应用程序构建一个Docker镜像,最后咱们将该镜像做为容器运行。node

Docker容许你将具备全部依赖关系的应用程序打包到一个称为容器的标准化单元中,用于软件开发,容器是Linux操做系统分离出的基础版本,镜像是你加载到容器中的软件。git

建立Node.js应用程序

首先,建立一个全部文件都将存在于其中的新目录,在此目录中,建立一个描述你的应用及其依赖项的package.json文件:github

{
  "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镜像中。web

而后,建立一个使用Express.js框架定义Web应用程序的server.js文件:docker

'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镜像。express

建立Dockerfile

建立一个名为Dockerfile的空文件:npm

touch Dockerfile

在你喜欢的文本编辑器中打开Dockerfilejson

咱们须要作的第一件事是定义咱们想要构建的镜像,在这里,咱们将使用Docker Hub提供的最新LTS(长期支持)版本8 nodesegmentfault

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应用程序

下一篇:迁移到安全的Buffer构造函数

相关文章
相关标签/搜索