【Azure DevOps系列】Azure DevOps使用Docker將.NET應用程序部署在雲服務器

Docker持續集成

本章咱們要實現的是經過咱們往代碼倉庫push代碼後,咱們將每次的push進行一次docker自動化打包發佈到docker hub中,發佈到以後我將進行部署環節,咱們將經過ssh方式將咱們的.NET應用程序pull並run到咱們的雲服務器上。docker

Dockerfile 以下所示:ubuntu

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

pipeline配置

這個環節咱們將推送docker鏡像到dockerhub中,關於pipeline的配置能夠參考一下前兩章對於dockerhub推送都有介紹服務器

# ASP.NET Core
# Build and test ASP.NET Core projects targeting .NET Core.
# Add steps that run tests, create a NuGet package, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core

trigger:
- demo04

pool:
  vmImage: 'ubuntu-latest'

variables:
  buildConfiguration: 'Release'

steps:
- task: UseDotNet@2
  inputs:
    packageType: 'sdk'
    version: '3.x'
    
- task: DotNetCoreCLI@2
  inputs:
    command: 'restore'
    feedsToUse: 'select'

- task: DotNetCoreCLI@2
  inputs:
    command: 'build'

- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
    
- task: Docker@2
  inputs:
    containerRegistry: 'DockerHub'
    repository: '$(repository)'
    command: 'buildAndPush'
    Dockerfile: 'WebApplication1/Dockerfile'
    buildContext: '.'
    tags: 'latest'

在雲服務上自動部署應用程序

第一步咱們須要先去service connection中區建立一個ssh的鏈接信息,以用於後續的操做。app

file

接下來咱們須要建立一個 release pipeline 用於咱們部署的操做,以下圖所示:less

file

下圖的四個task向咱們展現了部署階段的操做步驟.ssh

file

  • 刪除容器

咱們先去看咱們服務器當中的容器是否存在,若是該容器不存在則咱們跳出該操做,若是存在咱們則去刪除指定的容器.ui

#判斷是否存在containername容器
docker ps | grep containername&> /dev/null
#若是存在,則Remove
if [ $? -ne 0 ]
then
    echo "containername container not exist continue.. "
else
    echo "remove  containername container"
    docker rm  containername -f
fi
  • 刪除鏡像

查看服務器指定的鏡像是否存在,若是不存在則跳出該操做,不然咱們將刪除指定的鏡像this

#判斷是否存在name鏡像
docker images | grep name&> /dev/null
#若是不存在,則跳出
if [ $? -ne 0 ]
then
    echo "image does not exist , continue..."
else
    echo "image exists !!! remove it"
    docker rmi --force name
fi
  • 拉取鏡像

拉取指定的鏡像到服務器debug

docker pull hueifeng/test:latest
  • 運行鏡像

運行拉取的鏡像hueifeng/test,並將其命名爲name,對外開放端口8108端口.rest

docker run --restart unless-stopped -p 8108:80 --name name -d  hueifeng/test

Other

推薦閱讀的Azure DevOps教程

https://docs.microsoft.com/zh-cn/azure/devops

相關文章
相關標籤/搜索