NetCore的Docker部署


NetCoreDocker部署

一、NetCoreDocker

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然后發布到任何流行的 LinuxWindows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口 。

微軟的.NET Core本身就是一個對跨平台支持比較好的語言,有vs這樣的集成工具對開發與部署也很友好,項目上進行發布可直接獲得對應平台的可運行程序,也可以發布可移植程序,但是對應平台需要安裝netcore運行時。

安裝運行時需要針對不同的環境來處理,微軟的下載頁面提供安裝的各種支持:https://dotnet.microsoft.com/download,運行時在windows平台下直接安裝一個dotnet-hosting-2.1.12-win.exe即可,linux環境需要根據不同的操作系統命令行安裝。

安裝運行時的過程中可能會遇到一些不可預料的狀況,開發機與生產環境的一些差異可能會導致安裝失敗,而采用Docker容器可以直接將開發環境打包,不用在每個不同的操作系統安裝運行時。 NetCorevs中就有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是打包源碼的,可以參考一下,大部分都可以刪除。

 

最終其實就是一句copyadd即可

 

其中設置utf-8是為了支持容器中的中文顯示,urls是告訴容器需要提供這個對外的接口開放,workdir是指定程序的初始目錄。

拷貝相應文件到linux主機目錄 如/tmp/netcoreputty遠程上去,定位到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://stackoverflow.com/questions/51598627/access-to-the-path-proc-1-map-files-is-denied-net-core-2-1-centos-7?r=SearchResults

 

參考鏈接:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM