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

在 Windows 上开始使用 Docker 并将 Nodejs 应用托管在容器内

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2016 年 10 月 21 日

CPOL

11分钟阅读

viewsIcon

41588

downloadIcon

192

在 Windows 操作系统上开始使用 Docker 并将 Nodejs 应用托管在容器内

引言

在本文中,我们将了解如何在 Windows 操作系统上快速配置 Docker,并将 Node.js 应用托管在 Docker 容器中。此外,我们还将介绍配置 Docker 容器所需的一些命令。本文将分为两个部分,第一部分将介绍在 Windows 操作系统上安装和运行 Docker 服务,第二部分将介绍将 Node.js 代码挂载到 Docker 容器中并运行它。要理解第二部分,您需要对 Node.js 和 npm 有一些基本的了解。

我希望就本文获得反馈。请随时分享您的评论,您也可以通过 shettyashwin@outlook.com 发送电子邮件给我。如果您喜欢本文,请不要忘记给它评分。

背景

我们在构建服务器上遇到了一些挑战,当两个构建同时触发时,特别是使用 AngularJS 和 Node.js 应用。此外,我们正在寻找更智能的方法来更频繁地在生产环境中发布代码更改。因此,我们开始研究微服务和其他并行构建的选项,此外,我们还在寻找快速但错误率较低的部署服务技术。如果出现任何问题,回滚新更改也是我们所需要的。我们的应用程序是用 .NET 开发的,并且开发已经持续了一段时间。将应用程序迁移出 Windows 操作系统从未在我们考虑的范围内。我们的想法是将所有新服务迁移到微服务,并引入 Node.js、AngularJS 等新技术。

最终我们决定使用 Docker。但是,与 Windows 10(使用 Hyper-V)相比,在 Windows 7 上设置和运行 Docker 有点复杂。在下面的文章中,我将分步介绍如何在使用 Docker Toolbox 的 Windows 7使用 Docker Installer 的 Windows 10 (带 Hyper-V) 上配置 Docker。

必备组件

如果您的操作系统支持 Hyper-V,您可以在 此处查看。

没有 Hyper-V 的 Windows 操作系统

BIOS 中应启用虚拟化。有关在 BIOS 中启用虚拟化的详细信息,请单击 此处

Docker Toolbox 安装程序

带 Hyper-V 的 Windows 操作系统

Docker 安装程序。在执行 Docker 安装程序之前,需要先启用 Hyper-V。

 

让我们开始吧

没有 Hyper-V 的 Windows 操作系统

执行 Docker Toolbox 安装程序非常简单直接。成功安装Docker Toolbox(无 Hyper-V)后,您的桌面上应该有 3 个图标。

Docker-CLI Kitematic VM-Virtual

我强烈建议以管理员权限启动所有快捷方式。这将避免不必要的麻烦。

让我们开始吧,双击“Docker QuickStart Terminal”。由于是第一次运行 Docker,它将下载 boot2docker 并应用必要的设置以帮助您开始。这需要几分钟时间,具体取决于您的系统处理能力和网络带宽。一切成功运行后,您应该会看到下面的图像。

Docker Welcome Screen

请记下欢迎屏幕上的 IP 地址。我们将需要它来访问托管在 Docker 容器内的应用程序。Docker quick starter 将创建一个我们将用于运行示例应用程序的default VM。好的,现在我们已经准备好了 Docker 实例,可以进行操作了。但是,如果您计划将某些本地系统文件挂载(而不是复制)到 Docker 中,则需要先执行一些命令。这些命令仅在您使用 Toolbox 运行 Docker 时才需要。以下命令将把您的本地文件夹映射到 Docker VM,再从 VM 映射到容器。

以管理员权限打开新的命令提示符,然后键入以下命令。

docker-machine stop default

在上面的命令中,我们正在关闭 Docker 的default VM 机器。如果命令提示符无法识别docker-machine,请检查 Docker 文件夹(在 Program Files 中)是否已添加到 PATH 环境变量。如果安装程序未添加,请继续并添加。有关更新 PATH 变量的详细信息,请参见 此处。更新 PATH 变量时,请确保您考虑了您的系统路径。

我在系统的 D 盘上创建了 RD 文件夹。这些文件夹将包含我所有的代码和用于存放应用程序数据库文件的文件夹。我将把 D:\RD 挂载到 VM。

VBoxManage.exe sharedfolder add default --name "/d/rd" --hostpath "\\?\d:\RD" --automount

现在让我们快速看看上面的命令是什么意思。

default:我们希望共享此文件夹的 VM 的名称

