65.9K
CodeProject 正在变化。 阅读更多。
Home

将运行在 Microsoft IIS 10 上的 Node.js 应用程序部署到 Docker 的 Windows Server Core 2016 容器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (7投票s)

2018年9月1日

CPOL

4分钟阅读

viewsIcon

24636

downloadIcon

146

在这篇简短的文章中,我们将演示如何部署 Node.js 应用程序并将其运行在 Docker 的 Windows Server Core 2016 容器中。

注意您可以通过访问以下链接来评估本文讨论的现成 Web 应用程序:http://antispamnb.eastus.cloudapp.azure.com/

编者按

在这篇简短的文章中,我们将讨论如何将运行在 Microsoft IIS 10 上的 Node.js Web 应用程序部署到 Docker 的 Windows Server Core 2016 容器。本文的读者将学会如何在 Windows 上安装和配置 Docker,以及如何通过创建和使用 Dockerfile 来部署 Node.js Web 应用程序,这些内容将在本文中进行详细讨论。

背景

在 Windows 上安装和配置 Docker

在部署和运行本文介绍的 Web 应用程序之前,我们首先必须在 Windows Server 上安装 Docker。为此,我们必须访问以下链接从 Docker 网站下载安装文件:https://store.docker.com/editions/community/docker-ce-desktop-windows。在下载特定文件之前,我们必须创建一个 Docker 账户。

既然我们已经下载了 Docker 安装文件,现在就可以运行 Docker 安装了。

创建 Dockerfile

在这一段中,我们将演示如何创建一个 Dockerfile,用于执行 Windows Server Core 2016 实例的自动构建,该实例将预先配置为在 Microsoft IIS 10 下运行 Node.js Web 应用程序。在此步骤中,我们只需要做以下事情:

  • 从 Docker 仓库拉取 Microsoft/windowsservercore 镜像
  • 将我们正在创建的 nodejs-core 镜像的所有 Web 应用程序文件复制进去
  • 为 Windows Server Core 2016 镜像添加 Microsoft IIS 10 Web 服务器角色
  • 下载并预装运行 Node.js 应用程序所需的所有 IIS 10 组件
  • 安装运行 Web 应用程序所需的 Node.js 模块
  • 设置运行 Node.js Web 应用程序所需的环境变量
  • 公开 Web 应用程序监听的 TCP 端口
  • 为 Web 应用程序的运行提供特定的入口点

为了完成所有这些步骤,我们需要在 Dockerfile 中添加以下几行。

通过在文件顶部添加 FROM 子句,我们实际上指定了一个将从 Docker 仓库下载的镜像,我们将使用它来构建我们自己的 nodejs-core 镜像。

FROM microsoft/windowsservercore:latest

在本例中,我们选择了 Microsoft/windowsservercore 镜像,我们将基于它创建我们自己的 nodejs-core 镜像,其中包含 Windows Server Core 2016。

之后,我们必须指定 Web 应用程序的工作目录路径,所有应用程序文件都将复制到此处。为此,我们必须在正在创建的 Dockerfile 中添加以下行。

WORKDIR /inetpub/wwwroot

既然我们已经提供了应用程序的工作目录路径,现在就可以使用 COPY 指令将所有必需的 Web 应用程序文件传输到正在构建的镜像中,如下所示:

COPY sources/ .

COPY sources/node_modules/webworker-threads 
C:/Users/ContainerAdministrator/AppData/Roaming/npm/node_modules/webworker-threads

COPY /sources/package*.json ./

最后,我们必须为正在创建的 Windows Server Core 2016 镜像添加 Microsoft IIS 10 Web 服务器角色。

RUN powershell Add-WindowsFeature Web-Asp-Net45,Web-Http-Tracing,Web-Scripting-Tools,Web-WebSockets;

下一步是提供执行自动化安装 Web 应用程序运行所需软件组件的指令。

