[Docker] 如何容器化 ASP.NET Core 網站
今天會介紹怎麼一步一步的將 ASP.NET Core 網站容器化,主要的步驟為
- 產生一個 ASP.NET Core MVC 預設專案
- 建立 Dockerfile
- 從 Dockerfile 建立包含網站的 Image
- 建立和執行 Container
建立 ASP.NET Core MVC 預設專案
這個步驟我們先要產生一個預設的 MVC 專案,並且要產生好佈署檔案,佈署檔案等等會用來複製到 Container。
先執行下方指令,產生好專案後,確定能執行起來1
2
3dotnet new mvc -n CoolWeb
cd CoolWeb
detnet run
成功的話,會看類似這樣網站
因為 docker 沒有設定憑證問題,所以 publish 之前,請到 Startup.cs 把 這行 app.UseHttpsRedirection(); 移除。
接下來使用 Ctrl + C
停止執行網站,然後使用 dotnet publish 建立佈署檔案。
- bash
1 | dotnet publish -o dist |
接下來你看到一個資料夾 dist,裡面就是我們需要的佈署檔案。
只要有這些佈署檔案,我們就可以把網站執行起來,你可以嘗試執行 dotnet CoolWeb.dll
,就會看到網站執行起來了。
建立 Dockerfile
建立 Dockerfile 的目的是用來執行一連串的動作,從 Pull Image 、把佈署檔案放進 Container 、到建立一個我們自己網站的 Image。
我們在 dist 資料夾裡面,建立一個 Dockerfile 檔案 (請注意, Dockerfile 沒有副檔名)
並在 Dockerfile 貼上以下指令。1
2
3FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
COPY . .
ENTRYPOINT ["dotnet", "CoolWeb.dll"]
這三行指令個代表是
- Pull ASP.NET Core Runtime 的 Image ,且我指定版本是 2.1 版本。
- 複製當下資料夾的檔案(這邊是指 dist 資料夾),貼到 Container
- Container 建立後會執行
dotent CoolWeb.dll
這段指令,讓網頁跑起來- 這段指令指行完後,會有一個 Process 在 Container 裡面執行,如果沒有這個 Process 表示 Container 已經沒有在執行任何東西。
從 Dockerfile 建立 Image
接下來就要讀取 Dockerfile,建立有我們網站的 Image, 請執行以下指令
- bash
1 | docker build . -t myapp -f Dockerfile |
- 參數
.
是指當下目錄 -t myapp
將產生的 Image 取名為myapp
-f Dockerfile
讀取 Dockerfile 這個檔案(預設可省略)
執行成功後,就會看到 myapp 的 Image 被建立了
建立和執行 Container
終於到了最後一個步驟了,接下來我們就要建立 Container 啦。 請執行以下指令1
docker create -p 8000:80 --name exampleApp myapp
-p 8000:80
建立 Container 80 port 與 host system 8000 port 的 proxy。- 所以當我輸入 http://localhost:8000/ 的時候,會連到 Container 的 http://localhost:80/
--name exampleApp
指定 Container 的別名myapp
從 myapp 這個 Image 建立 Container
建立完後,執行 docker ps -a
就會看到建立好的 Container
接下來就是要執行 Container 了,請執行以下指令。 此指令會讓 Container 執行起來,且是在背景執行。1
docker start exampleApp
接下來就是打開 chrome 輸入網址 http://localhost:8000/ ,就會看到已經連線到容器化後的 ASP.NET Core MVC 網站了!!!
將 create 與 start 用一個指令代替
另外 dokcer 有提供一個 run
指令,能夠將 create 和 start 兩個指令一起執行。 請看下方指令
- 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]