博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js 指南(Docker化Node.js Web应用程序)
阅读量:6331 次
发布时间:2019-06-22

本文共 3798 字,大约阅读时间需要 12 分钟。

Docker化Node.js Web应用程序

此示例的目的是向你展示如何将Node.js应用程序放入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 
", "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');// Constantsconst PORT = 8080;const HOST = '0.0.0.0';// Appconst 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(长期支持)版本8 node

FROM node:8

接下来,我们创建一个目录来保存镜像中的应用程序代码,这将是你的应用程序的工作目录:

# Create app directoryWORKDIR /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 sourceCOPY . .

你的应用程序绑定到端口8080,因此你将使用EXPOSE指令让docker守护程序映射它:

EXPOSE 8080

最后但并非最不重要的是,使用定义你运行时的CMD定义运行你应用程序的命令,这里我们将使用基本的npm start来运行node server.js来启动你的服务器:

CMD [ "npm", "start" ]

你的Dockerfile现在应该如下所示:

FROM node:8# Create app directoryWORKDIR /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 sourceCOPY . .EXPOSE 8080CMD [ "npm", "start" ]

.dockerignore文件

在与Dockerfile相同的目录中创建一个.dockerignore文件,其中包含以下内容:

node_modulesnpm-debug.log

这样可以防止将本地模块和调试日志复制到Docker镜像上,并可能覆盖镜像中安装的模块。

构建你的镜像

转到具有Dockerfile的目录,然后运行以下命令来构建Docker镜像,使用-t标志可以标记镜像,以便以后使用docker images命令更容易找到:

$ docker build -t 
/node-web-app .

你的镜像现在将由Docker列出:

$ docker images# ExampleREPOSITORY                      TAG        ID              CREATEDnode                            8          1934b0b038d1    5 days ago
/node-web-app latest d64d3505b0d2 1 minute ago

运行镜像

使用-d运行镜像以分离模式运行容器,使容器在后台运行,-p标志将公共端口重定向到容器内的私有端口,运行你之前构建的镜像:

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

打印应用程序的输出:

# Get container ID$ docker ps# Print app output$ docker logs 
# ExampleRunning on http://localhost:8080

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

# Enter the container$ docker exec -it 
/bin/bash

测试

要测试你的应用程序,请获取Docker映射的应用端口:

$ docker ps# ExampleID            IMAGE                                COMMAND    ...   PORTSecce33b30ebf  
/node-web-app:latest npm start ... 49160->8080

在上面的示例中,Docker将容器内部的8080端口映射到计算机上的端口49160

现在,你可以使用curl调用你的应用程序(如果需要,请通过以下方式安装:sudo apt-get install curl):

$ curl -i localhost:49160HTTP/1.1 200 OKX-Powered-By: ExpressContent-Type: text/html; charset=utf-8Content-Length: 12ETag: W/"c-M6tWOb/Y57lesdjQuHeB1P/qTV0"Date: Mon, 13 Nov 2017 20:53:59 GMTConnection: keep-aliveHello world

我们希望本教程可以帮助你在Docker上启动并运行一个简单的Node.js应用程序。

你可以在以下位置找到有关Docker和Node.js的更多信息:


转载地址:http://uyboa.baihongyu.com/

你可能感兴趣的文章
【算法】论平衡二叉树(AVL)的正确种植方法
查看>>
基于DDD的现代ASP.NET开发框架--ABP系列之1、ABP总体介绍
查看>>
【原】东拼西凑PBR(1):PBR基础
查看>>
react 从零开始搭建开发环境
查看>>
scala recursive value x$5 needs type
查看>>
ps -ef |grep 输出的具体含义
查看>>
markdown编辑
查看>>
ASCII 在线转换器
查看>>
Linux内核同步:RCU
查看>>
Android逆向进阶——让你自由自在脱壳的热身运动(dex篇)
查看>>
Java设计模式之五大创建型模式(附实例和详解)
查看>>
60 Permutation Sequence
查看>>
主流的RPC框架有哪些
查看>>
Hive学习之路 (七)Hive的DDL操作
查看>>
[转]mysql使用关键字作为列名的处理方式
查看>>
awesome go library 库,推荐使用的golang库
查看>>
树形展示形式的论坛
查看>>
jdbcTemplate 调用存储过程。 入参 array 返回 cursor
查看>>
C++中的stack类、QT中的QStack类
查看>>
Linux常用基本命令[cp]
查看>>