Windows下构建Node.js的Docker Nano Server基础镜像

简介: 本文讲的是Windows下构建Node.js的Docker Nano Server基础镜像【编者的话】本文介绍了如何在Windows下制作Nano Server的Docker镜像,并用镜像来部署Node.js应用。
本文讲的是Windows下构建Node.js的Docker Nano Server基础镜像【编者的话】本文介绍了如何在Windows下制作Nano Server的Docker镜像,并用镜像来部署Node.js应用。

从Windows 10内测版14342开始,就可以开启Windows中新的容器功能了。这让你可以直接在Windows 10里以Hyper-V容器的方式直接运行Windows容器。而且目前为止只支持Nano Server容器。因此,是时候开始适应Nano Server并创建一些基础镜像了。
containerswindows10-containers-feature.png

在这篇博客里,我将展示如何构建小的基础镜像,并用Nano Server Docker镜像部署Node.js应用。然后在Windows 10或者Windows Server 2016 TP5中运行这些应用。

什么是Nano Server ?

每个Docker镜像都必须使用两个OS镜像中的一个: windowsservercore 或者 nanoserver

Windows Server Core镜像是和之前的安装版本高度兼容的。你没有GUI界面,但是什么都可以安装。但是这种兼容性是有代价的,这个OS镜像的大小有9.3GB,因为它几乎包含了整个服务器。

Nano Server镜像是一个经过高度优化的镜像。为了能在云服务器上部署更多这样的容器,它几乎把所有安装包都移除了。它的大小只有817MB,使得在Windows 10上安装Docker比用 windowsservercore 镜像快很多。

因此,如果有人问该如何选择,我想答案应该是更小的那个。

挑战:MSI安装包

当你开始尝试写Dockerfile往Docker镜像中安装一些软件的时候,你会注意到这个最小化的系统带来了新的挑战。 在Nano Server中无法安装MSI安装包

Node.js官网 上可以看到,会同时安装npm的只有MSI的安装包。

因此我们如何才可以基于Nano Server构建Node.js的Docker镜像呢?我试过很多方法,比如,在构建Nano Server镜像的时候同时安装lessmsi这样的工具,结果却发现lessmsi是一个32位的应用。Nano Server的另一个局限性就是只能运行64位应用。

另一个方法是在Docker主机上安装Node.js然后把这些文件拷贝到Docker镜像中。但是我不想在Docker主机上安装额外的工具。

因此,接下来我展示一下如何只用Docker命令和Windows Server 2016 TP5来构建Windows Server Core镜像和Nano Server镜像,并安装Node.js和npm。

第一步-在Windows Server Core镜像中安装MSI

从Windows Server Core镜像开始会更简单。你可以用下面这个Dockerfile下载安装Node.js MSI包。这个Dockerfile和Linux的版本很像,下载、验证、安装然后删除文件。

现在打开编辑器:
notepad Dockerfile.

然后输入下面的Dockerfile:
FROM windowsservercore

ENV NPM_CONFIG_LOGLEVEL info  
ENV NODE_VERSION 4.4.5  
ENV NODE_SHA256 7b2409605c871a40d60c187bd24f6f6ddf10590df060b7d905ef46b3b3aa7f81

RUN powershell -Command \  
wget -Uri https://nodejs.org/dist/v%NODE_VERSION%/node-v%NODE_VERSION%-x64.msi -OutFile node.msi -UseBasicParsing ; \
if ((Get-FileHash node.msi -Algorithm sha256).Hash -ne $env:NODE_SHA256) {exit 1} ; \
Start-Process -FilePath msiexec -ArgumentList /q, /i, node.msi -Wait ; \
Remove-Item -Path node.msi

CMD [ "node.exe" ] 

接下来构建Node.js的Docker镜像:
docker build -t node:4.4.5 .

这样,Node.js和npm已经在你的Docker镜像中安装好了。

第二步-提取Node.js目录

