[跨平台系列三Docker篇]:ASP.NET Core应用

如果你是老张的忠实读者的话,如果是从博客园就开始看我的文章的话,如果后期也一直看我公众号的话,应该就知道其实我一直在根据一条无形的教学线路来讲解的,,如果你真的是想好好学的话,请好好看看我之前的文章吧。

从题目我们可以看的出,今天是五部曲的第三部,你可能会好奇,为啥没有见到前两部呢?这里我简单说下:

1、跨平台第一部曲:MySql

如果你看我的所有开源项目,应该能发现我已经全部迁移到了Mysql数据库了,这里不是说SqlServer就不是不跨平台了,只是MySql用着可能更好些,当然,如果你是买的单独数据库服务器,比如阿里云的RDS数据库,Azure DataBase数据库的话,那就完全另说了。

当然,不仅仅迁移过去就行了,这只是一个开头,后期还是有很多东西,需要自己好好研究,比如缓存,数据一致性,索引,存储,锁,队列等等知识,只有用到了才会打开进一步专研的大门。

2、跨平台第二部曲:Linux

既然要跨平台,那多平台的学习就是基础中的基础,重中之重了,相信每个人windows服务器已经玩儿到飞起了,所以Linux的学习和研究就很有必要。

我之前有篇文章已经对我的所有项目做了迁移,还是比较详细的:

《[最全操作指南] 在线六个项目全部迁移Linux》

还是那句话,只有用了,才会去研究,螃蟹这东西,如果没吃过,永远不会知道是酸的还是甜的。因为这个Linux迁移基础的比较简单,或者说是一个长期学习的东西,所以一篇文章就搞定了。

3、剩下三部曲

从今天开始呢,我打算用三篇讲解下Docker相关内容,打算把我六个在线项目都迁移到Docker上,等我完全搞懂了,就开始录视频说说,虽然我一直认为官网是最好的老师,因为今天不会讲Docker的基本知识,所以到时候我会在视频教程里详细说

说完Docker,就说一说CI/CD相关的内容,应该就是基于Docker+Jenkins的吧。

最后一部曲就是K8S一把梭了。

(PS:我的讲解速度,取决于各位的素质三连的速度了????)


好啦,今天就说说Docker在netCore中的从入门到部署吧!

1、服务器与工具准备

首先我们需要一个服务器,以后我都是用的Linux了,所以还是果断的买了一个CentOS系统的服务器,相关配置:

本次所用到的工具主要有:

1、git:提供源代码管理;

2、docker:容器服务;

3、dotnetcore:SDK环境;

4、nginx:服务器代理;

购买然后登录上服务器,我们开始一一安装。

2、安装辅助工具

1、更新系统 [可选]

新买的系统,我们可以更新一下,毕竟有些包或者依赖最新的还是更好的,不过也不是必须的。

 sudo yum update

预计310M,预计10~20分钟

2、安装Git [可选]

我们如果要构建镜像的话,肯定需要发布好的问题+Dockerfile,那发布有三种方式:
第一种就是本地发布,拷贝到服务器,build 镜像;

第二种是本地发布,然后本地build,推到仓库里,服务器拉取;

第三种就是服务器PULL代码,然后服务器发布,再build;

我习惯了第三种,所以我这里安装Git了。

sudo yum -y install git

预计5m,1~5分钟

3、安装Nginx [必要]

我们创建好的容器run后,Docker会自己守护这个进程,但是还是需要一个服务器来做代理和反向代理,一般常用的就是Nginx了:

sudo yum install nginx 

预计14m,1~5分钟

启用和启动服务:

sudo systemctl enable nginx
sudo systemctl start nginx

4、安装Dotnet SDK [核心]

每台计算机只需要执行一次此操作。

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

sudo yum install dotnet-sdk-3.1 

预计119M,20~30分钟,这个时间比较长,所以你可以考虑在本地发布好,ftp到服务器,当然如果创建了sdk,以后就省事儿了,反正各有利弊。

