在Docker容器中運(yùn)行現(xiàn)有的.Net Framework應(yīng)用程序不需要對(duì)應(yīng)用程序進(jìn)行任何修改,我們需要?jiǎng)?chuàng)建包含應(yīng)用程序的Docker鏡像靠闭,然后啟動(dòng)容器即可。本篇主要講解如何在Docker容器中運(yùn)行ASP.NET MVC應(yīng)用程序忠烛。
生成Asp.Net MVC 應(yīng)用程序
打開VS創(chuàng)建一個(gè)ASP.NET Web Application(.NET Framework)概耻,如圖Image-1所示:
打開Index.cshtml芥喇,修改里面的內(nèi)容如圖Image-2所示:
直接運(yùn)行application西采,如圖Image-3所示:
發(fā)布應(yīng)用程序(大家可以理解成為應(yīng)用程序打包)
在vs中右鍵單擊web項(xiàng)目,然后在彈出的menu中選擇Publish继控,彈出如圖Image-4所示的對(duì)話框:
選擇Custom械馆,彈出如圖Image-5所示對(duì)話框,填寫custom的profile name:
點(diǎn)擊OK button武通,彈出如圖Image-6所示對(duì)話框,Publish method選擇File System霹崎,Target location選擇你想要publish的地址:
點(diǎn)擊Next button,彈出如圖Image-7所示的對(duì)話框冶忱,勾選Precompile during publishing尾菇,官方給的解釋是:This optimization means that you'll be compiling views in the Docker container, you are copying the precompiled view.:
點(diǎn)擊Next Button然后點(diǎn)擊Publish,在VS的控制臺(tái)中我們會(huì)看到如圖Image-8所示的內(nèi)容,表示publish成功:
可以通過訪問我們之前指定的publish location來看publish的包結(jié)果囚枪,如圖Image-9所示:
添加Dockerfile文件
對(duì)dockerfile陌生的小伙伴可以查看(在Docker容器中運(yùn)行.Net Framework控制臺(tái)應(yīng)用程序)文章中對(duì)Dockfile的解釋错沽。
在Dockerfile文件中我們添加如下兩行命令:
FROM microsoft/aspnet
通過FROM指令來指定我們所要使用的基本鏡像
COPY /PublishOutput/ /inetpub/wwwroot
通過COPY來將我們publish的包c(diǎn)opy到container中
此Dockerfile不需要包含ENTRYPOINT指令。使用IIS運(yùn)行服務(wù)時(shí)眶拉,IIS進(jìn)程是入口點(diǎn),配置為aspnet基本鏡像中啟動(dòng)憔儿。
創(chuàng)建鏡像(Image)
打開cmd命令行工具忆植,進(jìn)入到Dockerfile所在的文件夾,鍵入如下命令:
docker build -t hellodockerweb:v1 .? ?如下圖Image-10所示:
docker通過build指令來創(chuàng)建鏡像(Image), build 指令后的-t 表示的是指定當(dāng)前Image的Tag谒臼,大家可以理解成Image的Name朝刊,鏡像名稱冒號(hào)后面的v1大家可以理解成當(dāng)前Image的版本號(hào),如果不指定的話默認(rèn)會(huì)為latest蜈缤,最后的. 表示的是Dockerfile所在的當(dāng)前目錄拾氓。上面的指令可以理解成基于Dockerfile創(chuàng)建一個(gè)v1版本的名為hellodockerweb的鏡像。執(zhí)行該命令會(huì)得到如下圖Image-11所示的結(jié)果:
截圖中顯示了Dockerfile中我們所寫的兩個(gè)指令的執(zhí)行情況底哥,最后會(huì)提示你Image創(chuàng)建成功咙鞍。如果大家是第一次執(zhí)行FROM microsoft/aspnet指令房官,docker daemon會(huì)去docker registry中拉取該基鏡像,這個(gè)過程相當(dāng)于下載該鏡像到本地续滋,執(zhí)行起來會(huì)慢一些翰守,大家不要著急。
我們通過docker images指令來查看創(chuàng)建的鏡像,如下圖Image-12所示:
運(yùn)行容器
通過運(yùn)行指令docker run -d -p 9000:80 --name hellodockerwebcontainer hellodockerweb:v1 來運(yùn)行容器疲酌,結(jié)果如圖Image-13所示蜡峰,返回的是當(dāng)前Container的ID,我們可以在地址C:\ProgramData\Docker\windowsfilter\? 中找到該容器:
該指令表達(dá)的意思是基于hellodockerweb:v1鏡像在detached模式下運(yùn)行一個(gè)名為hellodockerwebcontainer的容器朗恳,并且將宿主機(jī)器的9000端口與容器的80端口進(jìn)行映射
指令中的-d表示在detached mode(detached mode大家可以理解成讓容器在后臺(tái)運(yùn)行)下運(yùn)行Image湿颅,docker image運(yùn)行時(shí)與shell斷開連接。這樣的話所有對(duì)容器的操作類似網(wǎng)絡(luò)連接粥诫,共享操作等等都不會(huì)再接受命令行的命令控制油航。
指令-p表示將當(dāng)前宿主機(jī)器的9000端口與容器的80端口進(jìn)行映射,這樣的話對(duì)外我們通過9000端口就可以訪問到80端口了
后臺(tái)運(yùn)行與前臺(tái)運(yùn)行的區(qū)別:
當(dāng)container運(yùn)行在后臺(tái)模式臀脏,所有I/O數(shù)據(jù)只能通過網(wǎng)絡(luò)資源或者共享卷組來進(jìn)行交互劝堪。因?yàn)閏ontainer不再監(jiān)聽執(zhí)行docker run的這個(gè)終端命令窗口。但是我們可以通過執(zhí)行docker attach來重新掛載這個(gè)container揉稚。
當(dāng)container運(yùn)行在前臺(tái)模式秒啦,docker會(huì)啟動(dòng)這個(gè)container,同時(shí)將當(dāng)前的命令行窗口掛載到container的標(biāo)準(zhǔn)輸入搀玖,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤中余境。也就是container中所有的輸出,我們都可以在當(dāng)前窗口中查看到灌诅。甚至docker可以虛擬出一個(gè)TTY窗口芳来,來執(zhí)行信號(hào)中斷,這些都是可以通過命令配置的猜拾。
瀏覽器中訪問ASP.Net MVC 站點(diǎn)
容器啟動(dòng)后即舌,可以通過http://locahost:9000 來訪問當(dāng)前運(yùn)行的站點(diǎn),如圖Image-14所示:
還有另外一種訪問方式挎袜,即通過container運(yùn)行的IP+Port的方式訪問:http://{IP}:{Port}, 其中IP為container的IP顽聂,Port為container暴露的端口,不指定的話默認(rèn)暴露的是80端口盯仪,我們可以通過如下指令獲取到container的IP:?
docker inspect -f '{{.NetworkSettings.Networks.nat.IPAddress}}' container-name? 如圖Image-15所示:
可以通過訪問地址http://cotainerip 來訪問當(dāng)前運(yùn)行的站點(diǎn)紊搪,如圖Image-16所示:
以上便完成了容器化Asp.Net MVC Web應(yīng)用程序,希望這個(gè)簡單的例子能幫助大家進(jìn)一步了解docker相關(guān)的基礎(chǔ)知識(shí)全景,docker中提供了很多指令耀石,大家可以通過docker --help來進(jìn)行查看,同時(shí)也可以訪問docker的官方網(wǎng)站進(jìn)行進(jìn)一步的指令學(xué)習(xí)爸黄,網(wǎng)站地址:
https://docs.docker.com/engine/reference/commandline/port/