在Windows Server 2019通過Docker Compose部署Asp.Net Core


一、安裝Docker Enterprise

安裝文檔是: https://docs.docker.com/install/windows/docker-ee/

安裝完成后,如下圖

 

 

 

二、首先,拉取一個Windows的鏡像

這會將Microsoft的Nano Server Docker映像下載到您的環境中。該映像是最小的Windows服務器操作系統,打包后可作為Docker容器運行。您可以將其用作自己的應用程序的基礎,也可以直接從中運行容器。

docker image pull mcr.microsoft.com/windows/nanoserver:1809

 

三、然后運行一個簡單的容器測試

docker container run mcr.microsoft.com/windows/nanoserver:1809 hostname

這將從Windows Nano Server映像運行一個新容器,並告訴它運行hostname命令。輸出是容器的機器名稱,實際上是Docker設置的隨機ID。重復該命令,您將每次看到一個不同的主機名。

 

 

 

四、將鏡像推送到Docker Hub要先設置docker id(就是docker的賬號)

設置docker id

$dockerId = '<your-docker-id>'

 

 

 

五、測試生成DockerFile

Docker鏡像是通過docker image build命令使用一個名為Dockerfile的簡單腳本構建的。Dockerfile描述了應用程序及其所有依賴項的完整部署。

使用powershell生產DockerFile

'FROM mcr.microsoft.com/windows/nanoserver:1809' | Set-Content Dockerfile
'CMD echo Hello World!' | Add-Content Dockerfile

六、Build Image

現在運行docker image build,為圖像提供一個標簽,該標簽使用您的Docker ID進行標識:

docker image build --tag $dockerId/hello-world . 

注意:build后面的那個“.”是必須的。build的目錄要是有權限的,最好是新建一個文件夾。不然就算能正確生產DockerFile也build不成功。猜測這里應該是沒有管理員權限

 

 

 

七、運行容器

docker container run $dockerId/hello-world

 

 

八、推送鏡像到Docker Hub

現在,有了一個用於簡單Hello World應用程序的Docker映像。該映像是可移植單元-您可以將映像推送到Docker Hub,任何人都可以將其拉出並自己運行您的應用程序。

首先docker login使用您的憑據運行,以通過注冊表進行身份驗證。然后推送圖像:

docker image push $dockerId/hello-world

 

 

沒權限。。。先登陸

docker login -u 用戶名 -p 密碼

推送完了之后在我本地的windows上就可以看到如圖

 

 

可以嘗試本地拉取:

docker pull 13797054045/hello-world

 

九、使用Docker Compose部署

我拿了一個測試項目來做測試。先把項目通過git拉到了服務器上。

下載Docker Compose

Invoke-WebRequest https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Windows-x86_64.exe -UseBasicParsing -OutFile $env:ProgramFiles\docker\docker-compose.exe

寫DockerFile。我偷了個懶,通過VS自動生成的,然后修改的

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 8018  --我這里只改了端口

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
COPY ["Gas.Monitoring.Web/Gas.Monitoring.Web.csproj", "Gas.Monitoring.Web/"]
COPY ["Gas.Monitoring.Business.Application/Gas.Monitoring.Business.Application.csproj", "Gas.Monitoring.Business.Application/"]
COPY ["Gas.Monitoring.Business.Repository/Gas.Monitoring.Business.Repository.csproj", "Gas.Monitoring.Business.Repository/"]
COPY ["ZB.Infrastructure.Base/ZB.Infrastructure.Base.csproj", "ZB.Infrastructure.Base/"]
COPY ["ZB.Infrastructure/ZB.Infrastructure.csproj", "ZB.Infrastructure/"]
COPY ["Gas.Monitoring.Business.Domain/Gas.Monitoring.Business.Domain.csproj", "Gas.Monitoring.Business.Domain/"]
COPY ["ZB.Infrastructure.FileSystem/ZB.Infrastructure.FileSystem.csproj", "ZB.Infrastructure.FileSystem/"]
COPY ["ProjectBuilder/ProjectBuilder.csproj", "ProjectBuilder/"]
COPY ["Gas.Monitoring.MP.Application/Gas.Monitoring.MP.Application.csproj", "Gas.Monitoring.MP.Application/"]
COPY ["Gas.Monitoring.MP.Repository/Gas.Monitoring.MP.Repository.csproj", "Gas.Monitoring.MP.Repository/"]
COPY ["Gas.Monitoring.MP.Domain/Gas.Monitoring.MP.Domain.csproj", "Gas.Monitoring.MP.Domain/"]
COPY ["ZB.UEditor.Core/ZB.UEditor.Core.csproj", "ZB.UEditor.Core/"]
RUN dotnet restore "Gas.Monitoring.Web/Gas.Monitoring.Web.csproj"
COPY . .
WORKDIR "/src/Gas.Monitoring.Web"
RUN dotnet build "Gas.Monitoring.Web.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "Gas.Monitoring.Web.csproj" -c Release -o /app

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