安装成功,测试一下版本:

dotnet --list-sdks


完成!

到了这里,我们辅助工具已经安装完成了,接下来,重头戏就来了——Docker安装。

3、安装Docker环境

1、安装Docker源

首先,我们可以先执行下卸载命令,如果你之前安装过,或者系统自带了,需要卸载干净:

sudo yum remove docker-ce

然后我们就可以安装指定的源了,有官方版本和阿里云版本,我这里尝试使用阿里云版本的吧,听说会快一些。

Step 1: 安装必要的一些系统工具
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2

Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

Step 3: 更新并安装Docker-CE
    sudo yum makecache fast (可选)
    sudo yum -y install docker-ce

Step 4: 开启Docker服务
    sudo service docker start

安装预计 5 分钟

设置docker开机启动

systemctl enable docker

启动docker

systemctl start docker

查看版本

docker --version

2、测试Hello World

检查docker是否可以正常运行(运行hello-world镜像,如果本机没有hello-world镜像,系统会自动拉取hello-world镜像)

docker run hello-world

如果本地没有改镜像,会自动从远程仓库拉取,然后再生成容器。

这个时候,我们可以来检查一下:

当前服务器有哪些镜像:

docker images

可以看到,这个就是刚刚我们拉取的镜像:名称是hello-world,ID是bf756fb1ae65,大小13.3k的镜像。

那如何查看有哪些容器呢:

docker ps -a

这个就是刚刚我们看到有输出内容的容器:容器ID是4fb4bdc352ff,镜像是hello-world,状态是已退出。

PS:这里的镜像就像我们定义了一个hello的Class类,
容器呢,就是这个class类生成的对象,当然可以创建很多个。

这个时候,我们的环境已经已经搞好了,接下来就是重中之重,将我们的项目发布镜像文件了。

4、发布自己的镜像

1、添加Docker支持

这个操作是很简单的,我们打开Blog.Core项目,选择Web层,然后添加Docker支持:

会生成一个Dockerfile的文件,默认的信息比较多,目前我就来个最简单的精简版:

FROM swr.cn-south-1.myhuaweicloud.com/mcr/aspnet:3.1-alpine 
WORKDIR /app
COPY . . 
EXPOSE 8081 
ENTRYPOINT ["dotnet", "Blog.Core.dll","-b","0.0.0.0"]

简介一下:

FROM:意思是我们的项目源镜像是哪个;

WORKDIR:镜像的工作目录;

COPY:复制文件(将Dockerfile所在目录下文件复制到镜像中的工作目录中)
EXPOSE:容器要开放的端口(我们用.NETCORE的8081端口)
ENTRYPOINT:为容器启动后要执行的命令 (这里将执行dotnet Blog.Core.dll命令)

然后右键,始终属性、始终复制到输出(bin)目录:

接下来就是上次到Github了。

2、发布

我们在服务器用Git将代码PULL下来,然后执行发布命令,我用一个批处理文件,直接一键生成(主要是防止漏掉文件):

执行发布命令:

就可以看到生成好的发布文件夹.PublishFiles。

接下来就是docker 编译镜像了。

3、创建镜像

进入到我们的发布文件夹.PublishFiles文件夹下,我们测试一下这个文件是否正常:

dotnet Blog.Core.dll

可以看到已经正常的监听了8081端口,这里要注意一下,我们在Program.cs文件中,需要配置这样:

.UseUrls("http://*:8081")

否则的话,系统找不到我们对应的端口信息。

没问题后,开始build了,还是在当前文件夹下(记得那个点):

 docker build -t laozhang/apkimg .

其中laozhang/apkimg是我们的镜像名。

因为我们的Dockerfile是五步,所以这里也正好是5个Step。

然后查看机器上的镜像:

这里多了两个镜像,一个是我们的镜像ID为af75a6d4a8ad,大小146M的项目文件,一个是我们Dockerfile的源镜像。

