使用 Docker Swarm 模式扩展 ASP.NET Core 应用程序

发布日期:2026-07-12 19:11:03   来源 : 杭州电子商务研究院    浏览量 :0
杭州电子商务研究院 发布日期:2026-07-12 19:11:03  
0

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 秒的

以上内容来自杭州电子商务研究院推送
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据