然后修改后。這里我改的時候碰了不少壁啊。還好都解決了。

FROM microsoft/dotnet:2.2-aspnetcore-runtime-nanoserver-1809 AS base
WORKDIR /biogas
EXPOSE 8018

FROM microsoft/dotnet:2.2-sdk-nanoserver-1809 AS build
WORKDIR /src
COPY ["Gas.Monitoring.Web/Gas.Monitoring.Web.csproj", "Gas.Monitoring.Web/"]
COPY ["Gas.Monitoring.Business.Application/Gas.Monitoring.Business.Application.csproj", "Gas.Monitoring.Business.Application/"]
COPY ["Gas.Monitoring.Business.Repository/Gas.Monitoring.Business.Repository.csproj", "Gas.Monitoring.Business.Repository/"]
COPY ["ZB.Infrastructure.Base/ZB.Infrastructure.Base.csproj", "ZB.Infrastructure.Base/"]
COPY ["ZB.Infrastructure/ZB.Infrastructure.csproj", "ZB.Infrastructure/"]
COPY ["Gas.Monitoring.Business.Domain/Gas.Monitoring.Business.Domain.csproj", "Gas.Monitoring.Business.Domain/"]
COPY ["ZB.Infrastructure.FileSystem/ZB.Infrastructure.FileSystem.csproj", "ZB.Infrastructure.FileSystem/"]
COPY ["ProjectBuilder/ProjectBuilder.csproj", "ProjectBuilder/"]
COPY ["Gas.Monitoring.MP.Application/Gas.Monitoring.MP.Application.csproj", "Gas.Monitoring.MP.Application/"]
COPY ["Gas.Monitoring.MP.Repository/Gas.Monitoring.MP.Repository.csproj", "Gas.Monitoring.MP.Repository/"]
COPY ["Gas.Monitoring.MP.Domain/Gas.Monitoring.MP.Domain.csproj", "Gas.Monitoring.MP.Domain/"]
COPY ["ZB.UEditor.Core/ZB.UEditor.Core.csproj", "ZB.UEditor.Core/"]
RUN dotnet restore "Gas.Monitoring.Web/Gas.Monitoring.Web.csproj"
COPY . .
WORKDIR "/src/Gas.Monitoring.Web"
RUN dotnet build "Gas.Monitoring.Web.csproj" -c Release -o /biogas/build

FROM build AS publish
RUN dotnet publish "Gas.Monitoring.Web.csproj" -c Release -o /biogas/publish

FROM base AS final
WORKDIR /biogas
COPY --from=publish /biogas/publish .
ENTRYPOINT ["dotnet", "Gas.Monitoring.Web.dll"]

這樣改的好處是我服務器上是不用下任何環境的,.Net Core SDK和Runtime都在容器里面了。

然后,編寫docker-compose.yml。因為我這里只有一個項目,比較簡單。唯一要說的是空格要注意!!!

version: '3.4'

services:
    biogas:
      image: biogas
      build:
        context: .
        dockerfile: Gas.Monitoring.Web/Dockerfile
      ports:
        - "8018:8018"

順便貼一個多項目的

version: '3.4'

services:
    yopm:
      image: yopm
      build:
        context: .
        dockerfile: YO.PM.Web/Dockerfile
      ports:
        - "8081:8081"

    yopmclub:
      image: yopmclub
      build:
        context: .
        dockerfile: YO.Clubs.Web/Dockerfile
      ports:
        - "8082:8082"

CD到你的項目目錄執行命令

docker-compose build

 

 

然后再執行

docker-compose up -d

 

最后來Check一下是不是成功了

 

 emmmm……好像還挺簡單哈!我自己摸索了兩天才搞出來,太菜了。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM