如何将docker化的.NET Core应用部署到Azure容器实例上

444 阅读8分钟

本教程包括

  1. 对ASP.NET Core应用程序进行Docker化
  2. 创建持续部署配置以构建和部署容器镜像
  3. 将.NET Core应用部署到Azure容器注册处

在本教程中,你将学习如何用Docker构建一个自定义的ASP.NET Core容器,并将容器镜像托管在Azure容器注册中心,这是一个由微软拥有的平台,允许你在一个私有注册中心构建、存储和管理容器镜像。

在本教程结束时,你将能够应用在此获得的知识,将你在微软Azure注册表上的容器镜像与Web应用服务联系起来,并启动你的应用。你将学会如何确保由于对你的代码库所做的修改而构建的每一个新的容器镜像都能自动更新应用程序。

为了实现这一目标,我们将

  • 创建一个注册表,在Azure容器注册表(ACR)上托管我们的容器镜像,并获得访问密钥
  • 为该项目创建一个容器镜像,并在本地构建和运行该容器
  • 将Docker镜像发布到创建的Azure容器注册处
  • 创建一个Azure网络应用,并将其与已发布的容器镜像连接起来
  • 启用持续部署,并创建一个配置文件,在CircleCI上构建和部署我们的容器镜像
  • 将项目推送到GitHub并与CircleCI连接
  • 将容器镜像部署到Azure容器注册中心

先决条件

本教程需要以下条件。

克隆演示项目

在本节中,你将从GitHub的仓库中克隆本教程的演示项目。在终端上,运行。

git clone https://github.com/yemiwebby/docker-dotnet-api.git

一旦这个过程完成,你就会把项目下载到一个docker-dotnet-api 。我们将着手设置一个容器注册表,以托管将为我们的项目生成的容器镜像。

创建一个Azure容器注册中心

Azure容器注册表存储了这个项目的镜像。要创建它,请到Azure门户主页上,点击创建资源。然后选择容器>容器注册表

Create Resource

在注册表创建页面,我使用了dotnetcoreapi 。你可以使用任何你想要的名字;只要记住在你跟随教程时使用它而不是我的。接下来,输入注册表所需的细节。

Create container registry

点击审查+创建。你将被转到一个页面,在那里你可以审查注册表的信息。然后,点击创建来设置一个新的注册表实例。

从注册表获取访问密钥

在本节中,你将在Azure容器注册表中启用Docker访问。这对部署过程至关重要,因为它可以让你通过CLI远程登录到Azure容器注册中心,并向其推送镜像。

要启用Docker访问,请打开注册表,进入设置部分,点击访问密钥

这将显示注册表名称和登录服务器。使用切换按钮启用管理员用户。然后,复制用户名和任何一个密码,最好是第一个密码。把这个放在手边,因为在本教程的后面你会需要它。

Enable Admin and copy access key

容器化应用程序

接下来,你将使用已经包含在克隆项目中的自定义Docker文件来构建一个容器镜像。Docker文件中有安装项目的所有依赖项、构建项目和运行项目的必要命令。进入应用程序的根目录,打开Dockerfile,并确保它有这些内容。

# Build Stage
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY . ./
RUN dotnet restore
RUN dotnet publish -c Release -o out
    
    
# Serve Stage
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build /src/out .
ENTRYPOINT [ "dotnet", "docker-dotnet-api.dll" ]

上面的文件中指定了两个不同的阶段。

  • Build 使用.NET SDK来安装任何所需的依赖项,并在发布到名为 .NET的文件夹之前构建项目。out
  • Serve 使用ASP.NET Core运行时图像,从指定的工作目录中运行应用程序,在这种情况下是 。app

这有时被称为多阶段的Docker文件。它将开发和生产指令结合到一个Dockerfile中,并在这个过程中减少了复杂性。

构建Docker镜像

在这一节中,你将使用上一步骤中的注册表URL来构建项目的Docker镜像。运行下面的命令。

docker build -t dotnetcoreapi.azurecr.io/dotnet-api:latest .

注意: dotnetcoreapi.azurecr.iodotnet-api 替换为你为注册表URL和登录服务器详细信息选择的名称。

根据应用程序的内容和Docker文件,该命令将构建容器镜像。因为它使用了你之前创建的注册表名称和登录服务器,它将很容易将容器镜像与Azure容器注册表进行映射。

Building Docker Image

在本地运行Docker镜像

现在你已经构建了本地版本的容器镜像,通过运行下面的命令来确保它的运行。

docker run -d -p 5001:80 dotnetcoreapi.azurecr.io/dotnet-api

该命令在后台运行容器,将容器ID打印到终端,并在端口5001 上运行应用程序。访问http://localhost:5001/api/weather ,查看它。

App running on Docker locally

将Docker镜像部署到Azure容器注册中心

下一步是登录Azure容器注册中心,并将容器镜像推送给它。在终端上,运行。

docker login -u DOCKER_USER -p DOCKER_PASS dotnetcoreapi.azurecr.io

如果需要的话,将dotnetcoreapi.azurecr.io 替换成你的注册处URL。然后,用适当的值替换下面的占位符。

  • DOCKER_USER 是容器注册处的用户名。
  • DOCKER_PASS 是容器注册表的密码。

登录后,通过运行推送镜像到Azure注册表。

docker push dotnetcoreapi.azurecr.io/dotnet-api:latest

该镜像将被部署到Azure注册表。

为容器创建一个Web应用服务

接下来,你需要创建一个Azure Web App,并将其与容器镜像连接。进入Azure门户主页,点击创建一个资源

然后选择容器>容器的Web App,创建一个新的Web App服务实例。

你将会被转到创建Web App页面。选择一个Azure订阅和一个资源组。如果你没有资源组,就创建一个新的资源组。请确保选择默认的Docker container

Creating web app

Docker标签,选择镜像源和它的Docker镜像。

Select container image

点击审查+创建。你会被转到一个页面,在那里你可以审查网络应用的细节。点击创建来设置一个新的Azure网络应用。

你可以访问网址https://dotnet-core-api.azurewebsites.net/api/weather ,查看部署在Azure上的应用。

在Azure上设置持续部署

每次更新Docker镜像时,你都希望应用能收到更新。为了确保这种情况发生,你需要为网络应用程序服务启用持续部署。

点击网络应用程序名称,然后转到部署部分。单击部署中心,然后向下滚动 "设置 "选项卡。通过选择持续部署的单选按钮来打开它。点击保存

Enable continuous deployment

选择了持续部署后,每次在Azure容器注册中心重建Docker镜像时,网络应用都会触发新的.NET Core应用部署。

使用CircleCI进行自动部署

你的下一步是为CircleCI添加管道配置。这个配置将自动测试和运行命令,以构建和推送容器镜像到Azure容器注册中心。

在你项目的根部,打开.circleci/config.yml 文件,用这些内容更新它。

version: 2.1
orbs:
  docker: circleci/docker@2.1.2
jobs:
  build-docker-image:
      executor:
        name: docker/docker
        tag: "3.6"
      steps:
        - checkout
        - docker/install-docker-tools
        - setup_remote_docker:
            docker_layer_caching: true
        - run:
            name: Build and push Docker image
            command: |
              docker build -t dotnetcoreapi.azurecr.io/dotnet-api:latest .
              docker login -u $DOCKER_USER -p $DOCKER_PASS dotnetcoreapi.azurecr.io
              docker push dotnetcoreapi.azurecr.io/dotnet-api:latest
workflows:
  build-and-deploy:
    jobs:
      - build-docker-image

这些脚本从CircleCI拉入Docker orb。它们使用其执行器来安装Docker所需的工具,以构建并推送镜像到Azure容器注册中心。

在GitHub上建立一个存储库,并将项目链接到CircleCI。

与CircleCI连接

登录到您的CircleCI账户。如果你用你的GitHub账户注册,你所有的仓库将在你的项目的仪表板上可用。搜索docker-dotnet-api 项目。

Select project

点击Set Up Project按钮。你会被提示你是否已经在你的项目中定义了CircleCI的配置文件。输入分支名称(在本教程中,我们使用main )。点击Set Up Project按钮,完成该过程。

这次构建会失败,因为它需要Azure Container Registry的凭证,而你还没有添加它们。

Build failed

创建环境变量

为了解决凭证问题,点击项目设置按钮,然后点击环境变量。添加这两个新的变量。

  • DOCKER_USER 是容器注册表的用户名
  • DOCKER_PASS 是容器注册表的密码。

点击从开始重新运行工作流

Build successful

你的工作流将成功运行。你可以在本地对代码库做一些修改,并将其推送到GitHub,以进一步测试持续部署过程。

这就是了!

进入网址,查看实时应用程序。https://dotnet-core-api.azurewebsites.net/api/weather.

View App live on Azure

注意: 请注意,你在Microsoft Azure上的URL应该与上面显示的不同。

总结

你刚刚学会了如何轻松地对ASP.NET Core应用程序进行dockerize,将容器镜像部署到Microsoft Azure容器注册中心,并在Web服务上启动它。

通过在Azure网络应用程序上启用持续部署,你可以确信,一旦你将容器镜像的新版本推送到注册表上,该应用将始终自动更新。