让.NetCore程序跑在任何有docker的地方
<h2>一.分别在Windows/Mac/Centos上安装Docker</h2><div>Windows上下载地址:https://docs.docker.com/docker-for-windows/install/(window上安装的常见问题和解决方案请参考下方步骤六)</div>
<div>Mac上下载地址:https://hub.docker.com/editions/community/docker-ce-desktop-mac</div>
<div>Centos上安装Docker请参考我上篇文章链接:https://www.cnblogs.com/peyshine/p/12915317.html</div>
<div> </div>
<div>
<h2>二.打开vs 新建一个Web程序</h2>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175628590-2000781388.png" alt=""></div>
<div>这里选择启动docker支持,主要是为了能够自动生成dockerfile文件,如果忘记勾选了也没关系,也可以右键解决方案,点击‘添加’,选择‘docker支持’,vs也会自动为我们生成dockerfile,大概长这个样子</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175638233-1481088145.png" alt=""></div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175645304-465241940.png" alt=""></div>
<h3>对dockerfile文件解释说明:</h3>
<div style="margin-left: 30px"><strong>1.FROM</strong></div>
<div style="margin-left: 30px">通过FROM指令来设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上进行拉取</div>
<div style="margin-left: 30px"><strong>2.WORKDIR</strong></div>
<div style="margin-left: 30px">通过workdir指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值</div>
<div style="margin-left: 30px"><strong>3.COPY</strong></div>
<div style="margin-left: 30px">通过COPY指令来从指定路径拷贝一个文件或目录到容器的指定路径中</div>
<div style="margin-left: 30px"><strong>4.RUN</strong></div>
<div style="margin-left: 30px">RUN指令会在一个新的容器中执行任何命令,然后把执行后的改变提交到当前镜像,提交后的镜像会被用于Dockerfile中定义的下一步操作,RUN中定义的命令会按顺序执行并提交,这正是Docker廉价的提交和可以基于镜像的任何一个历史点创建容器的好处,就像版本控制工具一样</div>
<div style="margin-left: 30px"><strong>5.EXPOSE</strong></div>
<div style="margin-left: 30px">通过EXPOSE指令用来告诉Docker这个容器在运行时会监听哪些端口</div>
<div style="margin-left: 30px"><strong>6.ENTRYPOINT</strong></div>
<div style="margin-left: 30px">通过ENTRYPOINT指令我们指定在容器启动时要运行的应用程序</div>
<div> </div>
<div>关于dockerfile的更多用法可以参考:https://docs.docker.com/engine/reference/builder/</div>
<div> </div>
<div>
<h2>三.DotNet Core 程序在Windows Docker上的运行</h2>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175654009-1393034318.png" alt=""></div>
<div>直接在VS中选择以docker方式运行,VS的输出控制台就会打印以下信息内容</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175701389-1480700942.png" alt=""></div>
<h3>可以看到运行之前,VS先做了几个检查工作</h3>
<ul>
<li><span style="color: rgba(57, 57, 57, 1); font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", Helvetica, Tahoma, Arial, "Hiragino Sans GB", "Microsoft YaHei", 微软雅黑, SimSun, 宋体, Heiti, 黑体, sans-serif">windows上是否安装了Docker Desktop</span></li>
<li><span style="color: rgba(57, 57, 57, 1); font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", Helvetica, Tahoma, Arial, "Hiragino Sans GB", "Microsoft YaHei", 微软雅黑, SimSun, 宋体, Heiti, 黑体, sans-serif">Docker Desktop是否在运行</span></li>
<li><span style="color: rgba(57, 57, 57, 1); font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", Helvetica, Tahoma, Arial, "Hiragino Sans GB", "Microsoft YaHei", 微软雅黑, SimSun, 宋体, Heiti, 黑体, sans-serif">Docker Desktop的操作系统模式是否与项目的目标操作系统匹配</span></li>
<li><span style="color: rgba(57, 57, 57, 1); font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", Helvetica, Tahoma, Arial, "Hiragino Sans GB", "Microsoft YaHei", 微软雅黑, SimSun, 宋体, Heiti, 黑体, sans-serif">指定需要的镜像本地是否存在,不存在的就会进行拉取</span></li>
<li><span style="color: rgba(57, 57, 57, 1); font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", Helvetica, Tahoma, Arial, "Hiragino Sans GB", "Microsoft YaHei", 微软雅黑, SimSun, 宋体, Heiti, 黑体, sans-serif">检查完了之后就是打包镜像和运行容器</span></li>
</ul>
<h2> </h2>
<h2>四.打包发布镜像到https://hub.docker.com/</h2>
<div>选择发布到Docker hub,输入自己的账号密码,没有的话可以注册一个</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175715758-160577731.png" alt=""></div>
<div> </div>
<div>点击发布之后,输出控制台可以看到有build打包的过程</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175722614-425525755.png" alt=""></div>
<div> </div>
<div>发布完成之后,控制台会有对应的提示信息,已经成功推送带标记的‘latest’的Docker镜像</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175729214-1285131042.png" alt=""></div>
<div> </div>
<div>进入Docker hub上,在自己的账户的存储库下面会多处一个镜像文件,也就是刚刚推送过去的</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175737918-3437005.png" alt=""></div>
<div> </div>
<div>点击进入,可以看到拉取的命令</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175745504-1169049112.png" alt=""></div>
<div> </div>
<div>在powershell中拉取自己的镜像</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175755774-716059716.png" alt=""></div>
<div> </div>
<div>运行容器,运行成功会返回一个长的字符串,通过docker ps指令,可以查看容器已经成功运行起来了</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175802429-827876173.png" alt=""></div>
<div> </div>
<div>那么这个镜像是否能在linux上拉取并运行呢?答案是否定的,因为在添加docker支持时候,我这边选了平台支持为windows,如图</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175808849-1779526955.png" alt=""></div>
<div> </div>
<div>步骤四:只是玩一下怎么打包推送镜像文件,不关注的可以直接跳过步骤四</div>
<div> </div>
<div>
<h2>五.DotNet Core 程序在Centos Docker上的运行</h2>
<div>重新在VS中添加一个dockerfile,这次选择linux平台的</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175814738-1823328961.png" alt=""></div>
<div>这次我们需要修改下dockerfile文件</div>
<div>因为我们提前编译并且发布出来了文件,所以在dockerfile中就不需要这些步骤了</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175821586-446819968.png" alt=""></div>
<div>贴一下dockerfile文件</div>
<div>
<div class="cnblogs_code">
<pre>FROM mcr.microsoft.com/dotnet/core/aspnet:<span style="color: rgba(128, 0, 128, 1)">3.1</span>-buster-slim AS <span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">
WORKDIR </span>/<span style="color: rgba(0, 0, 0, 1)">app
EXPOSE </span><span style="color: rgba(128, 0, 128, 1)">80</span><span style="color: rgba(0, 0, 0, 1)">
COPY . </span>/<span style="color: rgba(0, 0, 0, 1)">app
ENTRYPOINT [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dotnet</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">WebApp_Docker.dll</span><span style="color: rgba(128, 0, 0, 1)">"</span>]</pre>
</div>
</div>
<div> </div>
<div>发布后将Release文件下所有文件上传到centos上,然后执行以下命令打包镜像</div>
<div>
<div class="cnblogs_code">
<pre>docker build -t docker_web_test:<span style="color: rgba(128, 0, 128, 1)">1.0</span> .</pre>
</div>
</div>
<div>后面的点可以打印出具体的执行步骤细节</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175831645-1313936359.png" alt=""></div>
<div> </div>
<div>通过指令验证打包结果:# docker images</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175848860-117181002.png" alt=""></div>
<div> </div>
<div>最后运行容器</div>
<div>
<div class="cnblogs_code">
<pre>docker run --name docker_web_test -d -p <span style="color: rgba(128, 0, 128, 1)">7788</span>:<span style="color: rgba(128, 0, 128, 1)">80</span> docker_web_test:<span style="color: rgba(128, 0, 128, 1)">1.0</span></pre>
</div>
</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175856771-2093366239.png" alt=""></div>
<div>可以看到容器已经运行起来,并且可以输出页面内容。</div>
<div> </div>
<div>
<h2>六.可能遇见的错误解决方案以及小提示:</h2>
<div>1.在window上安装docker时需要勾选上Hyper-V</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175908375-1420899849.png" alt=""></div>
<div> </div>
<div>2.如果在运行容器过程中依然提示错误:“The virtual machine could not be started because a required feature is not installed”,那就需要检查bios中的虚拟功能,拿我的华硕主板和inter处理器来示范,将Inter(VMX) Virtualization Tecjnology 的值设置为 Enabled</div>
<div> <img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175918933-865934742.jpg" alt=""></div>
<div> </div>
<div>然后保存设置退出即可</div>
<div> </div>
<div>3.当我们在windows上拉取镜像碰到提示镜像在当前操作系统不支持的时候,可以在linux和Windows容器之间切换。如图</div>
<div><img src="https://img2020.cnblogs.com/blog/645287/202005/645287-20200519175928378-803418046.png" alt=""></div>
</div>
</div>
</div>
</div>
<div> </div>
<p><img id="uploading_image_40499" src="https://common.cnblogs.com/images/loading.gif" alt=""></p>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
<div class="sign_pesyhine" style="background: none repeat scroll 0 0 #e7f4ff;
margin: 0 15px 0 0;
padding: 15px;
color: #666;
font-size: 13px;
border: 1px solid #c9ddfa;">
<span>作者:沛山<br></span>
<span>出处: http://www.cnblogs.com/peyshine/</span><br>
<span style="font-size:16px; color:red;">领取资料:下方公众号回复"111",可获取300GB精心准备的编程学习资料,视频教程,电子书</span>
<div>
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如果觉得对你有点帮助的话,可以点一下右下角的【推荐】你的鼓励是我的动力。希望能够持续的为大家带来好的技术文章,关注我吧!
</div>
<img style="width:100%; margin-top: 15px;" src="https://images.cnblogs.com/cnblogs_com/peyshine/1771936/o_200523154337qrcode.jpg" alt="https://images.cnblogs.com/cnblogs_com/peyshine/1771936/o_200523154337qrcode.jpg">
</div><br><br>
来源:https://www.cnblogs.com/peyshine/p/12918315.html
頁:
[1]