NetCore的Docker部署html
Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的鏡像中,而後發佈到任何流行的 Linux或Windows 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口 。linux
微軟的.NET Core自己就是一個對跨平臺支持比較好的語言,有vs這樣的集成工具對開發與部署也很友好,項目上進行發佈可直接得到對應平臺的可運行程序,也能夠發佈可移植程序,可是對應平臺須要安裝netcore運行時。docker
安裝運行時須要針對不一樣的環境來處理,微軟的下載頁面提供安裝的各類支持:https://dotnet.microsoft.com/download,運行時在windows平臺下直接安裝一個dotnet-hosting-2.1.12-win.exe便可,linux環境須要根據不一樣的操做系統命令行安裝。json
安裝運行時的過程當中可能會遇到一些不可預料的情況,開發機與生產環境的一些差別可能會致使安裝失敗,而採用Docker容器能夠直接將開發環境打包,不用在每一個不一樣的操做系統安裝運行時。 NetCore在vs中就有Docker支持,但須要手動在windows環境下安裝docker以支持鏡像打包。vim
直接在https://hub.docker.com/網站下載win平臺docker安裝包,但docker for window只支持win10以上版本,若是是win7,須要下載DockerToolBox來安裝(https://get.daocloud.io/toolbox/)。windows
安裝過程網上教程一大把,百度便可。但某些電腦的win7版本可能裝好後安裝虛擬機失敗,最終我換了一臺電腦安裝成功。下面這個錯誤截圖最終也沒解決。centos
Vs2017自帶的docker支持因爲我本機docker安裝失敗未進行深刻研究,因爲以前已經打包過現成的Linux可執行程序出去,就考慮直接打包現有的dll。api
1.Docker build 鏡像打包bash
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)。http://www.javashuo.com/article/p-kubnkmfy-gg.html
4.Netcoreapi運行失敗
這是一個很奇怪的問題,最終在Stack Overflow上找到答案,dockerfile中必須設置workdir,不設置就會報這個錯。而這個問題在win平臺的docker中是沒問題的。
'/proc/1/map_files' is denied
參考連接:
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