.NET 6 从0到1使用Docker部署至Linux环境
<p></p><h2 id="前言">前言</h2>
<p>作为一名.Net菜鸟开发者,平时对Linux接触的并不多,项目部署这一块都是运维小哥顶着,但是作为混迹在云原生项目组的人咱也不能什么都不知道,该掌握的知识还是要懂的,所以借着这次机会,梳理一下项目部署这块的知识点。如果在阅读的过程中发现有什么不合理的地方,还请多多指教!<br>
</p>
<h2 id="环境准备">环境准备</h2>
<p>VS2022<br>CentOS 7<br>Docker Desktop<br>.NetCore 6.0<br>Xshell 7<br>
</p>
<h2 id="net-core项目准备">.NET Core项目准备</h2>
<p></p>
<h3 id="1首先我们先创建一个空的aspnet-core-web应用">1.首先我们先创建一个空的ASP.NET Core Web应用</h3>
<p><img src="https://s2.loli.net/2022/05/23/2we3nMOPlrhigWt.png" alt="image _62_.png" loading="lazy"><br><br>
项目启用Docker支持,然后会生成一个Dockerfile文件<br><br>
<img src="https://s2.loli.net/2022/05/23/SFUHdpIelTO45xq.png" alt="image _63_.png" loading="lazy"><br><br>
我们来解析以下Dockerfile文件里面的内容与流程<br><br>
<img src="https://s2.loli.net/2022/05/23/EVzbrDOFARGBSeP.png" alt="image _64_.png" loading="lazy"><br><br>
对多阶段构建感兴趣的同学可以移步官网 使用多阶段构建</p>
<p></p>
<h3 id="2我们可以先在本地将项目构建成镜像看看效果">2.我们可以先在本地将项目构建成镜像看看效果</h3>
<p>打开PowerShell 进入项目解决方案目录路径<br><br>
<img src="https://s2.loli.net/2022/05/23/CJygvNV5HkEuaP2.png" alt="image _65_.png" loading="lazy"><br><br>
<img src="https://s2.loli.net/2022/05/23/jiBEq2GlYcbM83F.png" alt="image _66_.png" loading="lazy"><br><br>
接下来我们将项目打包成镜像:<br><code>docker image build -f ./NetCoreWeb/Dockerfile -t aspnetcore:latest .</code><br><br>
<img src="https://s2.loli.net/2022/05/23/oehj9TEyOMfpVwD.png" alt="image _67_.png" loading="lazy"><br><br>
<strong>注</strong>:这里使用 <code>docker build -t aspnetcorewin .</code>命令也可以,只不过有一些坑,遇到问题了可以在评论区交流<br><br>
打包完成,我们可以使用Docker命令来查看镜像:<br><code>docker images</code><br><br>
<img src="https://s2.loli.net/2022/05/23/rVFlCMbR2tXBmjZ.png" alt="image _68_.png" loading="lazy"><br><br>
我们也可以使用Docker Desktop客户端查看镜像<br><br>
<img src="https://s2.loli.net/2022/05/23/Zex6kNHMFAngYQf.png" alt="image _69_.png" loading="lazy"><br>
</p>
<h3 id="3接下来我们将镜像run起来构造出一个容器">3.接下来我们将镜像run起来,构造出一个容器:</h3>
<p><code>docker run --name=aspnetcorewin -p 8801:80 -d aspnetcorewin</code></p>
<ul>
<li>--name :指定容器名称。</li>
<li>--p :指定容器端口。</li>
<li>--d :指定容器后台运行。</li>
</ul>
<p><img src="https://s2.loli.net/2022/05/23/Gl6CuV7U48kASLY.png" alt="image _70_.png" loading="lazy"><br><br>
查看正在运行的镜像:<br><code>docker ps</code><br><img src="https://s2.loli.net/2022/05/23/eRGIM9T6BgukXYU.png" alt="image _71_.png" loading="lazy"><br><br>
<img src="https://s2.loli.net/2022/05/23/BPxErjLwoy4qS6f.png" alt="image _72_.png" loading="lazy"><br><br>
我们直接本地访问我们映射的端口:localhost:8801<br><img src="https://s2.loli.net/2022/05/23/Fxq9ZD86AaOoG7K.png" alt="image _73_.png" loading="lazy"><br>到这里我们在window上已经可以成功访问我们到项目了<br>接下来我们先对我们Linux服务器的环境进行配置,方便后续部署项目<br>
</p>
<h2 id="linux环境配置">Linux环境配置:</h2>
<p>使用XShell或其他工具连接上我们的Linux服务器<br><img src="https://s2.loli.net/2022/05/23/txMKaPb4igsQFTd.png" alt="image _77_.png" loading="lazy"><br>
</p>
<h3 id="1配置yum">1.配置yum</h3>
<p></p>
<h4 id="更新yum包">更新yum包</h4>
<blockquote>
<p>sudo yum update</p>
</blockquote>
<p></p>
<h4 id="安装yum-utils-用来管理yum源">安装yum-utils 用来管理yum源</h4>
<blockquote>
<p>sudo yum install -y yum-utils</p>
</blockquote>
<p></p>
<h4 id="查看资源库中有没有安装过的docker-rpm包">查看资源库中有没有安装过的docker rpm包</h4>
<blockquote>
<p>yum list installed | grep docker</p>
</blockquote>
<p>如果之前安装过可以不用安装,如果想重新安装也可以<br>执行卸载老版本docker及其相关依赖即可:</p>
<blockquote>
<p>sudo yum remove docker docker-common container-selinux docker-selinux docker-engine</p>
</blockquote>
<p></p>
<h3 id="2安装docker">2.安装docker</h3>
<p><code>yum -y install docker-ce</code><br><img src="https://s2.loli.net/2022/05/23/5QybZ1VTuJO6m7I.png" alt="image _78_.png" loading="lazy"><br><br>
如果出现 No package docker-ce available 错误,这里我们只需要设置稳定的仓库,添加yum源即可。</p>
<blockquote>
<p>sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo</p>
</blockquote>
<p><img src="https://s2.loli.net/2022/05/23/sjId3gCbaJYemht.png" alt="image _80_.png" loading="lazy"><br><br>
然后再执行安装Docker命令进行安装就可以了。 <br><img src="https://s2.loli.net/2022/05/23/Dtf1Iyxa7wBeuL4.png" alt="image _81_.png" loading="lazy"><br><img src="https://s2.loli.net/2022/05/23/CUGjdlky8IhesSF.png" alt="image _82_.png" loading="lazy"><br><br>
我当时安装的时候踩了一些坑<br>1.“sqlite3.OperationalError: database is locked” 这里可能是我之前中断过yum的更新导致yum进程被锁了,最后把yum更新进程杀掉就可以了。<br>2.安装过程中一直停留在running transaction<br>
</p>
<h3 id="3启动docker">3.启动docker</h3>
<p>启动docker<br><code>sudo systemctl start docker</code><br><br>
设置docker开机自启动<br><code>sudo systemctl enable docker</code><br><br>
查看docker是否运行<br><code>systemctl status docker</code><br><br>
<img src="https://s2.loli.net/2022/05/23/9elpwLOPgjHGZzJ.png" alt="image _83_.png" loading="lazy"><br>
</p>
<h3 id="4安装netcore-sdk-60">4.安装.NetCore SDK 6.0</h3>
<p></p>
<h4 id="安装包配置">安装包配置</h4>
<blockquote>
<p>sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm</p>
</blockquote>
<p><img src="https://s2.loli.net/2022/05/23/zclaYwpHu6QdTvO.png" alt="image _84_.png" loading="lazy"><br>
</p>
<h4 id="执行安装">执行安装</h4>
<p><code>sudo yum install dotnet-sdk-6.0</code><br><img src="https://s2.loli.net/2022/05/23/UsEzdcYjQBkFJDZ.png" alt="image _85_.png" loading="lazy"><br>安装可能会花费些时间,请耐心等待哦!<br><br>
安装完成<br><img src="https://s2.loli.net/2022/05/23/WIvYmEw6uLHVybq.png" alt="image _86_.png" loading="lazy"><br>
</p>
<h4 id="验证安装环境">验证安装环境</h4>
<p><code>dotnet --info</code><br><img src="https://s2.loli.net/2022/05/23/uvzULlYoO9JgQbA.png" alt="image _87_.png" loading="lazy"><br>OK 环境配置完成!</p>
<p></p>
<h2 id="docker部署netcore-项目">Docker部署.NetCore 项目</h2>
<p></p>
<h4 id="调整dockerfile文件属性">调整Dockerfile文件属性</h4>
<p>我们先将Dockerfile文件属性复制到输出目录的方式调整为** 如果较新则复制**,方便我们部署<br><img src="https://s2.loli.net/2022/05/23/yuflcgZSH8YXAzN.png" alt="image _88_.png" loading="lazy"></p>
<p></p>
<h4 id="项目打包拷贝至linux服务器上">项目打包,拷贝至Linux服务器上</h4>
<p>接下来我们将项目打包,然后拷贝到linux服务器编译发布<br>在linux上创建一个文件夹 NetCoreProgram<br><img src="https://s2.loli.net/2022/05/23/mjiYCIzGuLOE4pl.png" alt="image _89_.png" loading="lazy"><br><br>
然后将我们打包好的项目拷贝至文件夹中<br>使用linux命令rz(会弹出一个上传窗口)<br><img src="https://s2.loli.net/2022/05/23/MNxULQv9biJeAjT.png" alt="image _90_.png" loading="lazy">--<br><img src="https://s2.loli.net/2022/05/23/1SCHynoJeE4IGZU.png" alt="image _91_.png" loading="lazy"><br>
</p>
<h4 id="运行dockerfile">运行Dockerfile</h4>
<p>进入解压完成的文件夹内查看文件:<br><code>unzip -d NetCoreWeb NetCoreWeb.zip</code><br><img src="https://s2.loli.net/2022/05/23/pkASdy8jMsEoGRe.png" alt="image _92_.png" loading="lazy"><br>接下来按照我们上述在window下将项目编译成镜像的操作,现在在linux环境下在执行一遍:<br>编译成镜像(注意要在对应文件目录下执行命令):<br><code>docker image build -f ./NetCoreWeb/Dockerfile -t aspnetcore:latest .</code><br><br>
<img src="https://s2.loli.net/2022/05/23/9PWBA6qiaHko5Zg.png" alt="image _93_.png" loading="lazy"><br><br>
<img src="https://s2.loli.net/2022/05/23/YTMkAtpXVqsROBz.png" alt="image _94_.png" loading="lazy"><br><br>
编译完成,查看镜像:<br><code>docker images</code><br><img src="https://s2.loli.net/2022/05/23/8rXZjeLPDq1OGyQ.png" alt="image _95_.png" loading="lazy"><br><br>
将镜像run起来生成容器:<br><code>docker run --name=aspnetcore -p 8805:80 -d aspnetcore</code><br><img src="https://s2.loli.net/2022/05/23/jgPNqvWQzGdJoAu.png" alt="image _96_.png" loading="lazy"><br><br>
查看容器是否生成成功:<br><code>docker ps</code><br><img src="https://s2.loli.net/2022/05/23/waV8uZPovyeriJn.png" alt="image _97_.png" loading="lazy"><br><br>
接下来我们使用curl命令来访问程序:<br><code>curl localhost:8805</code><br><img src="https://s2.loli.net/2022/05/23/FyiIujvB7wz9TDb.png" alt="image _98_.png" loading="lazy"><br>OK,访问正常,到此我们的项目就部署完成啦!<br>
</p>
<h4 id="使用外网访问">使用外网访问</h4>
<p>使用服务器地址加开放的端口号:<br>本机(windows)直接访问服务器地址 http://xxx.xxx.xxx.xx:8805/<br><img src="https://s2.loli.net/2022/05/23/NpAPq4nj6d7xO3U.png" alt="image _99_.png" loading="lazy"><br>OK ,访问成功<br>这里使用外网访问可能会遇到一些问题:<br>1.需要注意服务器的防火墙以及开放的端口<br>2.由于我这里是腾讯云的服务器,在云上它还有另外的一套安全组策略,也就是云上的防火墙,这里也需要开放端口<br>到此,我们的项目就部署完成啦!</p>
<p></p>
<h2 id="结尾">结尾</h2>
<p>当然,这里只是用了最简单的项目用来部署,实际情况中已经上了CICD与k8s了,但是如果你连最基础的都玩不转的话,遇到更复杂的情况只能寸步难行哈。<br>最后,希望同学们能够举一反三,要是遇到实在难以解决的问题,没事,咱们给运维小哥上上对抗,解决问题指日可待!</p>
</div>
<div id="MySignature" role="contentinfo">
<div>作者:Mamba8-24</div>
<div>出处:https://www.cnblogs.com/Mamba8-24/</div>
<div>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。 </div><br><br>
来源:https://www.cnblogs.com/Mamba8-24/p/16300975.html
頁:
[1]