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





5.00/5 (7投票s)
在这篇简短的文章中,我们将演示如何部署 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 模块,例如 npm
、node-gyp
和 Visual 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日 - 本文的第一个版本发布。