--name:我们将在 Docker VM 内引用的主机路径的名称('/d/rd')。

--hostpath:正在映射的路径('\\?\d:\RD')。

--automount:在每次 VM 重启时保持挂载此驱动器。

如果命令提示符无法找到 VBoxManage.exe,则导航到命令提示符下的C:\Program Files\Oracle\VirtualBox(路径取决于您安装 Docker Toolbox 的驱动器)并重试。成功执行后,运行以下命令。这将启动 Docker VM。

docker-machine start default

现在我们已经将本地系统文件夹映射到了 Docker VM,但是要在此 Docker VM 中访问此文件夹,我们需要先将其连接到 Docker VM,在 VM 中创建一个文件夹,然后将本地驱动器挂载到 VM 文件夹。请注意,D:\RD(主机共享文件夹)中的文件仅根据启动 Docker VM 的权限才能访问。为了安全起见,我已将EVERYONE对此文件夹的读/写权限。我不建议将 EVERYONE 权限授予您的文件夹,您可以根据项目的需求决定授予什么权限。要连接 Docker VM,您可以执行以下命令。

docker-machine ssh default

上述命令将建立与default VM 的安全连接。下一步是在 VM 中创建一个文件夹,并将本地驱动器挂载到该文件夹。请执行以下 2 个命令。

sudo mkdir --parents /d/rd

这将会在 Docker VM 中创建一个文件夹

sudo mount -t vboxsf /d/rd /d/rd

这将把 '/d/rd/' 键名挂载到我们刚刚创建的文件夹。在上述挂载命令中,第一个 /d/rd 代表执行 VBoxManage 命令时创建的键名,第二个/d/rd代表我们刚刚在 Docker VM 中创建的文件夹名称。键入exit并退出 Docker VM。现在,要将命令提示符指向默认的 Docker 实例,请执行以下命令。

 @FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i

这将以静默模式为您的命令提示符设置默认值。如果您希望看到此值,可以执行docker-machine env default,这将列出所有参数以供将来参考。

如果您希望更改 Docker VM/容器的 RAM 或 CPU,可以使用Oracle VM Virtualbox进行设置。在 default VM 下查找“System”选项卡。图片供参考。这些设置只能在 VM 未运行时更改。

Oracle VM Manager, System Setting

带 Hyper-V 的 Windows 操作系统

在具有 Hyper-V 的操作系统上安装 Docker 非常简单。成功安装后,您应该会在通知区域看到 Docker 图标。要更改 CPU/RAM/驱动器挂载,只需右键单击该图标,然后从菜单中使用设置。

Docker Setting

Docker 镜像

由于我们计划使用 Docker 部署 Node.js 应用程序,我们将使用 Node.js 推荐的 Docker 镜像。如果您在非 Hyper-V OS 上运行 Docker,请确保已为命令提示符设置环境变量,或者在通过启动Docker Quick Start获得的 Docker CLI 中执行以下命令。

您可以提前使用pull命令下载 Node.js 推荐的镜像,否则 Docker 将在您执行buildrun命令时尝试下载该镜像。为了简单起见,我们将提前下载镜像。

docker pull node:argon

这将从 Docker Hub 下载node:argon到本地注册表。在构建任何镜像时,Docker 首先会引用本地注册表,只有在本地不可用时,它才会从 Docker Hub 下载。如果您想尝试其他镜像,可以在 此处搜索。

为生产/构建环境构建 Docker 镜像

假设您的 Node.js 应用运行需要一些先决条件,这些先决条件需要在应用启动前预先安装。为了演示下面的 Node.js 示例,我将使用 Express.jsNodeMon。Express.js 将托管和提供 HTTP 请求,而 Nodemon 将监视源代码中的更改。现在,让我们创建一个预装了 Express.js 和 Nodemon 的镜像。

在我们开始之前,让我们创建将在应用程序开发中使用的文件夹结构。我将在我的 D 盘上创建一个 RD 文件夹。RD 文件夹内将再次有两个文件夹:docker 和 service。我们将使用 docker 文件夹(D:\RD\docker)来构建我们的镜像。现在,创建一个名为 Dockerfile 的新文件。请注意,此文件不应包含任何扩展名。现在,在记事本或其他您熟悉的文本编辑器中打开此文件,并输入以下源代码。

FROM node:argon
MAINTAINER Ashwin Shetty <shettyashwin@outlook.com>

RUN "apt-get update && apt-get clean"
RUN npm install -g express
RUN npm install -g nodemon

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

EXPOSE 9000

