今天會介紹怎麼一步一步的將 ASP.NET Core 網站容器化,主要的步驟為

  • 產生一個 ASP.NET Core MVC 預設專案
  • 建立 Dockerfile
  • 從 Dockerfile 建立包含網站的 Image
  • 建立和執行 Container

建立 ASP.NET Core MVC 預設專案

這個步驟我們先要產生一個預設的 MVC 專案,並且要產生好佈署檔案,佈署檔案等等會用來複製到 Container。

先執行下方指令,產生好專案後,確定能執行起來

create mvc
  • bash
1
2
3
dotnet new mvc -n CoolWeb
cd CoolWeb
detnet run

成功的話,會看類似這樣網站
預設 ASP.NET Core MVC 網站預設 ASP.NET Core MVC 網站

因為 docker 沒有設定憑證問題,所以 publish 之前,請到 Startup.cs 把 這行 app.UseHttpsRedirection(); 移除。

接下來使用 Ctrl + C 停止執行網站,然後使用 dotnet publish 建立佈署檔案。

publish
  • bash
1
dotnet publish -o dist

接下來你看到一個資料夾 dist,裡面就是我們需要的佈署檔案。

佈署檔案佈署檔案

只要有這些佈署檔案,我們就可以把網站執行起來,你可以嘗試執行 dotnet CoolWeb.dll,就會看到網站執行起來了。

建立 Dockerfile

建立 Dockerfile 的目的是用來執行一連串的動作,從 Pull Image 、把佈署檔案放進 Container 、到建立一個我們自己網站的 Image。

我們在 dist 資料夾裡面,建立一個 Dockerfile 檔案 (請注意, Dockerfile 沒有副檔名)

dockerfiledockerfile

並在 Dockerfile 貼上以下指令。

dockerfile
  • bash
1
2
3
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
COPY . .
ENTRYPOINT ["dotnet", "CoolWeb.dll"]

這三行指令個代表是

  1. Pull ASP.NET Core Runtime 的 Image ,且我指定版本是 2.1 版本。
  2. 複製當下資料夾的檔案(這邊是指 dist 資料夾),貼到 Container
  3. Container 建立後會執行 dotent CoolWeb.dll 這段指令,讓網頁跑起來
    • 這段指令指行完後,會有一個 Process 在 Container 裡面執行,如果沒有這個 Process 表示 Container 已經沒有在執行任何東西。

從 Dockerfile 建立 Image

接下來就要讀取 Dockerfile,建立有我們網站的 Image, 請執行以下指令

build image
  • bash
1
docker build . -t myapp -f Dockerfile
  • 參數 . 是指當下目錄
  • -t myapp 將產生的 Image 取名為 myapp
  • -f Dockerfile 讀取 Dockerfile 這個檔案(預設可省略)

執行成功後,就會看到 myapp 的 Image 被建立了

myapp imagemyapp image

建立和執行 Container

終於到了最後一個步驟了,接下來我們就要建立 Container 啦。 請執行以下指令

create container
  • bash
1
docker create -p 8000:80 --name exampleApp myapp

  • -p 8000:80 建立 Container 80 port 與 host system 8000 port 的 proxy。
  • --name exampleApp 指定 Container 的別名
  • myapp 從 myapp 這個 Image 建立 Container

建立完後,執行 docker ps -a 就會看到建立好的 Container

containercontainer

接下來就是要執行 Container 了,請執行以下指令。 此指令會讓 Container 執行起來,且是在背景執行。

start container
  • bash
1
docker start exampleApp

接下來就是打開 chrome 輸入網址 http://localhost:8000/ ,就會看到已經連線到容器化後的 ASP.NET Core MVC 網站了!!!

將 create 與 start 用一個指令代替

另外 dokcer 有提供一個 run 指令,能夠將 create 和 start 兩個指令一起執行。 請看下方指令

run container
  • bash
1
docker run -d --rm -p 8000:80 myapp
  • -d 讓 Container 背景執行,如果沒有這個參數,則命令提示字元會停在那邊沒辦法做其他事情
  • --rm 當 Container 停止的時候,會自動把 Container 刪除

小結

今天只有介紹怎麼把佈署檔案放到 Container 裡面去,其實將 ASP.NET Core 網站容器的方法有很多,例如也可以使用 .NET Core SDK 的 Image ,這個 Image 裡面有提供 dotnet SDK 的功能,所以我能夠在 Container 裡面執行 dotnet restore, dotnet publish 之類的指令,做更多的事情。

延伸閱讀

[Introduction to .NET and Docker]
[Docker hub - .NET Core SDK]
[Docker hub - ASP.NET Core Runtime]