【.Net Core】將應用部署至Docker上

.Net Core的橫空出世,讓.Net擺脫以往只能在Windows系統上執行的情況,如今不論是Windows、Linux甚至是Mac上都可以執行,但當實際開發完成要進行部署後,才發現又是一個麻煩的開始,好加在他也支援部署到Docker上執行。

本文實作環境如下:

  • Visual Studio Mac Version
  • .Net Core 3.1
  • Docker on Synology NAS

#建立 Dockerfile

在 Visual Studio 內對專案目錄點擊右鍵,選擇新增,會看到新增 Docker 支援。點選之後,IDE 會自動產出 Dockerfile 出來。

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 ["project.csproj", ""]
RUN dotnet restore "./project.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "project.csproj" -c Release -o /app/build

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

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

只是這個自動產出的 Dockerfile 可能還無法直接使用:

  1. csproj 檔案的路徑並不正確
    一但檔案路徑不正確,在執行這個 Dockerfile 的時候就會因為找不到檔案而錯誤終止 (File not exitst) 。
  2. 引用的 SDK 版本錯誤
    由於我的專案是 .Net Core 3.1 ,但他產出的 Dockerfile 卻是幫我引入 .Net Framework 3.1 的 SDK,這會造成在執行這個 Docker 的時候產生找不到 SDK 的錯誤,所以也要依照自己專案的版本去做修正。根據微軟官方的文件, SDK 的 Image 可以分為幾種:
  • runtime:{version}
    .NET 多重架構:支援 Linux 和 Windows Nano Server,視 Docker 主機而定。
  • aspnet:{version}
    ASP.NET Core 多架構:支援 Linux 和 Windows Nano Server,視 Docker 主機而定。aspnetcore 映像有幾項針對 ASP.NET Core 所做的最佳化。
  • aspnet:{version}-buster-slim
    .NET 5 執行時間-僅適用于 Linux Debian 發行版本
  • aspnet:{version}-nanoserver-1809
    僅限 .NET 執行時間-僅限 Windows Nano Server (Windows Server 1809 版)

#產生 Docker Image

當 Dockerfile 搞定之後,就可以來 Build Docker Image 了,用終端機切換到專案底下( Dockerfile 的所在位置),因為我要部署的 Nas 上,而且專案本來就有同步到 Nas 上,所以直接用終端機 SSH 登入進去 Nas,然後一樣切到專案資料夾底下,並執行建置動作:

docker build -t {project name} ./
建置 Docker Image

#部署Docker

Docker Image 建置完成後就可以把部署起來,這邊 Synology 的 Nas 有提供 GUI 的操作,所以我就直接在系統上做操作,設置對應的 Port Number 之後就可以執行了。

寫這篇只是為了記錄一下怎麼把 .Net Core 的專案部署到 Docker 上面,不然每次要用到又要上網找一堆文,是說有 .Net Core 之後要給客戶 Demo 就方便多了,可以把 AWS 退掉了,有一台 Nas 就可以搞定了!