Linux下使用docker部署發佈後的netcore(四)

Linux下使用docker部署前後分離netcore webapi項目、前端vue頁面、Mysql、Redis、SQLite

說明

這篇文章是爲了記錄公司的項目部署過程,方便給其他運維人員查閱,我對linux的詳細操作談不上非常精通,如果只是想了解實戰項目的部署流程可以查看這篇文章。本文介紹了linux下使用docker的基本操作、使用docker部署netcore webapi項目、vue項目、Mysql、Redis、SQLite。我們先是一步一步部署,之後會採用docker-compose一步生成多種環境。 本人能力有限,底層的東西講不清楚,但是會把遇到的問題的解決辦法分享出來供大家查閱。廢話不多說,直接整。

前面我們說到了怎麼講程序複製到服務器,在服務器上進行編譯發佈,這次我們來處理一下在VS上發佈後的程序怎麼部署到服務器上。

DockerFile組成

我們知道使用docker部署netcore應用程序需要DockerFile文件,DockerFile文件的結構分爲四塊,分別是:

  1. 第一部分
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim AS base
WORKDIR /app   #這裏我們在鏡像中創建了一個 /app 路徑作爲我們程序在鏡像中的工作目錄
COPY /app
EXPOSE 80   #將 80 端口暴露給 Docker,從而可以使我們在鏡像外面通過端口訪問到當前鏡像中的運行的程序
EXPOSE 443
ENTRYPOINT ["dotnet", "DataVisualization.dll"]
複製代碼

我們在鏡像中創建了一個 /app 路徑作爲我們程序在鏡像中的工作目錄,同時,將 80 端口暴露給 Docker,從而可以使我們在鏡像外面通過端口訪問到當前鏡像中的運行的程序。

  1. 第二部分
FROM mcr.microsoft.com/dotnet/core/sdk:2.1-stretch AS build
WORKDIR /src
COPY ["DataVisualization/DataVisualization.csproj", "DataVisualization/"]
RUN dotnet restore "DataVisualization/DataVisualization.csproj"
COPY . .
WORKDIR "/src/DataVisualization"
RUN dotnet build "DataVisualization.csproj" -c Release -o /app/build

因爲我們的應用是一個多層架構的單體應用,最終的 MVC 項目依賴於解決方案中的各個類庫以及我們從 Nuget 中下載的各種第三方組件,在部署時,需要將這些組件打包成 dll 引用。所以,這裏我們需要使用 .NET Core SDK 中包含的 .NET Core CLI 進行還原和構建。

就像在上面的代碼中,我們在鏡像的內部創建了一個 /src 的路徑,將當前解決方案下的類庫都複製到這個目錄下,之後通過 dotnet restore 命令還原我們的主程序所依賴的各個組件。當我們還原好依賴的組件後,就可以使用 dotnet build 命令生成 Release版本的 dll 文件,同時輸出到之前創建的 /app/build 路徑下。

  1. 第三部分
FROM build AS publish
RUN dotnet publish "DataVisualization.csproj" -c Release -o /app/publish

上面一步可以看成我們在使用 VS 生成 Release 版本的解決方案,當生成沒有出錯之後,我們就可以進行程序的發佈。

  1. 第四部分
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DataVisualization.dll"]

當已經生成發佈文件之後,按照我們平時部署在 Windows 上的過程,這時就可以通過 IIS 部署運行了,因此,構建我們應用鏡像的最後一步就是通過 dotnet 命令執行我們的程序。

一般添加Docker支持都會出現這種文件結構的DockerFile,我們可以把整個項目拷貝到服務器,使用DockerFile進行編譯,參考之前寫的Linux下使用docker部署netcore(一)
但是在我們實際應用場景中可能會涉及項目安全、項目過大之類的情況,可就會出現編譯後、發佈後的項目進行部署的情況,接下來介紹怎麼部署我們編譯、VS發佈後的項目。

部署編譯後、VS發佈後的項目

首先我們需要修改DockerFile,因爲我們不需要它來編譯處理了,也就是第二、第三部門就可以完全省略掉了。所以我們只需對這部門進行刪除即可,刪除後的文件是這樣的:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim
WORKDIR /app   
COPY . /app
EXPOSE 80   
ENTRYPOINT ["dotnet", "DataVisualization.dll"]

需要注意的是,我將這裏的註釋都去掉了,因爲在服務器中會出現亂碼的情況

接下來我們就可以將我們的發佈項目打包壓縮,使用FTP或者其它工具,我直接使用的rz命令進行上傳到服務器的操作。
創建項目目錄、解壓編譯後的項目。(這兩步操作可以參考Linux下使用docker部署netcore(一)
之後我們定位到DockerFile所在的文件夾中,使用命令創建鏡像:

docker build -t mynetcore:1.1 .

1.1:代表你的鏡像版本,可以寫也可以不寫
. :代表當前目錄,目的是讓程序找到你的DockerFile

查看鏡像:

docker images

在這裏插入圖片描述
鏡像創建成功了,之後我們運行起來我們的鏡像:

docker run --name=datavisual2 -d -p 8056:80 -v ~/datavisual2/PublishDocker:/app mynetcore:1.1

注意此處-v,將冒號前面的文件掛載到服務器宿主機上(冒號後面的app需要跟DockerFile上一致),便於後續更改時,可以直接重啓生效

之後使用下面的命令查看容器是否運行起來,STATUS爲Up時代表成功,就可以直接訪問了。

docker ps -a 

在這裏插入圖片描述

最後我要補充一下我遇到的問題,當我們在運行容器(docker run)的時候,加的文件掛載還是很有必要的,雖然你不加他他也可以運行,但是我遇到一個問題,就是當你在服務器上修改一些配置的時候,重新啓動容器,修改後沒有作用,詳細的原因應該是修改的位置不對,所以我們需要使用程序的掛載,以我淺顯的理解就是告訴服務器,你就讀取我告訴你的文件路徑下的東西,就別瞎找了。所以你修改配置的時候,服務器纔會正確讀取你的配置。

修改配置之後需要重啓服務器,命令是:

docker restart datavisual2 #可以是容器ID或容器名字

就這樣,有問題留言,只要我看到並且我瞭解的一定回覆!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章