NetCore的Docker部署

NetCoreDocker部署html

1、NetCoreDocker

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

微軟的.NET Core自己就是一個對跨平臺支持比較好的語言,有vs這樣的集成工具對開發與部署也很友好,項目上進行發佈可直接得到對應平臺的可運行程序,也能夠發佈可移植程序,可是對應平臺須要安裝netcore運行時。docker

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

安裝運行時的過程當中可能會遇到一些不可預料的情況,開發機與生產環境的一些差別可能會致使安裝失敗,而採用Docker容器能夠直接將開發環境打包,不用在每一個不一樣的操做系統安裝運行時。 NetCorevs中就有Docker支持,但須要手動在windows環境下安裝docker以支持鏡像打包。vim

 

2、Docker安裝

直接在https://hub.docker.com/網站下載win平臺docker安裝包,但docker for window只支持win10以上版本,若是是win7,須要下載DockerToolBox來安裝(https://get.daocloud.io/toolbox/)。windows

安裝過程網上教程一大把,百度便可。但某些電腦的win7版本可能裝好後安裝虛擬機失敗,最終我換了一臺電腦安裝成功。下面這個錯誤截圖最終也沒解決。centos

 

 

3、Docker打包運行

Vs2017自帶的docker支持因爲我本機docker安裝失敗未進行深刻研究,因爲以前已經打包過現成的Linux可執行程序出去,就考慮直接打包現有的dllapi

 

1.Docker build 鏡像打包bash

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能夠強制刪除。

 

4、遇到的問題與解決

 

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)。http://www.javashuo.com/article/p-kubnkmfy-gg.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

 

參考連接:

http://www.javashuo.com/article/p-gvxqjvtz-go.html

http://www.javashuo.com/article/p-yrmylaax-bw.html

http://www.javashuo.com/article/p-nwtxlhsb-mu.html

http://www.javashuo.com/article/p-htyqxxyq-m.html

http://www.javashuo.com/article/p-zjuwbxrq-hq.html

相關文章
相關標籤/搜索