在Docker容器中執行現有的.Net Framework應用程式不需要對應用程式進行任何修改,我們需要建立包含應用程式的Docker映象,然後啟動容器即可。本篇主要講解如何在Docker容器中執行ASP.NET MVC應用程式。
生成Asp.Net MVC 應用程式
開啟VS建立一個ASP.NET Web Application(.NET Framework),如圖Image-1所示:
開啟Index.cshtml,修改裡面的內容如圖Image-2所示:

直接執行application,如圖Image-3所示:

釋出應用程式(大家可以理解成為應用程式打包)
在vs中右鍵單擊web專案,然後在彈出的menu中選擇Publish,彈出如圖Image-4所示的對話方塊:

選擇Custom,彈出如圖Image-5所示對話方塊,填寫custom的profile name:

點選OK button,彈出如圖Image-6所示對話方塊,Publish method選擇File System,Target location選擇你想要publish的地址:

點選Next button,彈出如圖Image-7所示的對話方塊,勾選Precompile during publishing,官方給的解釋是:This optimization means that you'll be compiling views in the Docker container, you are copying the precompiled view.:

點選Next Button然後點選Publish,在VS的控制檯中我們會看到如圖Image-8所示的內容,表示publish成功:

可以通過訪問我們之前指定的publish location來看publish的包結果,如圖Image-9所示:

新增Dockerfile檔案
對dockerfile陌生的小夥伴可以檢視(在Docker容器中執行.Net Framework控制檯應用程式)文章中對Dockfile的解釋。
在Dockerfile檔案中我們新增如下兩行命令:
FROM microsoft/aspnet
通過FROM指令來指定我們所要使用的基本映象
COPY /PublishOutput/ /inetpub/wwwroot
通過COPY來將我們publish的包copy到container中
此Dockerfile不需要包含ENTRYPOINT指令。使用IIS執行服務時,IIS程式是入口點,配置為aspnet基本映象中啟動。
建立映象(Image)
開啟cmd命令列工具,進入到Dockerfile所在的資料夾,鍵入如下命令:
docker build -t hellodockerweb:v1 . 如下圖Image-10所示:

docker通過build指令來建立映象(Image), build 指令後的-t 表示的是指定當前Image的Tag,大家可以理解成Image的Name,映象名稱冒號後面的v1大家可以理解成當前Image的版本號,如果不指定的話預設會為latest,最後的. 表示的是Dockerfile所在的當前目錄。上面的指令可以理解成基於Dockerfile建立一個v1版本的名為hellodockerweb的映象。執行該命令會得到如下圖Image-11所示的結果:

截圖中顯示了Dockerfile中我們所寫的兩個指令的執行情況,最後會提示你Image建立成功。如果大家是第一次執行FROM microsoft/aspnet指令,docker daemon會去docker registry中拉取該基映象,這個過程相當於下載該映象到本地,執行起來會慢一些,大家不要著急。
我們通過docker images指令來檢視建立的映象,如下圖Image-12所示:

執行容器
通過執行指令docker run -d -p 9000:80 --name hellodockerwebcontainer hellodockerweb:v1 來執行容器,結果如圖Image-13所示,返回的是當前Container的ID,我們可以在地址C:\ProgramData\Docker\windowsfilter\ 中找到該容器:

該指令表達的意思是基於hellodockerweb:v1映象在detached模式下執行一個名為hellodockerwebcontainer的容器,並且將宿主機器的9000埠與容器的80埠進行對映
指令中的-d表示在detached mode(detached mode大家可以理解成讓容器在後臺執行)下執行Image,docker image執行時與shell斷開連線。這樣的話所有對容器的操作類似網路連線,共享操作等等都不會再接受命令列的命令控制。
指令-p表示將當前宿主機器的9000埠與容器的80埠進行對映,這樣的話對外我們通過9000埠就可以訪問到80埠了
後臺執行與前臺執行的區別:
當container執行在後臺模式,所有I/O資料只能通過網路資源或者共享卷組來進行互動。因為container不再監聽執行docker run的這個終端命令視窗。但是我們可以通過執行docker attach來重新掛載這個container。
當container執行在前臺模式,docker會啟動這個container,同時將當前的命令列視窗掛載到container的標準輸入,標準輸出和標準錯誤中。也就是container中所有的輸出,我們都可以在當前視窗中檢視到。甚至docker可以虛擬出一個TTY視窗,來執行訊號中斷,這些都是可以通過命令配置的。
瀏覽器中訪問ASP.Net MVC 站點
容器啟動後,可以通過http://locahost:9000 來訪問當前執行的站點,如圖Image-14所示:

還有另外一種訪問方式,即通過container執行的IP+Port的方式訪問:http://{IP}:{Port}, 其中IP為container的IP,Port為container暴露的埠,不指定的話預設暴露的是80埠,我們可以通過如下指令獲取到container的IP:
docker inspect -f '{{.NetworkSettings.Networks.nat.IPAddress}}' container-name 如圖Image-15所示:

可以通過訪問地址http://cotainerip 來訪問當前執行的站點,如圖Image-16所示:

以上便完成了容器化Asp.Net MVC Web應用程式,希望這個簡單的例子能幫助大家進一步瞭解docker相關的基礎知識,docker中提供了很多指令,大家可以通過docker --help來進行檢視,同時也可以訪問docker的官方網站進行進一步的指令學習,網站地址:
上一篇(Docker中執行.net framework控制檯程式)