使用 Docker Swarm 模式扩展 ASP.NET Core 应用程序
Docker Swarm 模式
从 Docker 1.12 开始,Docker 引擎附带一个内置的容器编排模块,称为 Docker Swarm 模式。最新的 Docker Swarm 模式令人兴奋,因为您不再需要处理复杂的网络配置、负载平衡器、服务注册表或证书生成和管理。新的 Docker 引擎使多主机和多容器编排变得简单,只需几个命令,您就可以为您的应用程序设置一个生产环境,该环境可以承受硬件故障并处理软件更新,并且不会停机。
随着 ASP.NET Core 的发布,.NET 开发人员将切换到容器作为默认部署模型,本文将向您展示如何使用 Docker 轻松构建、部署和扩展 ASP.NET Core 应用程序。
先决条件
我正在使用 Windows 10 机器进行开发,但您可以在 Mac 或 Linux 设备上使用 Visual Studio Code 和 Docker 按照本教程进行操作。
Windows 10 先决条件:
构建应用程序
我们首先创建一个非常简单的 ASP.NET Core Web API 项目。在 Visual Studio 中,转到“文件 > 新建项目 > .NET Core > ASP.NET Core Web 应用程序”。从 ASP.NET Core 模板中选择 Web API。我们将此应用程序命名为TokenGen。
创建项目后,转到Controllers文件夹并添加一个名为TokenController的新控制器,其内容如下:
namespace TokenGen.Controllers
{
[Route("api/[controller]")]
public class TokenController : Controller
{
[HttpGet]
public dynamic Get()
{
return new
{
Guid = Guid.NewGuid().ToString(),
Expires = DateTime.UtcNow.AddHours(1),
Issuer = Environment.MachineName
};
}
}
}
此代码在每次GET调用时生成一个新的 GUID(全局唯一标识符),指明到期日期和发行者。我们使用计算机名称来识别发行者。当您在容器内运行 ASP.NET Core 应用程序时,计算机名称将填充容器唯一标识符。因此,我们的代码将帮助我们确定我们的应用程序在哪个容器中运行。
将应用程序容器化
下一步是创建一个 docker 文件,这样我们就可以将应用程序构建到容器映像中。在根目录中,在.sln文件旁边,创建一个名为TokenGen.dockerfile的文件,其内容如下:
FROM microsoft/dotnet:latest
# Set environment variables
ENV ASPNETCORE_URLS="http://*:5000"
ENV ASPNETCORE_ENVIRONMENT="Development"
# Copy files to app directory
COPY /src/TokenGen /app
# Set working directory
WORKDIR /app
# Restore NuGet packages
RUN ["dotnet", "restore"]
# Build the app
RUN ["dotnet", "build"]
# Open port
EXPOSE 5000/tcp
# Run the app
ENTRYPOINT ["dotnet", "run"]
现在我们准备构建tokengen-img docker 镜像。打开 PowerShell,导航到项目根目录并执行构建命令:
docker build -t tokengen-img -f TokenGen.dockerfile .
此时 Docker 引擎将从Docker Hub拉取dotnet:latest镜像,复制/src/TokenGen文件并运行 dotnet CLI 命令,您将在 PS 输出中看到构建日志。
如果一切顺利,我们就可以首次从容器运行我们的应用程序了。使用以下 bash 命令启动 TokenGen 容器:
docker run --name tokengen -d -p 5000:5000 -t tokengen-img
让我们通过从 Powershell调用api/token端点来测试部署:
Invoke-RestMethod http://localhost:5000/api/token
你应该会收到如下回复:
guid expires issuer
---- ------- ------
90c629af-3d78-4b53-81b0-4be563985887 2016-08-09T14:21:11.326422Z 5d0a1f82371c
如果您还运行docker ps,您会注意到tokengen容器 ID 与api/token响应中的颁发者值相同。
我们现在可以使用以下命令停止并删除容器:
docker stop tokengen
docker rm tokengen
扩展应用程序
为了扩展我们的应用程序,我们首先需要启用 Docker Swarm 模式;通过在 PowerShell 中运行docker swarm init来执行此操作。
现在 Docker Swarm 模式已启用,我们将为 Swarm 创建一个任务并将我们的应用程序作为服务启动。service命令类似于docker run命令。您应该按照我们之前命名容器的方式命名您的服务,这样就可以轻松地使用scale来定位服务。
在 Docker Swarm 上创建并启动我们的新tokengen服务:
docker service create --publish 5000:5000 --name tokengen tokengen-img
现在如果我们运行docker service ls,我们可以检查我们的服务是否正在运行:
ID NAME REPLICAS IMAGE COMMAND
96lqd9bdvwhs tokengen 1/1 tokengen-img
如果我们使用Invoke-RestMethod https://localhost:5000/api/token从 PowerShell调用api/token端点,我们会得到相同的结果:
guid expires issuer
---- ------- ------
40afe497-ce14-4f65-936e-910c1490165a 2016-08-09T14:46:15.506Z df5197d48d32
是时候扩展我们的应用了。scale命令允许我们运行应用程序的副本。
docker service scale tokengen=3
运行docker ps将显示 3 个 tokengen 容器:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a87acd74a274 tokengen-img:latest "dotnet run" 41 seconds ago Up 35 seconds 5000/tcp tokengen.1.ayuux8p9ztip5uyappics17i7
debcdb4c7e9d tokengen-img:latest "dotnet run" 41 seconds ago Up 35 seconds 5000/tcp tokengen.2.7gh3immv1tu5as0w4ps4709ib
df5197d48d32 tokengen-img:latest "dotnet run" 8 minutes ago Up 8 minutes 5000/tcp tokengen.3.2g61t441iyuyehoafoelvkbik
现在我们可以看到 Docker Swarm 内置负载均衡器在工作。打开 3 个 PowerShell 窗口并运行Invoke-RestMethod https://localhost:5000/api/token:
guid expires issuer
---- ------- ------
0b36bb43-20f0-4183-a364-0c83894e79ac 2016-08-09T14:55:02.673038Z a87acd74a274
b74b4808-237e-406a-8a8b-f580dcc78225 2016-08-09T14:55:02.68909Z debcdb4c7e9d
92dd2f7b-e47d-4b1d-8192-141d307d276d 2016-08-09T14:55:02.691565Z df5197d48d32
如您所见,负载均衡器将我们的调用分发到所有 3 个副本。Docker Swarm 使用循环系统在容器之间进行负载平衡。
我们还可以缩小我们的服务规模,甚至通过缩小到 0 来停止它:
docker service scale tokengen=0
我们可以按照删除容器的相同方式(使用rm)删除该服务:
docker service rm tokengen
更新应用程序
使用 Docker Swarm,您可以无中断地对服务进行滚动更新。为了发布更新,我们首先需要对应用程序进行版本控制。
打开project.json,添加版本元素"version": "1.0.0-*"。现在我们需要使用版本号来标记 Docker 镜像。
在项目根目录中,在.sln文件旁边创建一个 PowerShell 脚本swarm-ver-deploy.ps1,其内容如下:
$serviceName = "tokengen"
# parse project.json and extract app version
$rootPath = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
$projectPath = "$rootPath\src\TokenGen\project.json"
$json = Get-Content -Raw -Path $projectPath | ConvertFrom-Json
$version = $json.version.Split("-")[0]
# tag docker image with app version
$imageName = "$serviceName-img:$version"
# build image
if(docker images -q $imageName){
"Image $imageName exists!"
return
}else{
docker build -t $imageName -f "$rootPath\TokenGen.dockerfile" $rootPath
}
# create service
docker service create --publish 5000:5000 --name $serviceName --replicas 3 --update-delay 5s $imageName
该脚本从project.json中读取版本,构建 docker 镜像tokengen-img:version,并创建tokengen服务。
请注意,我们使用update-delay参数为 Swarm 配置 5 秒的
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~