.NET Core微服务之ASP.NET Core on Docker
<p><em><strong>Tip:</strong> </em>此篇已加入.NET Core微服务基础系列文章索引 和 .NET Core on K8S学习实践系列文章索引,可以点击查看更多微服务或容器化技术相关系列文章。</p><h1>一、Docker极简介绍</h1>
<h2>1.1 总体介绍</h2>
<p><img style="display: block; margin-left: auto; margin-right: auto" src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726221105300-1650411740.png" alt="" width="248" height="216"></p>
<p> Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个<span style="text-decoration: underline; color: rgba(255, 0, 0, 1)"><em><strong>轻量级、可移植的容器</strong></em></span>中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。</p>
<blockquote>
<p><strong>简而言之> </strong>容器是一个打包了应用服务的环境,它是一个<strong><span style="text-decoration: underline">轻量级的虚拟机</span></strong>,每一个容器由一组特定的应用和必要的依赖库组成。</p>
</blockquote>
<p> Docker和传统虚拟化之间最大的区别在于:<strong><span style="text-decoration: underline">容器是在操作系统层面上实现虚拟化,即直接复用本地主机的操作系统</span></strong>;而传统虚拟化则是在硬件层面实现,如VMware vShpere, Xen及Citrix等。</p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180727095822404-417794438.png" alt=""></p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180727095831796-208094249.png" alt=""></p>
<h2>1.2 Docker结构</h2>
<p> Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。</p>
<p> Docker 容器通过 Docker 镜像来创建。</p>
<p> 容器与镜像的关系类似于<span style="text-decoration: underline"><strong>面向对象编程中的对象与类</strong></span>。 </p>
<p> Docker的架构如下图所示,Client 通过接口与Server进程通信实现容器的构建,运行和发布。Client和Server可以运行在同一台集群,也可以通过跨主机实现远程通信。</p>
<p><img style="display: block; margin-left: auto; margin-right: auto; width: 680px; height: 355px" src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726222640794-679564755.jpg" alt=""></p>
<p> 具体详细内容,请浏览:《几张图帮你理解Docker基本原理及快速入门》</p>
<h1>二、Docker的安装</h1>
<p> (1)准备一台Linux主机,这里以CentOS 7.2为例。当然,你也可以使用Windows,不过你得确保是Windows 10 pro版本及以上,且安装了Hyper-V等一系列的相关软件。</p>
<p> (2)安装docker</p>
<p> # yum install docker</p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726223251675-409859616.png" alt="" width="482" height="307"></p>
<p> (3)启动docker服务</p>
<p> # systemctl start docker.service</p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726223414820-138794994.png" alt="" width="642" height="45"></p>
<p> (4)配置开机启动并验证</p>
<p> # systemctl enable docker.service</p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726223533171-1855330570.png" alt="" width="855" height="60"></p>
<p> 验证:查看docker版本信息 </p>
<p> # docker version</p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726223618190-2049562782.png" alt="" width="545" height="325"></p>
<p> (5)配置docker加速器 => 原因你懂得,不设置慢死你,云服务器除外</p>
<p> # vim /etc/docker/daemon.json</p>
<blockquote>
<p>{</p>
<p>"registry-mirrors": ["https://d8b3zdiw.mirror.aliyuncs.com"]</p>
<p>} </p>
</blockquote>
<p> 然后重启docker服务</p>
<p> # systemctl daemon-reload</p>
<p> # systemctl restart docker</p>
<p> (6)Hello World</p>
<p> # docker run hello-world</p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726223924295-2078865923.png" alt="" width="629" height="359"></p>
<h1>三、ASP.NET Core on Docker配置</h1>
<p> (1)拉取dotnet/aspnetcore的最新镜像,这里以aspnetcore 2.0为例</p>
<p> # docker pull microsoft/aspnetcore:2.0</p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726224228324-1489528676.png" alt="" width="541" height="138"></p>
<p> PS:如果要拉取最新版本(比如.net core 2.1),可以将版本号改为aspnetcore:<strong>latest</strong></p>
<p><strong> </strong>如果你想要拉取更多microsoft的镜像,那么搜索一下把:# docker search microsoft</p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726224415557-1720987293.png" alt="" width="741" height="322"></p>
<p> 拉取了不想要的镜像,那么删除一个吧,如:# docker rmi imagesID</p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726224515396-2123967148.png" alt="" width="494" height="101"></p>
<p> 拉取之后,验证一下是否拉取成功了:# docker images</p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726224602787-1973372153.png" alt="" width="680" height="57"></p>
<p> (2)现在我们进入VS中为我们的一个ASP.NET Core WebAPI编辑一个Dockerfile</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"># 父镜像
FROM microsoft</span>/aspnetcore:<span style="color: rgba(128, 0, 128, 1)">2.0</span><span style="color: rgba(0, 0, 0, 1)">
# 设置工作目录
WORKDIR </span>/<span style="color: rgba(0, 0, 0, 1)">app
# 复制发布文件到</span>/<span style="color: rgba(0, 0, 0, 1)">app下
COPY . </span>/<span style="color: rgba(0, 0, 0, 1)">app
# 设置端口
EXPOSE </span><span style="color: rgba(128, 0, 128, 1)">8810</span><span style="color: rgba(0, 0, 0, 1)">
# 使用dotnet Manulife.DNC.MSAD.NB.AgentService.dll来运行ASP.NET Core项目,注意大小写
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)">Manulife.CD.MSAD.NB.AgentService.dll</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)">--server.urls</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)">http://*:8810</span><span style="color: rgba(128, 0, 0, 1)">"</span>]</pre>
</div>
<p> (3)发布这个ASP.NET Core WebAPI,并将Release文件传送到Linux服务器中(你可以选择xFTP或者WinScp等工具)</p>
<p> <img style="width: 495px; height: 305px" src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726225348887-274300204.png" alt=""></p>
<p> (4)进入上图的AgentService目录中,开始打包docker镜像</p>
<p> # docker build -t agentservice-container:1.0 . => <span style="color: rgba(255, 255, 255, 1); background-color: rgba(255, 0, 0, 1)">不要忘记后面还有一个点.</span></p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726225539354-340026973.png" alt="" width="552" height="237"></p>
<p> 此刻再次验证:# docker images</p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726225642114-1886531538.png" alt="" width="535" height="57"></p>
<p> (5)万里长征最后一步:运行docker</p>
<p> # docker run --name agentservice -d -p 8810:8810 agentservice-container:1.0</p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726225731111-755289091.png" alt="" width="793" height="34"></p>
<p> 这里的两个端口号分别是宿主机和容器的映射,前一个是你在外部访问的端口号,后一个是你要映射到docker容器中的端口号,切记和我们在Dockerfile中暴露出来的端口号保持一致。</p>
<p> <em><strong>PS:</strong></em>这里如果docker run失败后再次运行会提示名称已存在,可以使用以下命令来删除容器</p>
<p> # docker rm -f </p>
<p> 如果想要docker容器在非正常退出后自动重启,可以加上--restart选项,例如下面:</p>
<p> # docker run --name agentservice -d -p 8810:8810 agentservice-container:1.0 --restart=always</p>
<p> (6)验证docker运行效果</p>
<p> 方式一:在宿主机验证</p>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726230508376-1010695496.png" alt=""></p>
<p> 方式二:在远程客户端通过浏览器访问</p>
<p> <img style="width: 635px; height: 345px" src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726230516068-774247915.png" alt=""></p>
<h1>四、Supervisor守护进程</h1>
<p> <img src="https://images2018.cnblogs.com/blog/381412/201807/381412-20180726231305535-528287816.jpg" alt="" width="423" height="235"></p>
<p> 此部分主要针对于在Linux上的dotnet core应用程序,保证程序在异常或者是电脑重启的时候仍然能够正常访问。大家可以浏览杨晓东的《ASP.NET Core Linux下为dotnet创建守护进程》以及focus-lei的《在docker上运行.net core程序》来学习,这里就不再赘述了。</p>
<h1>参考资料</h1>
<p>(1)菜鸟教程,《Docker教程》</p>
<p>(2)杨晓东,《ASP.NET Core Docker部署》,《ASP.NET Core Linux下为dotnet创建守护进程》</p>
<p>(3)李朝强,《Docker打包ASP.NET Core应用,在CentOS上运行》</p>
<p>(4)圣杰,《.NET Core容器化@Docker》</p>
<p>(5)focus-lei,《在Docker上运行.net core程序》</p>
<p>(6)Esofar,《CentOS7 部署 ASP.NET Core应用程序》</p>
<p> </p>
<div id="Copyright">
<p>作者:周旭龙</p>
<p>出处:http://edisonchou.cnblogs.com</p>
<p>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。</p>
</div>
</div>
<div id="MySignature" role="contentinfo">
<div align="center"><img border="0" src="http://service.t.sina.com.cn/widget/qmd/2068032061/d643d182/10.png"></div><br><br>
来源:https://www.cnblogs.com/edisontalk/p/aspnetcore_on_docker_foundation.html
頁:
[1]