1. 程式人生 > >把AspDotNetCoreMvc程序運行在Docker上-part1

把AspDotNetCoreMvc程序運行在Docker上-part1

loaded complete sea 格式 網站程序 round 博文 entos .net

基於ASP.Net Core學習Docker技術第一步:在CentOS7安裝Docker平臺》這個博文,在搭建完成Docker平臺之後,可以開始讓aspdotnetcore程序運行在docker平臺上。

1.在開發機器上準備好一個AspDotNetCoreMvc程序

可用的示例代碼可從這裏下載

https://github.com/shenba2014/AspDotNetCoreMvcDocker

(需要事先安裝好.NET Core2.0和bower,安裝完成node.js後用npm安裝bower)

下載代碼之後在命令行定位到項目的根目錄,依次運行如下命令

dotnet restore

bower install

dotnet run

然後瀏覽器輸入http://localhost:5000就可以看到如下界面

技術分享

這個示例代碼是基於dotnet new mvc的模板創建,然後做了一些精簡後得到的,具體過程就不詳細描述。

2.創建可運行AspDotNeCore程序的Docker鏡像

之前只是在服務器搭建了Docker環境,但是沒有安裝.NET Core的運行環境,是為了演示在宿主機器下僅僅通過Docker平臺來實現運行.NET Core程序。

Docker平臺是不認識.NET Core程序的,哪怕你說自己是跨平臺。Docker只認識鏡像和容器。

鏡像和容器就是我們的出發點,我們需要得到一個包含了運行.NET Core環境的鏡像,然後基於這個鏡像創建一個容器,然後把我們的程序放到這個容器中運行,大概就是這麽一個思路。至於鏡像和容器的概念,簡單的說就是一個是模板,一個是實例,不詳細說了。

我們不容操心去哪裏弄一個可用的鏡像,.NET Core已經為我們準備好了這個鏡像,通過如下命令可以搜索microsoft提供的鏡像(docker的命令要到服務器執行,如果開發和服務器都在一個機器,請無視)

docker search microsoft

得到的是microsoft名下的鏡像列表,我們這裏需要的是aspnetcore鏡像,其他的自行研究。

microsoft/aspnetcore Official images for running compiled ASP.N...

描述裏說明的是官方的,所以可以放心的使用

那為什麽時創建呢,因為microsoft提供的aspnetcore鏡像文件只包含運行的基本環境,我們需要基於這個鏡像,創建一個包含我們網站程序的鏡像。看起來跟平常的思路不一樣,通常的做法是把部署好的程序拷貝到運行環境。我們這裏是用Docker的方式解決,有了自定義的鏡像之後,我們可以創建任意多份容器示例,這樣省去了重復拷貝,這也是Docker的核心競爭力之一。

接下開始創建這個自定義的鏡像

a.在網站程序根目錄創建一個Dockerfile,沒有後綴,輸入如下內容

FROM microsoft/aspnetcore:2.0.0

COPY dist /app

WORKDIR /app

EXPOSE 80/tcp

ENTRYPOINT [ "dotnet", "AspDotNetCoreMvcDocker.dll" ]

這是一個yaml格式的文件,提供一些創建鏡像的參數

FROM

基於哪個鏡像創建,這裏指定的是aspnetcore的2.0版本,如果不設置版本號,將獲取最新的版本。

詳細的版本可查看

https://hub.docker.com/r/microsoft/aspnetcore/tags/

COPY

可以理解為從本機拷貝內容到鏡像中,這裏設置從本機dist目錄(release生成目錄)拷貝到鏡像的/app目錄

WORKDIR

工作目錄

EXPOSE

容器的暴露端口

ENTRYPOINT

很明顯是一個入口命令,這裏設置的是執行dotnet命令,運行站點,這個命令在容器啟動的時候執行

b.生成網站程序

就是編譯網站程序,生成一個release版本的輸出

還是在站點根目錄,執行如下命令

dotnet publish --framework netcoreapp2.0 --configuration Release --output dist

在站點程序的根目錄下將生成一個dist目錄

c.創建鏡像

執行創建命令之前需要確認Dockerfile和dist文件夾在同一個目錄下,這樣省得去指定路徑。

如果本地開發環境和Docker所在的服務器不在一個機器上,那麽需要將上一步的Dockerfile和dist文件拷貝到服務器上。