现在我们要从Docker镜像中提取Node.js的安装目录。我们需要运行一个Docker容器,然后把这个目录拷贝到宿主机的临时目录里:
docker run --name=node-temp node:4.4.5 node --version  
docker cp "node-temp:c:\Program Files\nodejs" nodejs  
docker rm -vf node-temp

第三步-拷贝部署到Nano Server镜像

我们就用这个提取出来的目录构建Nano Server镜像。下面的 Dockerfile 会把这个临时目录拷贝到Windows的PATH路径里。你也许想要把这些文件放到其他的目录里,但不要忘了把目录加到PATH里去。

给Nano Server的Dockerfile创建一个子目录:
mkdir nano  
notepad nano\Dockerfile.

然后创建Dockerfile:
FROM nanoserver

COPY nodejs /windows/system32

CMD [ "node.exe" ]

运行下面的命令创建Nano Server镜像:
docker build -t node:4.4.5-nano nano  

现在我们有了两个Docker镜像,一个是Windows Server Core,另一个是Nano Server。

我画了一个简单的图,描述了在上面的三个步骤里我做了什么:
containersnodejs_nanoserver-2.png

我已经把这两个Docker镜像上传到DockerHub上了,并且发现Windows Server Core镜像大约55MB,Nano Server镜像只有9MB。

我把第一个Docker镜像的所有层提取出来后发现,安装MSI包会在cache里面保存一份安装包的拷贝。运行命令也会使本地数据库发生一些改变。

所以,如果要构建比较小的Windows Docker镜像,那就要避免安装MSI包。最好选择ZIP文件,甚至是使用COPY命令把文件拷贝到镜像。当然,MSI安装包会更方便,但是它的副作用就是镜像会比较大。

用ONBUILD命令构建应用

另一个Docker化Node.js应用的简单方法是使用Dockerfile的ONBUILD功能。在准备好的Docker镜像上使用这个功能是非常方便的,至少对于做个简单的例子来说是这样。

让我们再创建一个和官方的 node:onbuild 镜像一样的Dockerfile,这个Dockerfile和上面的Dockerfile一样安装应用和所有依赖的程序:
  • 拷贝package.json
  • 运行npm install
  • 拷贝其他资源

因此我们为这个Dockerfile创建了一个独立的目录:
mkdir nano\onbuild  
notepad nano\onbuild\Dockerfile. 

然后输入内容:
FROM node:4.4.5-nano

RUN mkdir \app  
WORKDIR /app

ONBUILD COPY package.json package.json  
ONBUILD RUN npm install  
ONBUILD COPY . .

CMD [ "npm.cmd", "start" ]  

现在可以用ONBUILD功能构建Nano Server镜像:
docker build --isolation=hyperv -t node:4.4.5-nano-onbuild nano/onbuild 

我已经用一个基于 Express 的小型Node.js Web Server测试过,没有任何问题。

现在要构建一个跑在Nano Server容器里的Docker化的Node.js应用,你只需要在你的Dockerfile上加一行:
FROM nano:4.4.5-nano-onbuild 

然后构建Docker应用:
docker build --isolation=hyperv -t mynodeapp:nano . 

优化

研究了这样的应用的镜像的所有层之后又发现了一些不必要的文件夹:
  • npm-cache目录
  • npm生产的很多临时目录

因此我们可以优化上面的那个ONBUILD Dockerfile,在构建Docker镜像的时候把这些临时目录删掉。本来可以用 npm cache clean 命令,但是对我这里不起作用,所以我改用了一些 rd 命令。下面是最终版本的ONBUILD Dockerfile:
FROM node:4.4.5-nano

RUN mkdir \app  
WORKDIR /app

ONBUILD COPY package.json package.json  
ONBUILD RUN npm install & rd /s /q %APPDATA%\npm-cache & for /d %G in ("%TEMP%\npm-*") do rd /s /q "%~G"  
ONBUILD COPY . .

CMD [ "npm.cmd", "start" ] 

用这个优化后的Docker镜像部署一个Express服务器,最终的镜像大小从24MB减少到15MB。而DockerHub上的未经优化的Windows Server Core镜像在部署了Express之后达到了82MB。

总结