ADD https://node.org.cn/dist/v8.11.4/node-v8.11.4-x64.msi node-v8.11.4-x64.msi
RUN powershell Start-Process msiexec -ArgumentList '/i node-v8.11.4-x64.msi /qn /l*v nodejs.log' -Wait ;

ADD http://go.microsoft.com/fwlink/?LinkID=615137 rewrite_amd64.msi
RUN powershell Start-Process msiexec -ArgumentList '/i rewrite_amd64.msi /qn /l*v rewrite.log' -Wait ;

ADD https://github.com/tjanczuk/iisnode/releases/download/v0.2.21/iisnode-full-v0.2.21-x64.msi 
iisnode-full-v0.2.21-x64.msi
RUN powershell Start-Process msiexec -ArgumentList '/i iisnode-full-v0.2.21-x64.msi /qn /l*v 
iisnode.log' -Wait ;

具体来说,我们需要安装 Node.js v8.11.4、URL Rewrite 和 IISNode 组件以供 Microsoft IIS 10 Web 服务器使用。为了下载这些组件,我们必须使用 ADD 指令子句,该子句使用 wget 功能下载所需的安装文件并将它们保存在正在创建的镜像中。

在我们成功下载并安装 Node.js 后,我们需要安装运行我们的 Web 应用程序所需的 Node.js 模块数量。为此,我们将以下几行添加到我们的 Dockerfile 中:

RUN powershell npm install --global --production  npm
RUN powershell npm install --global --production  node-gyp
RUN powershell npm --vcc-build-tools-parameters='[""--allWorkloads""]' 
install --global --production windows-build-tools

为此,我们使用 npm install 命令下载并安装特定的 Node.js 模块,例如 npmnode-gypVisual Studio 2017 的构建工具

另一个重要的配置步骤是,我们需要设置特定 Node.js 模块正常运行所需的环境变量数量。

ENV PATH 'C:\users\containeradministrator\.windows-build-tools\Python27;
C:\Program Files (x86)\MSBuild\14.0\bin\;C:\Windows\system32;C:\Windows;
C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;
C:\Program Files\nodejs\;C:\Users\ContainerAdministrator\AppData\Local\Microsoft\WindowsApps;
C:\Users\ContainerAdministrator\AppData\Roaming\npm;'
ENV PYTHON '%USERPROFILE%\.windows-build-tools\Python27\python.exe'
ENV PYTHONPATH '%USERPROFILE%\.windows-build-tools\python27'
ENV VCTargetsPath "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140"
ENV NODE_PATH "C:\Users\ContainerAdministrator\AppData\Roaming\npm\node_modules"

最后,我们还必须下载并安装 Web 应用程序运行所需的 Node.js 模块。

RUN powershell npm install --global --production body-parser busboy cluster 
consolidate cookie-parser debug express express-fileupload favicon http logger math net 
path querystring url util jade bindings

之后,我们需要指定 Web 应用程序将监听的 TCP 端口(例如,TCP-8080 端口),并为我们的应用程序提供一个入口点。

EXPOSE 8080

ENTRYPOINT node.exe ./server.js

构建和运行 Node.js Web 应用程序

要使用我们在上一步创建的 Dockerfile 构建镜像,我们必须进入 PowerShell 控制台并执行以下命令:

PS C:\antispamnb> docker build --no-cache -t nodejs-core .

既然我们已经构建了 nodejs-core 镜像,现在就可以通过输入以下命令来运行 Web 应用程序了:

PS C:\antispamnb> docker run -d -p 80:8080 --restart=always --name=antispamnb nodejs-core

之后,让我们检查一下我们的应用程序是否真的有效。为此,我们必须打开 Web 浏览器并输入以下链接:

http://antispamnb.eastus.cloudapp.azure.com:80/

关注点

在本文中,我们讨论了如何创建一个 Dockerfile,用于将运行在 Windows Server Core 2016 上的 Node.js Web 应用程序部署到 Docker Windows 容器。

历史

  • 2018年9月1日 - 本文的第一个版本发布。
© . All rights reserved.