文章目录

  • 前言
  • 创建Node.js应用程序
  • 创建一个Dockerfile
  • .dockerignore 文件
  • 构建你的镜像
  • 运行镜像
  • 测试
  • 总结

前言

这个例子的目的是向你展示如何将一个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框架的网络应用:

'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');
});app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

在接下来的步骤中,我们将看看你如何使用官方的Docker镜像在Docker容器内运行这个应用。首先,你需要为你的应用程序建立一个Docker镜像。

创建一个Dockerfile

创建一个名为 Dockerfile 的空文件。

touch Dockerfile

用你喜欢的文本编辑器打开 Dockerfile

我们需要做的第一件事是定义我们要从什么镜像中构建。这里我们将使用Docker Hub提供的最新的LTS(长期支持)版本16的node。

FROM node:16

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

# 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 来定义运行你的应用程序的命令。这里我们将使用 node server.js 来启动你的服务器:

CMD [ "node", "server.js" ]

你的Docker文件现在应该看起来像这样:

FROM node:16# 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 [ "node", "server.js" ]

.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                            16         3b66eb585643    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:49160HTTP/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-aliveHello world

我们希望这个教程能帮助你在Docker上建立并运行一个简单的Node.js应用程序。

你可以在以下地方找到更多关于Docker和Node.js在Docker上的信息:

  • Official Node.js Docker Image
  • Node.js Docker Best Practices Guide
  • Official Docker documentation
  • Docker Tag on Stack Overflow
  • Docker Subreddit

总结

Node 官方给的docker化一个node应用教程。

参考链接:

  • Dockerizing a Node.js web app | Node.js

Docker化Node.js网络应用相关推荐

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

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

  2. 利用Docker设置Node.js

    docker是一个开源的应用容器引擎,可以为我们提供安全.可移植.可重复的自动化部署的方式.docker采用虚拟化的技术来虚拟化出应用程序的运行环境.如上图一样.docker就像一艘轮船.而轮船上面的 ...

  3. 使用Docker部署Node.js中的Vue项目

    1.准备工作 使用服务器:阿里云 服务器系统:CentOS 7 项目配置 准备好一个项目 该项目下有以下文件 对 package.json 文件进行修改 设置项目启动的端口号和使用的ip 注:在修改p ...

  4. 如何在Docker上构建Node.js应用程序

    Docker has been the latest trending topic over the past couple of years and if you haven't been to s ...

  5. Node.js 指南(目录)

    Node.js 指南 Node.js®是基于Chrome的V8 JavaScript引擎构建的JavaScript运行时. 常规 关于Node.js 入门指南 轻松分析Node.js应用程序 Dock ...

  6. electron 打包把node代理服务打包进去_用 Node.js 官方镜像打包一个 express 服务

    最近感觉确实有必要了解一下 Docker,在 CI/CD 这个阶段很有用,所以记录一下. 先放上 Node.js 的官方 Docker 镜像. Docker Hub​hub.docker.com 需要 ...

  7. 实践案例丨教你一键构建部署发布前端和Node.js服务

    如何使用华为云服务一键构建部署发布前端和Node.js服务 构建部署,一直是一个很繁琐的过程 作为开发,最害怕遇到版本发布,特别是前.后端一起上线发布,项目又特别多的时候. 例如你有10个项目,前后端 ...

  8. 使用华为云服务一键构建部署发布前端和Node.js服务

    如何使用华为云服务一键构建部署发布前端和Node.js服务 构建部署,一直是一个很繁琐的过程 作为开发,最害怕遇到版本发布,特别是前.后端一起上线发布,项目又特别多的时候 例如你有10个项目,前后端都 ...

  9. Dockerizing a Node.js web app

    2019独角兽企业重金招聘Python工程师标准>>> Dockerizing a Node.js web app The goal of this example is to sh ...

最新文章

  1. [C#]网络编程系列专题二:HTTP协议详解
  2. Java中取两位小数
  3. MYSQL中LIMIT用法_后台分页
  4. Firewalld防火墙应用
  5. 如果 “ 2X ”的补码是“ 90H ”,那么 X 的真值是( )。
  6. GPU Gems1 - 11 阴影贴图反走样
  7. 消息队列 Kafka 的基本知识及 .NET Core 客户端
  8. 【CodeForces - 514D】R2D2 and Droid Army(二分+滑动窗口ST表,或 尺取+单调队列或STLmultiset)
  9. 【转载保存】基于Lucene的近实时搜索引擎优化总结
  10. Agile: 为什么要使用 scrum 而不是瀑布?
  11. [置顶] 根据 子网掩码 算出 最大主机数目
  12. yolov5论文叫什么_熬夜写论文是一种怎样的体验
  13. 如何在 iPhone 和 iPad 上快速找到合适照片?
  14. mysql怎么查询两页数据_mysql分页查询踩坑报告
  15. ImageView显示灰色图片
  16. 绩效评估、绩效审计与绩效优化
  17. STM32MP157A-DK1 烧写系统
  18. PBOC/EMV之持卡人验证
  19. 4、Screenshot-adb基本命令-Android
  20. Centos 7 拨号上网

热门文章

  1. 腾讯在乳腺癌影像AI诊断方向的探索
  2. 【Android】【Gradle】解决Manifest merger failed问题
  3. 问题分析报告--简单SQL启动MR
  4. 如何从缓存白嫖网易云音乐
  5. 快速上手matlab(二)
  6. 重庆2018年度进出口总值时隔四年重返5000亿元规模
  7. New Empirical Traceability Analysis of CryptoNote-Style Blockchains
  8. Camera ITS测试
  9. FDTD Solutions-边界条件
  10. Java 开发者如何入门 Node.js 英文原文:Getting Started with Node.js for the Java Developer