本文主要介紹一下如何在Docker中發佈.NET Core 3.x 並對整個過程所遇到的問題加以記錄和分析.linux
參考官方文檔docker
1. 卸載刪除舊Docker版本,使用以下命令;centos
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
2. 安裝 yum-config-manager ,DeviceMapper(瞭解D
瀏覽器eviceMapper
) 和 lvm2(瞭解lvm2); 使用以下命令:
yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
3. 設置倉庫地址; 使用以下命令:服務器
//官方地址: yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo //阿里雲(建議): yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4. 安裝社區版Docker, 使用以下命令: (如需安裝指定版本請參考官方文檔)網絡
yum install docker-ce docker-ce-cli containerd.io
5. 啓動Docker, 使用以下命令:mvc
//設置開機自動啓動docker systemctl enable docker //啓動docker systemctl start docker
6. 運行測試, 使用以下命令:app
docker version
1. 使用VS2019建立.NET Core MVC, 選不選擇Docker 支持都無所謂,重要的是Dockerfile. (Dockerfile學習)工具
2. 編寫Dockerfile, 並設置始終複製到目錄; Dockerfile內容以下:學習
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 WORKDIR /app COPY . . EXPOSE 80 ENTRYPOINT ["dotnet", "TestMVC.dll"]
說明:
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命令學習)
進入項目發佈目錄:
cd /home/publish
構建鏡像:
docker build -t testmvc:v1 .
注意: . 號不能丟失, 表示當前目錄
查看鏡像信息:
docker images
5. 使用命令運行容器: (Run命令學習)
docker run -d -p 5000:5000 --name testmvc testmvc:v1
查看容器:
docker ps -a
容器啓動, 這個時候咱們的.NET Core MVC就算髮布完了, 在瀏覽器輸入http://你的服務器地址:5000 訪問程序, 你會驚喜的發現,不管怎麼訪問你都訪問不到, 是否是很意外?
爲何會訪問不到呢? 這也是初學者踩的最多的坑, 目前網上大部分博文的部署都是上面的流程, 你部署下來會發現不管如何都訪問不到, 不多有講解爲何, 其實緣由很簡單,咱們使用命令來看看爲何:
docker logs testmvc
根據log咱們發現咱們的程序是正常運行了, 可是仔細看內容, .NET Core 程序默認監聽的是localhost:5000 和 localhost:5001 而localhost 是迴環網絡地址, 而咱們的容器和宿主機是隔離的, 因此即使咱們將容器端口和宿主機端口進行了映射綁定, 宿主機依然沒法訪問容器內的應用.
解決方案有如下四種(順序既是優先級,任選一種便可)
(1) 在程序Program.cs修改程序端口監聽配置;
(2) 修改Dockerfile的ENTRYPOINT參數;
(3) 啓動容器設置應用監聽端口;
docker run -d -p 5000:5000 -e ASPNETCORE_URLS=http://+:5000 --name testmvc testmvc:v1
(4)設置Dockerfile的環境變量;
以上四種方式均可以從新設置應用程序端口監聽,四種狀況共存的話1最優先,4最後;通常建議使用3, 方便各類容器編排工具進行動態管理;
中止以前運行的容器,並刪除;
//中止運行的鏡像 docker stop testmvc //刪除已經建立的容器 docker rm testmvc
使用第三者方案從新建立運行容器, 並測試, 你會發現咱們的應用程序已經能夠正常的訪問了.
最後咱們再來解析下Dockerfile的EXPOSE的做用;
使用命令來查看咱們的容器配置信息:
docker inspect testmvc
咱們會看到如下配置信息:
使用查看容器命令來看容器啓動信息:
docker ps
從以上內容來看,EXPOSE定義的端口,並未暴露給宿主機, 這也是咱們上面說的EXPOSE實際並不發佈端口,僅至關於描述信息;
咱們在啓動容器時使用了-p 5000:5000 意義是將容器的5000端口和宿主機5000端口進行綁定;
可是 docker run還有一個參數 -P ,咱們使用如下命令:
docker run -d -P --name testmvc1 testmvc:v1
你會發現有一個隨機的端口和EXPOSE暴露的80端口進行了綁定,若是這個時候你的應用程序默認監聽了80端口, 則就可使用http://服務器地址:32768進行程序訪問了
這就是EXPOSE的做用;