4、推送镜像到Docker hub仓库

既然咱们有了镜像,如果每次使用都要build,肯定是不对的,咱们可以统一推送到Hub仓库里。

先注册
(注意注册的时候,第一个选项,这个Docker ID是我们创建的镜像的ID,

也就是laozhangisphi/apkimg的laozhangisphi)
当然如果不一样,你后期也可以自己做配置,不要方。

第二:验证完邮件后,登录,创建仓库

第三步:服务器镜像推送

然后登录账号

推送:

docker push laozhangisphi/apkimg:tagname

检查:

我们登录管理后台,查看结果

可以看到已经成功推送了,这样的话,我们就可以在任何的地方使用我的镜像啦。

docker pull laozhangisphi/apkimg:latest

现在我们有了镜像,那就可以创建容器了,因为有了容器才能运行。

5、生成并运行容器

生成容器

有了镜像,我们来生成一个容器:

docker run -it -p 8081:8081 laozhang/apkimg 

8081是我们的端口号,然后后边的laozhang/apkimg是我们的镜像名。

会看到输出内容,如果没有报错的话,就恭喜啦,退出当前进程,查看下有哪些容器:

这时候可以看到多了一个容器ID为53d047bb3a66,镜像是laozhang/apkimg的容器,不过我们的项目容器是退出状态,需要开启下:

docker start 53d047bb3a66

状态已经是运行中了,那怎么测试接口是否正常了呢,可以用curl命令:

curl http://localhost:8081/api/blog

如果到了这里,恭喜你,Docker部署NetCore基本已经搞定了,如果你想看看容器内的日志信息。

查看日志

直接输入命令:

docker logs 53d047bb3a66

其他常用命令

查看所有镜像 docker images

删除一个imageid的镜像
docker rmi [IMAE_ID]

#删除所有镜像
sudo docker rmi $(docker images -q)

#查看所有容器运行状态
docker ps -a
docker container ls -all

#删除一个containerid的容器(实例)
docker rm 6f0c67de4b72

#删除所有容器
docker rm $(sudo docker ps -a -q)

容器日志

#查看指定时间后的日志,只显示最后100行:
docker logs -f -t --since="2019-06-08" --tail=100 CONTAINER_ID

#查看某时间之后的日志:
docker logs -t --since="2019-06-08" CONTAINER_ID

#查看某时间段日志:
docker logs -t --since="2019-06-08" --until "2019-06-09" CONTAINER_ID

#查看最近30分钟的日志:
docker logs --since 30m CONTAINER_ID

过程

1、停止容器 docker stop 5ab35ebcb6e2

2、删除容器 docker rm  5ab35ebcb6e2

3、删除镜像 docker rmi 7567a38d491c

4、启动容器 docker start  685cb02f53

剩下最后一步了,nginx代理,因为我们的Docker已经守护了这个进程,所以我们不需要其他的守护进程的工作。

6、Nginx代理服务

进入/etc/nginx/文件夹

修改nginx.conf文件,这里你可以使用 vim ,也可以下载到本地,修改,然后再提交上去,看自己的需要了,反正vim也很简单,就是那几个命令:

vim xxx

i

:wq!

如果看不懂,还是下载本地修改吧。

修改的内容如下:

###### apk begin #######server { listen 9001;server_name localhost;location / {root html;proxy_pass http://localhost:8081;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection keep-alive;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_cache_bypass $http_upgrade;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;index index.html index.htm;}}###### apk end #######

接下来就是重启Nginx服务,首先可以检测语法错误:

nginx -t

nginx -s reload

这个时候,如果没报错,那恭喜,项目启动成功了!

http://192.144.227.46:9001/index.html

好啦,今天到这里已经完全说完了,整个过程大约2个小时,中间没发现什么问题,因为我有Linux的基础,所以总体还是很简单的,主要就是docker的那几个常用命令,需要看文档查一查。加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020牛客国庆集训派对day2 F题 Java大数处理

