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