1. 程式人生 > >【Azure DevOps系列】Azure DevOps使用Docker將.NET應用程式部署在雲伺服器

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

## Docker持續整合 本章我們要實現的是通過我們往程式碼倉庫push程式碼後,我們將每次的push進行一次docker自動化打包釋出到docker hub中,釋出到之後我將進行部署環節,我們將通過ssh方式將我們的.NET應用程式pull並run到我們的雲伺服器上。 Dockerfile 如下所示: ``` #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的連線資訊,以用於後續的操作。 ![file](https://blog.stackable.cn/uploads/img-a99c839e-58f4-4871-9583-891c0e31db95.png) 接下來我們需要建立一個 release pipeline 用於我們部署的操作,如下圖所示: ![file](https://blog.stackable.cn/uploads/img-1312462f-4922-498d-bb9d-069d9c4c2be9.png) 下圖的四個task向我們展示了部署階段的操作步驟. ![file](https://blog.stackable.cn/uploads/img-2c534180-9ec7-4827-9e2c-9b44d028ae94.png) - 刪除容器 我們先去看我們伺服器當中的容器是否存在,如果該容器不存在則我們跳出該操作,如果存在我們則去刪除指定的容器. ``` #判斷是否存在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 ``` - 刪除映象 檢視伺服器指定的映象是否存在,如果不存在則跳出該操作,否則我們將刪除指定的映象 ``` #判斷是否存在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 ``` - 拉取映象 拉取指定的映象到伺服器 ``` docker pull hueifeng/test:latest ``` - 執行映象 執行拉取的映象`hueifeng/test`,並將其命名為`name`,對外開放埠`8108埠`. ``` docker run --restart unless-stopped -p 8108:80 --name name -d hueifeng/test ``` ## Other 推薦閱讀的Azure DevOps教程 [https://docs.microsoft.com/zh-cn/azure/devops](https://docs.microsoft.com/zh-cn/azure/devops/?view=azure-devops&WT.mc_id=AZ-MVP-5003855)