本文主要介紹一下如何在Docker中釋出.NET Core 3.x 并對整個過程所遇到的問題加以記錄和分析.
環境、工具、準備工作
伺服器: VM中安裝CentOS, 核心版本3.10.x;
用戶端: Windows 10;
IDE: VS2019
SFTP用戶端: FileZilla; 用來進行檔案傳輸;
SSH工具: Putty; 用來在Windows 上遠端通路CentOS;
本文示例均為Root權限;
因為是本地環境,是以防火牆是關閉狀态,如果沒有關閉防火牆,端口映射的時候記得處理.
Docker安裝 (如已安裝可忽略)
參考官方文檔
1. 解除安裝删除舊Docker版本,使用如下指令;
2. 安裝 yum-config-manager ,DeviceMapper(了解DeviceMapper) 和 lvm2(了解lvm2); 使用如下指令:
3. 設定倉庫位址; 使用如下指令:
4. 安裝社群版Docker, 使用如下指令: (如需安裝指定版本請參考官方文檔)
5. 啟動Docker, 使用如下指令:
6. 運作測試, 使用如下指令:
Docker釋出.NET Core MVC
1. 使用VS2019建立.NET Core MVC, 選不選擇Docker 支援都無所謂,重要的是Dockerfile. (Dockerfile學習)

2. 編寫Dockerfile, 并設定始終複制到目錄; Dockerfile内容如下:
說明:
2.1 如果建立項目時選擇了Docker支援, 請将内容修改為上面内容(主要為友善了解);
2.2 Dockerfile 路徑預設先放置在Project 下,并設定始終複制到目錄; 檔案路徑并非一定要在Project下,但是這樣對初學者好了解;
2.3 着重說明下EXPOSE選項:
可以不設定,該選項隻是告訴鏡像使用者容器準備以什麼協定暴露哪個端口号,實際運作是不釋出端口的;相當于描述資訊(Docker Run -p);
Docker Run -P 指令會使用到該選項,後面介紹;
2.4 官方基礎鏡像庫 https://hub.docker.com/_/microsoft-dotnet-core 根據自己需要選擇
3. 釋出項目并上傳到CentOS;
4. 使用指令建構鏡像: (Build指令學習)
進入項目釋出目錄:
建構鏡像:
注意: . 号不能丢失, 表示目前目錄
檢視鏡像資訊:
5. 使用指令運作容器: (Run指令學習)
檢視容器:
容器啟動, 這個時候我們的.NET Core MVC就算釋出完了, 在浏覽器輸入http://你的伺服器位址:5000 通路程式, 你會驚喜的發現,無論怎麼通路你都通路不到, 是不是很意外?
為什麼會通路不到呢? 這也是初學者踩的最多的坑, 目前網上大部分博文的部署都是上面的流程, 你部署下來會發現無論如何都通路不到, 很少有講解為什麼, 其實原因很簡單,我們使用指令來看看為什麼:
根據log我們發現我們的程式是正常運作了, 但是仔細看内容, .NET Core 程式預設監聽的是localhost:5000 和 localhost:5001 而localhost 是回環網絡位址, 而我們的容器和主控端是隔離的, 是以即便我們将容器端口和主控端端口進行了映射綁定, 主控端依然無法通路容器内的應用.
解決方案有以下四種(順序既是優先級,任選一種即可)
(1) 在程式Program.cs修改程式端口監聽配置;
(2) 修改Dockerfile的ENTRYPOINT參數;
(3) 啟動容器設定應用監聽端口;
(4)設定Dockerfile的環境變量;
以上四種方式都可以重新設定應用程式端口監聽,四種情況共存的話1最優先,4最後;一般建議使用3, 友善各種容器編排工具進行動态管理;
停止之前運作的容器,并删除;
使用第三者方案重新建立運作容器, 并測試, 你會發現我們的應用程式已經可以正常的通路了.
最後我們再來解析下Dockerfile的EXPOSE的作用;
使用指令來檢視我們的容器配置資訊:
我們會看到以下配置資訊:
使用檢視容器指令來看容器啟動資訊:
從以上内容來看,EXPOSE定義的端口,并未暴露給主控端, 這也是我們上面說的EXPOSE實際并不釋出端口,僅相當于描述資訊;
我們在啟動容器時使用了-p 5000:5000 意義是将容器的5000端口和主控端5000端口進行綁定;
但是 docker run還有一個參數 -P ,我們使用以下指令:
你會發現有一個随機的端口和EXPOSE暴露的80端口進行了綁定,如果這個時候你的應用程式預設監聽了80端口, 則就可以使用http://伺服器位址:32768進行程式通路了
這就是EXPOSE的作用;