# ASP.Net Core 網站容器化 by VS Code ###### tags: `ASP.NET Core` ## 參考資料 [[Docker] 如何容器化 ASP.NET Core 網站](https://mileslin.github.io/2019/04/%E5%A6%82%E4%BD%95%E5%AE%B9%E5%99%A8%E5%8C%96-ASP.NET-Core-%E7%B6%B2%E7%AB%99/) by [Miles's Journey](https://mileslin.github.io/) ## Environment 開發: Windows OS Visual studio code Container: Linux OS Ubuntu 16.04.5 Docker client 18.09.7/Linux amd64 Docker server 18.09.7/Linux amd64 ## 建立專案的方式可參考以下這篇 [ASP.Net Core 網站容器化 (Docker Container) by Visual studio 2019](https://hackmd.io/RRqtl75lSsiSA8k7SYjZWg) ## 1. Publish專案包 ### 打開VS Code 到專案包底下下指令 ``` docker dotnet publish -o Publish ``` :::info * 指令說明 * dotnet publish -o {資料夾名稱} ::: ![](https://i.imgur.com/BoRUH9W.png) ### 查看Publish資料下新增不少檔案 ![](https://i.imgur.com/2PO1862.png) #### 可直接對{專案包名稱.dll)下啟動網站的指令 ``` linux dotnet .\RazorPagesMovie.dll ``` ![](https://i.imgur.com/DAFZjAP.png) :::success 就會發現Local端網站已啟動 ::: ## 2. 撰寫Dockerfile **Dockerfile** ``` dockerfile= FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 COPY . . ENTRYPOINT ["dotnet", "RazorPagesMovie.dll"] ``` ![](https://i.imgur.com/M8VEjzL.png) :::danger 這段一定要根據 aspnet core的版本去寫 ``` docker aspnet:3.1 ``` 不確定版本的可以下指令確認 ``` linux dotnet --version ``` ![](https://i.imgur.com/hqOxHCh.png) ::: :::info * 指令說明 * Pull ASP.NET Core Runtime 的 Image ,我指定版本是 **3.1** 版本。 * 複製當下資料夾的檔案(這邊是指 Publish 資料夾),貼到 Container * Container 建立後會執行 **dotent RazorPagesMovie.dll** * 這段指令,讓網頁跑起來這段指令指行完後,會有一個 Process 在 Container 裡面執行,如果沒有這個 Process 表示 Container 已經沒有在執行任何東西。 ::: ## 3. 打包Publish的資料夾 :::danger 如果有使用**Local DB**的可以一併放入Publish打包起來 ::: **目前專案包用到這兩個DB 所以就一併放進來** ![](https://i.imgur.com/hUq0gP2.png) ### 壓縮成zip檔 ![](https://i.imgur.com/76hD86j.png) ### 使用WinSCP直接拖曳到Linux資料夾下 [WinSCP不熟悉的可以參考我這篇](https://hackmd.io/RRqtl75lSsiSA8k7SYjZWg) #### 複製Publish.zip到Linux ![](https://i.imgur.com/3z6qmIn.png) ## 4. Putty打開Linux,解壓縮Publish.zip ![](https://i.imgur.com/MRGntHL.png) ### 確認資料夾解壓縮成功 ![](https://i.imgur.com/OWY8bMO.png) ## 5. 透過Dockerfile部屬Container ``` docker docker build . -t she_image -f Dockerfile ``` :::info 指令說明 * 參數 ```.``` 是指當下目錄 * -t she_image 將產生的 Image 取名為 she_image * -f Dockerfile 讀取 Dockerfile 這個檔案(預設可省略) ::: ### 第一次部屬會從 microsoft.com下載aspnet:3.1的套件 ![](https://i.imgur.com/x0KsKYQ.png) ### 如果只後要移植網站可以將以下兩個images都打包成tar檔,直接移植到無網路環境的Linux底下部屬 ![](https://i.imgur.com/OqWO6J5.png) ## 6. 透過Image建立Container ### 建立Container ``` docker docker create -p 8000:80 --name she_web she_image ``` :::info 指令說明 * **-p 8000:80** 建立 Container 80 port 與 host system 8000 port 的 proxy。 * 所以當我輸入 http://localhost:8000/ 的時候,會連到 Container 的 http://localhost:80/ * **--name she_we** 指定 Container 的別名 * 從 **she_image** 這個 Image 建立 Container ::: ### 下指令查看continer ```linux docker ps -a ``` ![](https://i.imgur.com/UiXrsgh.png) ### 啟動Container ```linux docker start c701a5a7cc77 ``` :::info 指令說明 **docker start {docker id}** ::: ### 查看已啟動的Container ``` linux docker ps ``` ![](https://i.imgur.com/cPDMAtD.png) :::success **補充** 如果不想先**建立再啟動**,可以直接下這個指令 ```docker docker run -d --rm -p 8000:80 she_image ``` * **-d** 讓 Container 背景執行,如果沒有這個參數,則命令提示字元會停在那邊沒辦法做其他事情 * **--rm** 當 Container 停止的時候,會自動把 Container 刪除 ::: ## 7. 從windows這邊直接測試網站 http://192.168.8.114:8000 ![](https://i.imgur.com/MP2oCTG.png) :::warning **記得IP後面要加Port** ::: ### 確認DB也都正常運行 ![](https://i.imgur.com/qt4xMLx.png) :::success Done :+1: :100: :::