第 1 行:From node:argon 将指示 Docker 引擎从注册表中引用 node:argon 镜像。如果您尚未下载 node:argon 镜像,它将再次尝试下载。

第 2 行:MAINTAINER Ashwin Shetty <shettyashwin@outlook.com> 不是强制性的,但我仍然建议将其添加到您的 Dockerfile 中,以记录维护者。

第 4/5/6 行:RUN "" 这将在创建基础镜像时运行您的所有命令。apt-get update && apt-get clean 会获取基于操作系统的最新更新,然后清除临时文件夹。npm install 将在镜像内全局安装 express 和 nodemon。

第 8 行和第 9 行:mkdir & WORKDIR 将创建空文件夹并将该目录标记为工作目录。

第 11 行:EXPOSE 将从容器中公开端口 9000。我们需要此端口才能从容器访问应用程序。

现在,让我们构建此镜像。打开命令提示符,然后导航到 D:\RD\docker 文件夹。在命令提示符中执行以下命令。

 @FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i
 docker build -t dockerApp .

第 1 行:将设置一个变量,Docker Exe 将在 Docker 实例中引用它(仅在非 Hyper-V 系统中需要)。

第 2 行:将创建一个名为dockerApp的 Docker 镜像,请务必在命令末尾添加点。这将让 Docker 引擎知道在哪里查找 Dockerfile。

成功执行上述命令后,您应该能在本地 Docker 镜像注册表中看到dockerApp镜像。要查看本地 Docker 注册表,请执行以下命令。

docker images

示例 Node.js 应用

要创建 Node.js 服务,请在 D:\RD\service 中创建一个 server.js 文件,并粘贴以下代码。

var express = require('express')
var app = express()
 
app.get('/', function (req, res) {
  res.send('Hello World')
})
 
app.listen(9000)

源代码参考自:- https://npmjs.net.cn/package/express 

上面的代码将托管一个 API,当您访问 http://[docker ip / localhost]:9000 时,它将返回 Hello World。

在容器中运行应用程序

好的,我们已经完成了所有繁重的工作,现在是时候查看 Docker 容器的最终输出了。在命令提示符中执行以下命令。

docker run -i  --name nodeservice -p 9000:9000 -v /d/rd:/usr/src/app dockerApp /bin/bash/ -c 'cd service; nodemon server.js'

docker run 命令将使用我们刚刚传递的参数启动一个新的容器进程。我来快速解释一下这些参数:

--name:将定义容器进程的名称,我们将其命名为nodeservice

-p:将告知 Docker 公开端口 9000 并将其映射到本地系统端口 9000。

-v:将本地系统文件夹 D:/rd 挂载到 Docker 容器内。请注意,我们在上面的命令中使用了 /d/rd,/d/rd 是我们在 Docker VM 中创建的映射。我们将 /d/rd 映射到容器目录 /usr/src/app,该目录是在创建dockerapp镜像时创建的。请参阅 Dockerfile 中的 mkdir 命令。

dockerApp:将用于运行此实例的镜像名称。

-c:此处提到的命令将由 docker-engine 执行。在上面的命令中,我们导航到 service 文件夹,然后使用 nodemon 运行 server.js。

如果您希望手动运行命令,请将 –i 替换为 –it,您的命令看起来应该像这样。以下命令将在交互模式下运行容器。

docker run -it --name nodeservice -p 9000:9000 -v /d/rd:/usr/src/app dockerApp /bin/bash/

如果您多次运行 docker run,可能会看到一些错误,提示容器已存在。要查看所有正在运行的容器或其历史记录,请运行以下命令。

docker ps -a

要移除已停止的容器,您可以使用

docker rm dockerApp

现在,如果您在非 Hyper-V 系统上运行容器,请使用端口 9000 的 Docker Machine IP 查看托管在容器内的 Node 服务响应。如果您使用的是带有 Hyper-V 的计算机,请使用端口 9000 的本地 IP 查看输出。

您还可以使用 Kitematic 查看所有正在运行的应用程序、已拉取的镜像、停止/启动/重启容器、公开的端口/UI 和环境变量。但作为一名开发人员,我认为使用 CLI 执行所有命令和配置更令人放心和简单。

关注点

使用 Docker 这样的基于容器的技术,可以更简单、更快速地创建或重新创建可以打包或共享的环境。使用 Docker Hub,我们可以探索许多预配置的技术。这极大地缩短了配置时间,举个例子,使用 Docker,我们可以在 20 分钟内运行 TensorFlow(Google 的人工智能)。

我附上了 Docker 文件和 Server.js 供您试用。请随时分享您的反馈或建议。

参考

© . All rights reserved.