然後在Dockerfile所在名錄的命令行下執行如下命令

docker build . -t shenba/aspdotnetcoremvc -f Dockerfile

-t 是目標鏡像的標簽名稱,可以設置其他名稱,通常格式是 Docker用戶名/鏡像名稱

Docker用戶名就是在Docker站點的註冊用戶名(後續發布鏡像到docker hub會用到)

-f 就是包含創建鏡像的配置文件,就是我們創建的Dockerfile

運行上述命令後的輸出如下:

Sending build context to Docker daemon 4.36MB

Step 1/5 : FROM microsoft/aspnetcore:2.0.0

2.0.0: Pulling from microsoft/aspnetcore

219d2e45b4af: Pull complete

76809febc514: Pull complete

96ef109a5ac7: Pull complete

78a255fc90a4: Pull complete

8865b55bda8e: Pull complete

Digest: sha256:0e9274ca36d13425bf0cc558ceaed355ceffd74814d9a14a679f917cc30ddc15

Status: Downloaded newer image for microsoft/aspnetcore:2.0.0

---> 4f34e60fe340

Step 2/5 : COPY dist /app

---> 70910ea10aa0

Step 3/5 : WORKDIR /app

---> 23344526b7ef

Removing intermediate container 158997ed60bd

Step 4/5 : EXPOSE 80/tcp

---> Running in 43bd0930495b

---> d0e0b20f93cc

Removing intermediate container 43bd0930495b

Step 5/5 : ENTRYPOINT dotnet AspDotNetCoreMvcDocker.dll

---> Running in b3767135fb4c

---> 407471ef91f2

Removing intermediate container b3767135fb4c

Successfully built 407471ef91f2

Successfully tagged shenba/aspdotnetcoremvc:latest

可以看到第一步是把microsoft/aspnetcore:2.0.0下載到本地,然後依次執行Dockerfile裏面的每一行命令

運行docker images命令可以看到兩個新增的鏡像

REPOSITORY TAG IMAGE ID CREATED SIZE

microsoft/aspnetcore 2.0.0 4f34e60fe340 Less than a second ago 280MB

shenba/aspdotnetcoremvc latest 407471ef91f2 2 minutes ago 284MB

一個是microsoft/aspnetcore鏡像,一個是我們的自定義鏡像

d.創建和運行容器

到這裏自定義鏡像已經有了,也就是模板已經有了,那麽創建容器就簡單了。

在服務器上運行如下命令

docker create -p 3000:80 --name app1 shenba/aspdotnetcoremvc

-p 3000:80 指定宿主的3000端口和容器的80端口做映射,那麽對外訪問3000端口就能訪問到容器的80端口

--name app1 名稱

最後一個是鏡像的名稱,就是我們自定義的鏡像名

再創建另外一個端口的容器,改個端口和名字就可以了

docker create -p 4000:80 --name app2 shenba/aspdotnetcoremvc

這時候運行docker ps -a可以查看到已創建的容器

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

104fb49877cf shenba/aspdotnetcoremvc "dotnet AspDotNetC..." 3 seconds ago Created app2

dfc780c6511c shenba/aspdotnetcoremvc "dotnet AspDotNetC..." 11 seconds ago Created app1

接下來運行容器app1

docker start app1

那麽app1這個站點應該會跑起來,然後瀏覽器輸入http://{ip}:3000/就能打開網站,截圖就跟示例站點一樣

接下來啟動app2

docker start app2

同樣沒有問題,瀏覽器輸入http://{ip}:4000/就能打開網站,輸出同樣的結果。

這樣就完成了鏡像和容器的創建,同時也成功把我們自己的程序運行在docker平臺上。

總結一下,各個部分的來龍去脈,目前包含了以下幾個部分

AspDotNetCoreMvcDocker MVC站點程序

Dockerfile 生成自定義鏡像的配置文件

shenba/aspdotnetcoremvc 自定義的鏡像(基於microsoft/aspnetcore鏡像創建,

包含AspDotNetCoreMvcDocker的站點內容

app1,app2 shenba/aspdotnetcoremvc的容器示例,分別映射到宿主機的不同端口

整個關系圖如下:

技術分享

把AspDotNetCoreMvc程序運行在Docker上-part1