將.net framework 4 部署在docker中的全過程(支持4.0 到 4.8,3.5應該也可以)


前言:

docker自從誕生之初,就是運行在linux系統中,后來windows上也可以運行docker了,但是微軟是通過自身的hyper-v技術,在你的windows系統中虛擬出來了一個小的linux虛擬主機,在它上面跑了個docker環境讓你用,從而使你感覺到像是在windows上運行docker一樣,但是其鏡像還是運行在linux container中。

后來微軟也出了自己的windows container來運行windows平台下的代碼,例如支持.net framework,且.net framework 只能運行在windows container下,不能運行在linux container下。若強行在linux container下拉去windows container的鏡像會報錯:no matching manifest for linux/amd64 in the manifest list entries.

我們可以使用docker exec 進入容器內部看看

windows 容器:

 

 這些目錄是不是很熟悉~~~~   一個小的windows系統,對於不跨平台的.net framework是無法跑在其中的。

 

 

正文

1、在windows上部署docker環境

下載安裝這個小鯨魚,直接可以部署docker環境的可視化工具。desktop docker 僅僅支持win10 pro 或 win10 專業版,並不支持其他windows版本,我使用win10家庭版安裝后,發現只能使用linux container,無法切換windows container。這是一個大坑

下載地址:      docker-desktop

 安裝完成后,用powshell。輸入命令 docker --version

 證明以安裝成功

因為我們要使用windows container,所以記得右鍵托盤中的小鯨魚切換。

 

成功后,可以先嘗試跑一個官方的demo

docker run -it --rm -p 8000:80 --name aspnet_sample mcr.microsoft.com/dotnet/framework/samples:aspnetapp

微軟官方操作文檔     https://docs.microsoft.com/en-us/aspnet/mvc/overview/deployment/docker-aspnetmvc

但是我在操作過程中,還是遇到了一些坑。

2、創建一個.net framework4.0 項目,並為其添加dockerfile

簡簡單單寫個demo,只添加了一個WebForm1.aspx頁面。然后對着項目右鍵=>添加=>docker支持 生成Dockerfile(若沒有docke支持,只需要自己手動建一個同名文件即可),將其資源類型設為始終復制。右鍵發布!

 

 

 來到發布后的文件夾中

 

 

 

 此處有個關於dockerfile位置的大坑,一定要注意文件夾的位置,在.netcore中Dockfile和****.csproj在同一目錄下是沒問題的,但是.net framework又寫奇怪,一定要改為如下的目錄結構

 

 

 

 

 

 

 也就是說將Dockerfile提到上一層中,不然COPY命令無法找到本地資源。(我也不知道為啥) 

ps:Dockerfile中的COPY命令:   COPY [本地host文件地址]  [鏡像內的要存放的文件地址]     也就是說將本地的發布文件復制到鏡像內去。

 

打開這里的Dockerfile進行編寫

 

 

 內容如下:

FROM microsoft/aspnet                   (運行.net framework的基礎鏡像,其中包括sdk  和 iis,以為.net framework不像.netcore有kerstrel支持其自己跑起來,所以必須要有個iis來輔助,這個鏡像中的iis僅支持64的發布程序,不支持32位)
WORKDIR /inetpub/wwwroot           (鏡像中發布文件的存放地址,這個地址不能變。)

COPY net40 .          (傳輸文件到鏡像中,我的這個"net40"對應Dockerfile同級的發布文件的文件夾。  文件目錄一定不能錯)

 

若目錄層級不對,會報錯 COPY failed: file not found in build context or excluded by .dockerignore

3、創建鏡像

打開powshell,進入Dockerfile所在目錄,輸入命令創建鏡像

docker build . -t net40             

 

 

 如果你第一次拉去這個aspnet的鏡像會非常慢,建議更換鏡像源。      https://mirror.baidubce.com  這個是百度的鏡像源

 

 

 等待完成后,使用命令將鏡像運行起來

docker run -it -d -p 8040:80 net40           

-d 后台運行

-p 暴漏出的端口     8040:40 將鏡像中的80端口映射到本地的8040端口,framework默認運行在鏡像中的iis上的就是80端口,無需代碼中修改

net40  是上述image鏡像的名字

 

4、瀏覽器預覽

打開本地瀏覽器,localhost:8040/WebForm1.aspx

 

 成功

 

 如果報錯404 或者 403 , 那一定是copy命令或目錄層級的問題,使用docker exec進入到容器/inetpub/wwwroot中,多半是空的

 

5、log日志寫在本地,需要持久化問題

對於.net framework項目,多半是老項目,日志文件一般都會寫在本地,但如果鏡像重啟或刪除,日志文件也隨之消失。

解決此問題可以使用docker volume掛載卷,將/inetpub/wwwroot下的代碼都掛載在一個本機的文件夾下,這樣就不會丟失了,具體命令

docker run  -it -d -p 8040:80 -v D:\share\Net40\net40:C:\inetpub\wwwroot test40

D:\share\Net40\net40 本機地址,持久化的地址
C:\inetpub\wwwroot docker鏡像中的地址    '\inetpub\wwwroot'  與上述WORKDIR地址對應


免責聲明!

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



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