广告
返回顶部
首页 > 资讯 > 精选 >Node.js服务Docker容器化应用实例分析
  • 839
分享到

Node.js服务Docker容器化应用实例分析

2023-06-17 09:06:40 839人浏览 泡泡鱼
摘要

这篇“node.js服务Docker容器化应用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“node.js服务Doc

这篇“node.js服务Docker容器化应用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“node.js服务Docker容器化应用实例分析”文章吧。

docker 化一个 node.js 应用程序

在本篇开始我们先创建一个简单的 node.js 应用,然后为这个应用创建一个 docker 镜像,并构建和运行它

创建 node.js 项目

首先我们需要创建一个 app.js 开启一个 Http 服务,后面会借助 docker 来运行这个程序

const http = require('http');const port = 30010;const server = http.createserver((req, res) => { res.end('hello docker');})server.listen(port, () => { console.log('running on http://localhost:', port, 'node_env', process.env.node_env);});

然后我们创建一个 package.JSON 文件,这里是描述你的应用程序以及需要的依赖,写过 node.js 的同学应该会很熟悉的,这里我在 scripts 里面增加了npm run devnpm run pro两个命令,因为我想在这里介绍如何在构建时传入参数来动态设置环境变量。

{  "name": "hello-docker",  "version": "1.0.2", "description": "",  "author": "may", "main": "app.js",  "scripts": { "dev": "node_env=dev node app.js", "pro": "node_env=pro node app.js" }}

dockerfile 文件

这是一个 dockerfile 文件所包含的信息,这些命令在docker 入门与实践中也有讲解过

from node:10.0-alpinerun apk --update add tzdata \ && cp /usr/share/zoneinfo/asia/shanghai /etc/localtime \ && echo "asia/shanghai" > /etc/timezone \ && apk del tzdatarun mkdir -p /usr/src/nodejs/workdir /usr/src/nodejs/# add npm packagecopy package.json /usr/src/nodejs/package.jsonrun cd /usr/src/nodejs/run npm i# copy codecopy . /usr/src/nodejs/expose 30010cmd npm run dev

在 dockerfile 的同级文件下创建一个 .dockerignore 文件,避免将你本地的调试文件、node_modules 等一些文件放入 docker 容器中

.gitnode_modulesnpm-debug.log

此时通过以下命令即可构建一个 docker 镜像

$ docker image build -t mayjun/hello-docker

再通过 docker run -d -p 30010:30010 mayjun/hello-docker 命令可运行一个 docker 容器,但是有个疑问我是有生产和测试之分的,按照上面cmd npm run dev这样写死只能打包一种环境,当然你也可以在建一个文件来实现或者一些其它的方法。

动态设置环境变量

为了解决上面的疑问,我的想法是在镜像构建时传入参数来动态设置环境变量,对 dockerfile 文件做下修改,看以下实现:

expose 30010arg node_env # 新增加env node_env=$node_env # 新增加cmd npm run ${node_env} # 修改

下面对上面的代码做个解释

  • 通过 arg 指令定义了一个变量,用户可以在构建时通过使用 --build-arg = 标志的 docker build 命令将其传递给构建器 arg node_env

  • 在 dockerfile 中使用 env 引用这个变量 env node_env=$node_env

  • 这一步就是使用了 cmd npm run ${node_env}

剩下的就是在构建镜像时动态传入参数了

$ docker image build --build-arg node_env=dev -t mayjun/hello-docker:1.0.2 . # 构建测试环境$ docker image build --build-arg node_env=pro -t mayjun/hello-docker:1.0.2 . # 构建生产环境

运行容器

$ docker run -d -p 30010:30010 mayjun/hello-docker:1.0.2$ docker pscontainer id image   command   created  status  ports   names2bc6e62cd0e8 mayjun/hello-docker:1.0.2 "/bin/sh -c 'npm run…" 3 minutes aGo up 3 minutes 0.0.0.0:30010->30010/tcp elastic_bouman

查看容器日志

docker logs -f 2bc6e62cd0e8> hello-docker@1.0.0 dev /usr/src/nodejs> node_env=dev node app.jsrunning on http://localhost: 30010 node_env dev

我将以上代码打包成了镜像 mayjun/hello-docker:1.0.2,可以拉取查看 docker pull mayjun/hello-docker:1.0.2

docker 与 node.js 私有 npm 包