如果你不想自己手动构建这些Node.js应用,可以在 Docker Hub 上找到它们,里面有Dockerfile在 GitHub 上的链接。

有了Docker Hub上这样的Node.js Nano Server基础镜像,你可以在你的Windows 10机器上进行开发了。你可以Docker化你的Node.js应用,把它们放到Nano Server容器里,然后在Docker Hub上分享给其他人。

Windows Server 2016只是用来安装MSI安装包,然后提取软件到Nano Server镜像的。

原文链接:How to Build Node.js Nano Server Image(翻译:Lambert Sun)

===========================================================
译者介绍

Lambert Sun,趋势科技DevOps Lead,敏捷开发实践者。

原文发布时间为:2016-07-31

本文作者:Lambert Sun

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:Windows下构建Node.js的Docker Nano Server基础镜像

相关文章
|
6天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js:从零开始构建后端服务
【10月更文挑战第42天】在数字时代的浪潮中,掌握一门后端技术对于开发者来说至关重要。Node.js,作为一种基于Chrome V8引擎的JavaScript运行环境,允许开发者使用JavaScript编写服务器端代码,极大地拓宽了前端开发者的技能边界。本文将从Node.js的基础概念讲起,逐步引导读者理解其事件驱动、非阻塞I/O模型的核心原理,并指导如何在实战中应用这些知识构建高效、可扩展的后端服务。通过深入浅出的方式,我们将一起探索Node.js的魅力和潜力,解锁更多可能。
|
13天前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
20天前
|
JavaScript 中间件 关系型数据库
构建高效的后端服务:Node.js 与 Express 的实践指南
在后端开发领域,Node.js 与 Express 的组合因其轻量级和高效性而广受欢迎。本文将深入探讨如何利用这一组合构建高性能的后端服务。我们将从 Node.js 的事件驱动和非阻塞 I/O 模型出发,解释其如何优化网络请求处理。接着,通过 Express 框架的简洁 API,展示如何快速搭建 RESTful API。文章还将涉及中间件的使用,以及如何结合 MySQL 数据库进行数据操作。最后,我们将讨论性能优化技巧,包括异步编程模式和缓存策略,以确保服务的稳定性和扩展性。
|
9天前
|
JSON JavaScript API
深入浅出Node.js:从零开始构建RESTful API
【10月更文挑战第39天】 在数字化时代的浪潮中,API(应用程序编程接口)已成为连接不同软件应用的桥梁。本文将带领读者从零基础出发,逐步深入Node.js的世界,最终实现一个功能完备的RESTful API。通过实践,我们将探索如何利用Node.js的异步特性和强大的生态系统来构建高效、可扩展的服务。准备好迎接代码和概念的碰撞,一起解锁后端开发的新篇章。
|
19天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
95 2
|
5天前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API
使用JavaScript和Node.js构建简单的RESTful API
|
13天前
|
API Docker 容器
【赵渝强老师】构建Docker Swarm集群
本文介绍了如何使用三台虚拟主机构建Docker Swarm集群。首先在master节点上初始化集群,然后通过特定命令将node1和node2作为worker节点加入集群。最后,在master节点上查看集群的节点信息,确认集群构建成功。文中还提供了相关图片和视频教程,帮助读者更好地理解和操作。
|
13天前
|
缓存 JavaScript 安全
深入理解Docker镜像构建过程
深入理解Docker镜像构建过程
49 0
|
13天前
|
JavaScript 前端开发 NoSQL
深入浅出:使用Node.js构建RESTful API
【10月更文挑战第35天】在数字时代的浪潮中,后端技术如同海洋中稳固的灯塔,为前端应用提供数据和逻辑支撑。本文旨在通过浅显易懂的方式,带领读者了解如何利用Node.js这一强大的后端平台,搭建一个高效、可靠的RESTful API。我们将从基础概念入手,逐步深入到代码实践,最终实现一个简单的API示例。这不仅是对技术的探索,也是对知识传递方式的一次创新尝试。让我们一起启航,探索Node.js的奥秘,解锁后端开发的无限可能。
|
15天前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。