Docker化Node.js Web应用程序

docker 官网 https://docs.docker.com/get-started/part3/

此示例的目的是向您展示如何将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镜像的文件。

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

'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在您喜欢的文本编辑器中打开

我们需要做的第一件事是定义我们想要构建的图像。在这里,我们将使用最新的LTS(长期支持)版本8node 从可用泊坞枢纽

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 ci --only=production

请注意,我们只复制package.json文件,而不是复制整个工作目录。这允许我们利用缓存的Docker层。bitJudo 在这里有一个很好的解释 。此外,npm ci注释中指定的命令有助于为生产环境提供更快,可靠,可重现的构建。你可以在这里阅读更多相关信息。

要将应用程序的源代码捆绑在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 ci --only=production

# Bundle app source
COPY . .

EXPOSE 8080
CMD [ "npm", "start" ]

.dockerignore文件

.dockerignoreDockerfile 与以下内容相同的目录中创建文件:

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和Dock.js的更多信息:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值