题目: 链接:https://ac.nowcoder.com/acm/contest/16913/F 来源:牛客网 The following code snippet calculates the sum of the areas of all the sub rectangular grid in a rectangular grid from (0,0) to (N,N)\ .(N,N) . Find an eff…

[JavaWeb-XML]XML_快捷查询方式(selector选择器,XPath)

快捷查询方式: 1. selector:选择器* 使用的方法:Elements select​(String cssQuery)* 语法:参考Selector类中定义的语法2. XPath:XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集&#…

[壹刊]Azure AD(四)知识补充-服务主体

一,引言又到了新的一周了,也到了我新的分享的时间了,还记得上一周立得Flag,其中 “保证每周输出一篇文章” ,让我特别“在意”(这里用词不太恰当)。主要是我的一个大学舍友,他突然问…

前缀和优化+计蒜客 泡咖啡

题目: 蒜头君想泡咖啡喝。现在他得到了 nn 份菜谱,每个菜谱上都给了两个数l,rl,rl,r代表温度区间在[l,r][l,r][l,r] 度泡出来的咖啡会很好喝。 可是菜谱太多了,蒜头君一度感到疑惑。经过思考之后他得出了一个结论:某个温度只要有 k 份或者更…

[JavaWeb-Servlet]Servlet_执行原理

执行原理&#xff1a; 1. 当服务器接受到客户端浏览器的请求后&#xff0c;会解析请求URL路径&#xff0c;获取访问的Servlet的资源路径2. 查找web.xml文件&#xff0c;是否有对应的<url-pattern>标签体内容。3. 如果有&#xff0c;则在找到对应的<servlet-class>全…

分享我在前后端分离项目中Gitlab-CI的经验

之前我分享了为ASP.NET Core后端搭建Gitlab-CI/CD实践&#xff0c;今天继续聊一聊为前后端分离搭建Gitlab-CI的额外经验。BeforeGitlab-ci是Gitlab提供的CI/CD特性&#xff0c;结合Gitlab简单友好的配置界面&#xff0c;能愉悦的在Gitlab界面查看管道执行流程&#xff0c;并自然…

最短路(遍历边)计蒜客—DD坐地铁

题目&#xff1a; C 城有 n 个站点&#xff0c; m 条双向地铁&#xff0c;每条地铁有一个 companyicompany_icompanyi​表示它的公司&#xff0c;如果连续乘坐同一家公司的地铁只要花 1元钱就好。DD现在想出门找萨摩耶玩&#xff0c;但是 DD 是贫困人口&#xff0c; 她想知道最…

[JavaWeb-Servlet]Servlet中的生命周期方法(init,service,destroy)

Servlet中的生命周期方法&#xff1a; Override public void init(ServletConfig servletConfig) throws ServletException {}1. 被创建&#xff1a;执行init方法&#xff0c;只执行一次* Servlet什么时候被创建&#xff1f;* 默认情况下&#xff0c;第一次被访问时&#xff0…

lin-cms-dotnetcore.是如何方法级别的权限控制(API级别)的

方法级别的权限控制&#xff08;API级别&#xff09;Lin的定位在于实现一整套 CMS的解决方案&#xff0c;它是一个设计方案&#xff0c;提供了不同的后端&#xff0c;不同的前端&#xff0c;而且也支持不同的数据库目前官方团队维护 lin-cms-vue,lin-cms-spring-boot,lin-cms-k…

线段树维护区间最大值+第 45 届(ICPC)亚洲区域赛(昆明)L题Simone and Graph Coloring

题意&#xff1a; 给你n个数的序列&#xff0c;当满足i<ji<ji<j andandand ai>aja_i>a_jai​>aj​时&#xff0c;这两个点之间有一条边&#xff0c;现在对点染色&#xff0c;要求每个点相邻的点颜色不同&#xff0c;问如何染色使得不同颜色数量最小。 题目…

