NetCore的Docker部署 一、NetCore與Docker Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發佈到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面 。 微軟的 ...
NetCore的Docker部署
一、NetCore與Docker
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發佈到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面 。
微軟的.NET Core本身就是一個對跨平臺支持比較好的語言,有vs這樣的集成工具對開發與部署也很友好,項目上進行發佈可直接獲得對應平臺的可運行程式,也可以發佈可移植程式,但是對應平臺需要安裝netcore運行時。
安裝運行時需要針對不同的環境來處理,微軟的下載頁面提供安裝的各種支持:https://dotnet.microsoft.com/download,運行時在windows平臺下直接安裝一個dotnet-hosting-2.1.12-win.exe即可,linux環境需要根據不同的操作系統命令行安裝。
安裝運行時的過程中可能會遇到一些不可預料的狀況,開發機與生產環境的一些差異可能會導致安裝失敗,而採用Docker容器可以直接將開發環境打包,不用在每個不同的操作系統安裝運行時。 NetCore在vs中就有Docker支持,但需要手動在windows環境下安裝docker以支持鏡像打包。
二、Docker安裝
直接在https://hub.docker.com/網站下載win平臺docker安裝包,但docker for window只支持win10以上版本,如果是win7,需要下載DockerToolBox來安裝(https://get.daocloud.io/toolbox/)。
安裝過程網上教程一大把,百度即可。但某些電腦的win7版本可能裝好後安裝虛擬機失敗,最終我換了一臺電腦安裝成功。下麵這個錯誤截圖最終也沒解決。
三、Docker打包運行
Vs2017自帶的docker支持由於我本機docker安裝失敗未進行深入研究,由於之前已經打包過現成的Linux可執行程式出去,就考慮直接打包現有的dll。
1.Docker build 鏡像打包
Docker build命令是需要提供一個Dockerfile配置文件來告訴打包程式需要進行哪些操作的。微軟預設生成的Dockerfile是打包源碼的,可以參考一下,大部分都可以刪除。
最終其實就是一句copy或add即可
其中設置utf-8是為了支持容器中的中文顯示,urls是告訴容器需要提供這個對外的介面開放,workdir是指定程式的初始目錄。
拷貝相應文件到linux主機目錄 如/tmp/netcore,putty遠程上去,定位到netcore目錄,執行命令:docker build -t testdocker .
註意最後的”.”,這是命令的一部分,這個會將當前目錄的所有文件拷貝到docker容器中,然後預設解析當前目錄的Dockerfile文件進行鏡像構建。
2.Docker run鏡像運行
“docker run -d --name mytest -p 5000:5001 -v /tmp:/tmp testdocker”
解釋這個命令的參數前,首先要瞭解鏡像與容器的概念。
鏡像:就是之前build的結果,叫testdocker,在linux主機中用docker images命令可以顯示當前本地總共有多少鏡像,有點類似Class類的概念
容器:就是這個命令中的 --name mytest,就好比new的一個Class對象。一個鏡像可以有多個容器運行。Docker ps可以查看當前運行的容器,參數-a可以查看所有容器。
接下來說參數,
-d 指定後臺運行。
--rm 與-d互斥,前臺運行完成後刪除容器
-p指定linux主機埠映射容器內的埠,容器內通過Dockerfile指定的埠是5001,在主機指定5000埠與之對應。
-v是目錄對應,容器中要訪問的目錄如果用該參數對應過,則訪問的是宿主機中的目錄,前一個是主機中的目錄。
3.Docker pull鏡像獲取
Docker pull hello-world可以從倉庫獲取鏡像,倉庫是一個鏡像的合集,現在訪問倉庫鏡像速度不是很理想,可以用阿裡的鏡像加速服務,需要註冊一下,怎麼操作修改都有提示。
4.Docker push 鏡像推送
鏡像打包好之後如何提供給別人,可以直接推送到docker hub,別人就能直接用pull命令獲取。如果程式太放心放在公有倉庫中,可以自己搭建一個私有倉庫,網上教程也很多,由於已有現成的公司私有倉庫,我就直接用了。
推送首先要將本地鏡像docker tag testdocker registry.*.com\test打tag, 然後docker login 私有倉庫地址登錄,最後docker push tag名稱將鏡像推送到倉庫中。
5.Docker exec -it mytest bash
進入容器中,可以查看打包的目錄是否符合預期,運行的日誌等
6.容器鏡像刪除
Docker rmi可以刪除鏡像,docker rm可以刪除容器,-f可以強制刪除。
四、遇到的問題與解決
1.容器運行成功後無法訪問.
查看dockerfile中的埠與docker run命令中的埠是否對應。
2.鏡像推送失敗
這個可能有多種原因,比如沒登錄等,主要看提示。比如證書
添加配置即可:# vim /etc/docker/daemon.json
{
"insecure-registries": ["registry.xxx.com.cn"]
}
3.Dockerfile基礎鏡像修改為centos
預設運行的基礎鏡像是FROM microsoft/dotnet:2.1-aspnetcore-runtime,但原本沒用docker時發佈的程式是能夠直接運行在centos上的,那修改基礎鏡像後能不能直接運行呢?答案是不行,遇到了icu問題,可以修改程式的配置文件,或安裝icu包,可以在docker中直接指定(run yum install -y icu)。https://www.cnblogs.com/xakoy/p/9039218.html
4.Netcoreapi運行失敗
這是一個很奇怪的問題,最終在Stack Overflow上找到答案,dockerfile中必須設置workdir,不設置就會報這個錯。而這個問題在win平臺的docker中是沒問題的。
'/proc/1/map_files' is denied
參考鏈接:
https://www.cnblogs.com/nanlan2017/p/10451671.html
https://blog.csdn.net/vitaair/article/details/80894890
https://blog.csdn.net/qq_33256688/article/details/80319673
https://blog.csdn.net/u013469944/article/details/84202396
https://www.cnblogs.com/xhyan/p/6593075.html