如果你的项目中使用了私有 npm 包,在 dcoker 构建镜像过程中会出现 npm 私有包安装 404 的错误,如果是在容器外部我们可以 npm login 登陆拥有 npm 私有包权限的账户,来解决这个问题,但是在 docker 的时候是不能这样做的。

创建身份验证令牌

为了安装私有包我们需要 “创建身份验证令牌” 以便在持续集成环境、docker 容器内部能访问我们的私有 npm 包,如何创建可参考

实现方法

我们在创建 dockerfile 文件过程中就需要增加以下两条命令:

# 528das62-e03e-4dc2-ba67-********** 这个 token 就为你创建的身份验证令牌 tokenrun echo "//reGIStry.npmjs.org/:_authtoken=528das62-e03e-4dc2-ba67-**********" > /root/.npmrcrun cat /root/.npmrc

egg 框架 docker 容器化

在 egg 里面,如果是egg-scripts start --daemon去掉 --daemon直接 egg-scripts start 即可,否则 docker 容器会无法启动。

看以下代码示例,修改下 package.json 即可,dockerfile 文件同上面第一个docker 化一个 node.js 应用程序是一样的

package.json

{ "scripts": { "start": "egg-scripts start" // 去掉 --daemon }}

也可参考 egg issues “docker容器不能run起来,请问有碰到的吗?”

docker 镜像体积与构建时间优化

如果一个镜像在不经过优化的情况下体积通常都是会很大的,以下也是在实践过程中做的几点优化。

run/copy 分层

dockerfile 中的每条指令都会创建一个镜像层,dockerfile 指令或复制的项目文件在没有修改变动的情况下,每个镜像层是可以被复用和缓存的。

以下代码可在 mayjun/hello-docker:latest 镜像仓库找到,以下示例中,源码改变之后,不管 package.json 有没有改变的情况下都会重新安装 npm 模块,这样显然是不好的,因此下面我们要改进

# ...workdir /usr/src/nodejs/hello-dockercopy . /usr/src/nodejs/hello-dockerrun npm install# ...

改进之后的代码如下所示,我们让 package.json 提前,在 package.json 没有修改的情况下是不会重新安装 npm 包的,也会减少部署的时间。

# ...workdir /usr/src/nodejs/# add npm packagecopy package.json /usr/src/app/package.jsonrun cd /usr/src/app/run npm i# copy codecopy . /usr/src/app/# ...

node.js alpine 镜像优化

mayjun/hello-docker:1.0.0 这个镜像在 docker 仓库也可搜索到,在未优化之前大约在 688mb

$ docker imagesrepository tag image id created sizemayjun/hello-docker 1.0.0 7217fb3e9daa 5 seconds ago 688mb

使用 alpine 优化

alpine 是一个很小的 linux 发行版,想要大幅度减小镜像体积选择 node.js 的 alpine 版本也是最简单的,另外 -alpine 的时区默认不是国内的,需要 dockerfile 配置时区。

from node:10.0-alpinerun apk --update add tzdata \ && cp /usr/share/zoneinfo/asia/shanghai /etc/localtime \ && echo "asia/shanghai" > /etc/timezone \ && apk del tzdatarun echo "asia/shanghai" > /etc/timezonerun mkdir -p /usr/src/nodejs/workdir /usr/src/nodejs/# add npm packagecopy package.json /usr/src/app/package.jsonrun cd /usr/src/app/run npm i# copy codecopy . /usr/src/app/expose 30010cmd npm start

重新打包了一个版本 mayjun/hello-docker:1.1.0 再次查看下效果,可以看到镜像文件从 688mb 减少至 85.3mb,这个体积优化还是很大的

$ docker imagesrepository  tag   image id  created  sizemayjun/hello-docker 1.1.0  169e05b8197d 3 minutes ago 85.3mb

生产环境不要打包 devdependencies 包

有些测试环境用的包,在进行生产环境打镜像时不要包含进去,也就是 package.json 文件 devdependencies 对象,通过在 npm i 之后指定 --production 参数过滤

改进如下所示:

from node:10.0-alpine# 省略 ...# add npm packagecopy package.json /usr/src/app/package.jsonrun cd /usr/src/app/run npm i --production # 改变在这了# 省略 ...

重新打包了一个版本 mayjun/hello-docker:1.2.0 再次查看下效果,可以看到镜像文件从 85.3mb 又减少至 72.3mb

$ docker imagesrepository  tag   image id  created  sizemayjun/hello-docker 1.2.0  f018aa578711 3 seconds ago 72.3mb

常见问题

question1

以下命令在删除镜像的时候报如下错误:

$ docker rmi 6b1c2775591eerror response from daemon: conflict: unable to delete 6b1c2775591e (must be forced) - image is referenced in multiple repositories

细心的你也许会发现镜像 id 6b1c2775591e 同时指向了 hello-docker 和 mayjun/hello-docker 仓库,这也是造成删除失败的原因

$ docker imagesrepository  tag   image id  created  sizemysql   5.7   383867b75fd2 6 days ago  373mbhello-docker  latest  6b1c2775591e 7 days ago  675mbmayjun/hello-docker latest  6b1c2775591e 7 days ago  675mb

指定 repository 和 tag 来删除,执行删除命令之后再次查看 mayjun/hello-docker 仓库就已经没有了

$ docker rmi mayjun/hello-docker$ docker images   repository  tag   image id  created  sizeMysql  5.7   383867b75fd2 6 days ago  373mbhello-docker latest  6b1c2775591e 7 days ago  675mb

question2

执行删除镜像命令报如下错误:

$ docker rmi 9be467fd1285error response from daemon: conflict: unable to delete 9be467fd1285 (cannot be forced) - image is being used by running container 1febfb05b850

根据提示是有正在运行的容器,需先停止容器、删除容器之后在删除镜像

$ docker container kill 1febfb05b850 # 停止容器$ docker rm 1febfb05b850 # 删除容器$ docker rmi 9be467fd1285 # 删除镜像

question3

设定的工作目录(workdir)要与下面的要保持一致

...workdir /usr/src/nodejs/# add npm packagecopy package.json /usr/src/node/package.json # 目录不一致run cd /usr/src/node/ # 目录不一致run npm i...

例如,如以上配置因为工作目录与实际 copy 的目录不一致,会导致报以下错误:

Node.js服务Docker容器化应用实例分析

再按照以下方式更改为一致即可

...workdir /usr/src/nodejs/# add npm packagecopy package.json /usr/src/nodejs/package.json # 更改为一致run cd /usr/src/nodejs/ # 更改为一致run npm i...

以上就是关于“Node.js服务Docker容器化应用实例分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Node.js服务Docker容器化应用实例分析

本文链接: https://www.lsjlt.com/news/287937.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Node.js服务Docker容器化应用实例分析
    这篇“Node.js服务Docker容器化应用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Node.js服务Doc...
    99+
    2023-06-17
  • Docker容器使用实例分析
    今天小编给大家分享一下Docker容器使用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2022-10-19
  • 容器Docker入门实例分析
    这篇文章主要讲解了“容器Docker入门实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“容器Docker入门实例分析”吧!一、概述1.1 基本概念:d...
    99+
    2022-10-19
  • Docker容器化应用Node.js服务的方法是什么
    本文小编为大家详细介绍“Docker容器化应用Node.js服务的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Docker容器化应用Node.js服务的方法是什么”文章能帮助大家解决疑惑,下面...
    99+
    2022-11-30
    docker node.js
  • Docker部署服务的坑实例分析
    这篇文章主要讲解了“Docker部署服务的坑实例分析 ”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Docker部署服务的坑实例分析 ”吧!本项目采用的是s...
    99+
    2022-10-19
  • 服务器故障实例分析
    这篇文章主要介绍“服务器故障实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“服务器故障实例分析”文章能帮助大家解决问题。1. 出故障了没办法,干it这一行,就得天天面对故障,大家就是传说中的消...
    99+
    2023-06-17
  • Laravel中服务容器绑定的示例分析
    这篇文章给大家分享的是有关Laravel中服务容器绑定的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Laravel 是什么Laravel 是一套简洁、优雅的PHP Web开发框架。它可以让你从面条一样杂...
    99+
    2023-06-14
  • 容器在编程中的优缺点分析及应用实例。
    容器在编程中的优缺点分析及应用实例 随着计算机科学的不断发展,编程语言和技术也在不断进步。在编写程序的过程中,容器已经成为了一个非常重要的概念。容器是一种轻量级的虚拟化技术,它可以在同一台物理机器上运行多个应用程序,并且在运行时保证应用程序...
    99+
    2023-06-01
    leetcode 编程算法 容器
  • 亚马逊服务器实例分析
    亚马逊服务器的特点包括: 高可靠性:亚马逊服务器提供冗余机制,包括备用节点和热备份。这些机制可以确保在主节点故障时,应用程序仍能正常运行。 高可用性:亚马逊服务器采用集群技术,将多个节点组合在一起,以提高系统的可用性和可靠性。 高性能:...
    99+
    2023-10-27
    亚马逊 实例 服务器
  • 腾讯云服务器实例分析
    腾讯云服务器实例分析主要关注于服务器的配置、部署和使用,以及服务的性能和可靠性等方面。下面是一个简要的介绍: 服务简介: 腾讯云服务器提供了多种服务,如云主机、云存储、云监控、负载均衡等。它们可以帮助用户构建高可用、可靠的云基础设施,同...
    99+
    2023-10-26
    腾讯 实例 服务器
  • 云服务器实例类型分析
    云服务器实例类型是指云服务提供商所提供的不同配置的虚拟服务器实例。不同的实例类型具有不同的计算、存储和网络资源,以满足不同的应用需求。云服务器实例类型通常根据 CPU、内存、存储和网络带宽等参数进行分类。云服务器实例类型分析">通用型实例是...
    99+
    2023-10-26
    实例 类型 服务器
  • Bash脚本、Go并发和Docker容器:实现容器化应用的最佳实践
    在当今的软件开发领域中,容器化应用已经成为了一种非常流行的趋势。Docker作为一种流行的容器化技术,已经被广泛应用于实现容器化应用。然而,要想实现高效的容器化应用,必须掌握一些最佳实践技巧。本文将介绍如何使用Bash脚本、Go并发和Do...
    99+
    2023-08-14
    并发 bash 容器
  • CSS id选择器实例应用分析
    这篇文章主要介绍“CSS id选择器实例应用分析”,在日常操作中,相信很多人在CSS id选择器实例应用分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS id选择器实...
    99+
    2022-10-19
  • 中小型企业的Sendmail邮件服务器应用实例分析
    这期内容当中小编将会给大家带来有关中小型企业的Sendmail邮件服务器应用实例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。简介:旨在介绍如何利用Linux服务器上的sendmail构建中小型企业的...
    99+
    2023-06-13
  • 云服务器ecs实例类型有哪些内容和方法分析
    云服务器ecs实例类型可以提供一系列的方法和属性,以下是一些常见的云服务器ecs实例类型的内容和方法分析: CPU 使用量的分析 云服务器ecs实例类型通常是虚拟机的一种形式,因此CPU使用量可以用于评估它的性能和可扩展性。在以下步骤...
    99+
    2023-10-27
    实例 类型 服务器
  • JAVA装饰器模式应用实例分析
    本篇内容主要讲解“JAVA装饰器模式应用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JAVA装饰器模式应用实例分析”吧!什么是装饰器模式装饰器(Decorator)模式的定义: 指在不...
    99+
    2023-06-30
  • 使用Docker Compose、Nginx和MariaDB实现PHP应用程序的容器化
    导语:随着容器化技术的快速发展,越来越多的开发者开始关注使用Docker来进行应用程序的部署和管理。本文将介绍如何使用Docker Compose、Nginx和MariaDB实现PHP应用程序的容器化,并给出具体的代码示例,帮助读者更好地理...
    99+
    2023-10-21
    Docker nginx mariadb
  • SpringCloud Eureka服务注册中心应用入门实例分析
    这篇文章主要介绍“SpringCloud Eureka服务注册中心应用入门实例分析”,在日常操作中,相信很多人在SpringCloud Eureka服务注册中心应用入门实例分析问题上存在疑惑,小编查阅了各式资料,整理出简...
    99+
    2023-07-02
  • 腾讯云服务器实例分析报告
    很抱歉,我无法为您提供具体的云服务器实例分析报告。但是,我可以向您介绍一些常用的云服务器实例分析工具。 CloudStack:它是一种云存储和云计算平台,可以轻松地部署和管理大量的云计算资源。该平台提供了一个可伸缩的架构,使得企业可以灵...
    99+
    2023-10-26
    腾讯 分析报告 实例
  • HTML5服务器发送事件实例分析
    本篇内容介绍了“HTML5服务器发送事件实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! &nbs...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作