[JavaWeb-Servlet]Servlet3.0注解配置

Servlet3.0&#xff1a; * 好处&#xff1a;* 支持注解配置。可以不需要web.xml了。* 步骤&#xff1a;1. 创建JavaEE项目&#xff0c;选择Servlet的版本3.0以上&#xff0c;可以不创建web.xml2. 定义一个类&#xff0c;实现Servlet接口3. 复写方法4. 在类上使用WebServlet注解…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(四)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

字符串相关

文章目录字符串基础字符串的存储标准库字符串匹配单串匹配多串匹配其他类型的字符串匹配问题字符串哈希Hash 的实现Hash 的分析与改进错误率多次询问子串哈希Hash 的应用字符串匹配允许 k次失配的字符串匹配最长回文子串最长公共子字符串确定字符串中不同子字符串的数量字典树 …

[JavaWeb-Servlet]IDEA与Tomcat的相关配置

IDEA与tomcat的相关配置 1. IDEA会为每一个tomcat部署的项目单独建立一份配置文件* 查看控制台的log&#xff1a;Using CATALINA_BASE: "C:\Users\fqy\.IntelliJIdea2018.1\system\tomcat\_itcast"2. 工作空间项目 和 tomcat部署的web项目* tomcat真正访问…

C#9.0 终于来了,您还学的动吗? 带上VS一起解读吧!

一&#xff1a;背景1. 讲故事好消息&#xff0c;.NET 5.0 终于在2020年6月10日发布了第五个预览版&#xff0c;眼尖的同学一定看到了在这个版本中终于支持了 C# 9.0&#xff0c;此处有掌声&#xff0c;太好了&#xff01;&#xff01;&#xff01;.Net5官方链接可以看到目前的C…

KMP模式串匹配+Compress Words CodeForces - 1200E

题意&#xff1a; 给你若干个字符串&#xff0c;答案串初始为空。第 iii 步将第 iii 个字符串加到答案串的后面&#xff0c;但是尽量地去掉重复部分&#xff08;即去掉一个最长的、是原答案串的后缀、也是第 iii个串的前缀的字符串&#xff09;&#xff0c;求最后得到的字符串…

.NET Core 反射获取所有控制器及方法上特定标签

有个需求&#xff0c;就是在. NET Core中&#xff0c;我们想在项目 启动时&#xff0c;获取LinCmsAuthorizeAttribute这个特性标签所有出现的地方&#xff0c;把他的参数&#xff0c;放入一个集合并缓存起来&#xff0c;以便后面使用此数据用于权限验证。我们通过反射获取所有控…

[JavaWeb-Servlet]Servlet的体系结构

Servlet的体系结构 Servlet -- 接口|GenericServlet -- 抽象类|HttpServlet -- 抽象类* GenericServlet&#xff1a;将Servlet接口中其他的方法做了默认空实现&#xff0c;只将service()方法作为抽象* 将来定义Servlet类时&#xff0c;可以继承GenericServlet&#xff0c;实现…

折半搜索+洛谷 P2962 [USACO09NOV]Lights G

题意&#xff1a; 有 n盏灯&#xff0c;每盏灯与若干盏灯相连&#xff0c;每盏灯上都有一个开关&#xff0c;如果按下一盏灯上的开关&#xff0c;这盏灯以及与之相连的所有灯的开关状态都会改变。一开始所有灯都是关着的&#xff0c;你需要将所有灯打开&#xff0c;求最小的按…

将数据从 SQL Server 导入 Azure Storage Table

点击上方蓝字关注“汪宇杰博客”导语最近有个需求要将数据存储从 SQL Server 数据库切换到 Azure Storage 中的 Table。然而不管是 SSMS 还是 Azure Portal 都没有提供直接的导入功能&#xff0c;是不是又想自己写程序去导数据了&#xff1f;其实不用&#xff01;没有点过数据库…