说了半天跨平台,今儿咱就来跨跨!(中)

上篇聊到,在 linux 内核的发行版系统(Ubuntu)里发布 dotnet 项目,生成 docker 文件,并通过运行 docker 镜像的形式来运行项目。这篇主要围绕快速部署项目展开聊聊。
一、容器迁移
上篇我们在本地成功构建了 docker 镜像,并成功在本地运行了镜像。现在可以把镜像上传到生产环境,直接运行。
有两种方式,一是导出本地的镜像文件或者导出容器快照,然后再将导出的文件上传到服务器进行加载或导入,最后运行容器即可。
执行命令后将会把名称为 checkin 的镜像导出成 check.tar 文件包,后面的-o 是指定文件存储名
或者直接生成容器快照
然后登陆模板服务器,导入镜像
或者导入容器快照
导入镜像后,在目标服务器运行容器镜像

如此,便完成了镜像的迁移工作,不需要多余任何操作,docker 就是把整个的运行环境和所有依赖项全部搬运了过来。
二、容器仓库
可能大家还觉得这样来操作,仍然需要不少的步骤,比如需要在开发机器构建镜像,还需要上传到生产服务器,上传之后还需要在服务器运行镜像,虽然复杂程度降低了很多,但操作步骤仍然很多。
在此基础上,效仿 Git 的方式,引入类似代码仓库一样的概念—-容器仓库。
在安装 docker,会有一个默认的 docker 仓库,dockerhub,我们可以直接在 dockerhub 里拉取一些常用的库或开发环境,比如操作系统 centos,比如 nginx 等
可以直接在终端输入
会直接查找仓库里的 nginx 镜像

同理,我们也可以把在本地构建的镜像文件,上传到 dockerhub,然后在目标服务器直接拉取镜像,省去了导入导出的过程,效率也会提高很多。
这里我推荐大家使用国内的云服务商,创建容器仓库,使用 dockerhub 的话,1 是拉取和推送的过程可能会很慢,2 时仓库数量也有限制。
我这里是使用的腾讯云的个人版容器仓库。

我们在本地构建好容器后,上传到容器仓库,再到服务器去拉取即可。


三、自动构建、持续交付
在 dotnet 支持跨平台之前,我们之前部署项目的方式是,先把项目编译到一个指定路径,然后打包我们的项目到服务器,在通过 IIS 进行部署。这是最为经典,也是最常用的 dotnet 项目发布流程。后来微软提供了 webdeploy 的发布方式,可以在服务器安装 webdeploy 安装包,然后在 vs 里通过简单的配置,就可以完成自动发布。这应该算是在 docker 出现在微软的技术栈以前,最快捷的发布方式了。但它终究不是跨平台的,所以引起反响也不是很大。
而在 dotnet 跨平台之后,尤其是微软和 docker 也是进行了深度合作,在 windows10 之后的平台甚至可以全功能支持 docker 服务。这也为 dotnet 提供了持续集成,持续交付(CI/CD)的道路。
这里还要牵扯到一中开发管理模式——DevOps,这里我分别在知乎和微软的官网看了两篇文章,觉得介绍的很详细。奉上传送门
DevOps 到底是什么意思?https://zhuanlan.zhihu.com/p/91371659
什么是 DevOpshttps://azure.microsoft.com/zh-cn/overview/what-is-devops/#devops-overview
这其中,我觉得有句话说的很精辟,是这么说的
“在 DevOps 涉及到的内容里,技术(工具和平台)是最容易实现的,流程次之,思维转变反而最困难,换言之,Devops 考验的不只是一加企业的技术能力,更是管理水平和企业文化”
好了,接着聊案例吧。(注意,这一部分可能有点长,但非常重要。)
我这里引入了一个持续集成的软件——Jenkins。
借助 Jenkins+docker+Git 来完成我们的 dotnet 项目自动化构建和部署。
1.首先下载 Jenkins
创建 Jenkins 目录
然后在 jenkins 目录,下载 Jenkins 的 war 包
2.下载好后,安装 jdk
因为 Jenkins 是用 java 语言开发的,所以需要安装 java 开发/运行环境才能运行
建议按照 jdk8 或者 jdk11
如果不做 java 开发,而且使用的 Ubuntu 系统,我建议直接使用 Ubuntu 包管理系统的 openjdk 版本,不仅免费,而且安装便捷;
如果要安装 oracle 官方的 jdk,可以到官方下载 jdk 安装包,然后进行安装和配置。
3.安装 Jenkins
执行上面命令中的 nohup java -jar jenkins.war –httpPort=8081 & 后,浏览器打开 ip:8081,这里安装过程要小等一会才能打开

打开后,按照提示,复制密码
然后进入这个界面

选择推荐的插件
装完后,进入到创建用户的界面,输入信息后保存。

然后进入新手入门的界面,配置 Jenkins url,直接保存即可

安装完成

安装完成后,我这里多安装了一个插件,因为后续我的代码仓库使用的不是官方推荐的 github 而是国内的 gitee,因为 GitHub 在国内有时候访问起来还是不太稳定,虽然有替代方案,但还是不如直接用国内的仓库替代来的直接。

这一步不是必须的,按需执行。
至此,Jenkins 的安装完成,接下来我们要把项目提交到代码仓库中,我这里使用的是 gitee,也可以使用自己公司搭建的代码仓库 gitlab 或者是 github 等
4.配置代码仓库
在 gitee 创建一个私有仓库

然后把代码提交到这里进行管理,如果使用的是 vs,可以直接把仓库地址配置等 vs 里,快捷操作。

把项目提交到 gitee 后(注意在这之前,要按前面的介绍,把 dockerfile 配置好,并放到和项目文件同级的目录下),回到服务器,安装 git 服务

因为我这里已经生成过了,所以没有覆盖,如果没有生成,会创建一个 rsa 私钥文件和 rsa.pub 公钥文件。
然后查看公钥文件

之后把公钥内容复制到 gitee 中,在【部署公钥管理】里,添加刚刚复制的公钥


5.创建自动化构建任务
回到 Jenkins,新建任务,选择自由风格(FreeStyle)

在新弹出的窗口,到【源码管理】位置,选择 Git,然后复制 Gitee 仓库里的 ssh 路径


然后添加私钥

这里的私钥就是上面我们生成的 id_rsa 文件

把这段内容复制到 Jenkins 的输入框,然后选择我们刚添加的凭据

然后如果你是用的 github 作为代码仓库,可能拉去代码比较慢,需要到构建环境设置一下超时时间

然后到【构建】栏目
选择构建方式为脚本模式

之后输入如下内容,注意 docker 的启动参数要按需调整
保存之后,回到管理面板,可以看到我们创建的自动构建目录

之后点击我们要构建的项目,进入到项目页面,点击左侧“build now”进行构建,构建完成后,左下角会反馈构建结果,如果构建成功,会出现绿色对勾标识,失败则是红色叉叉。

这里还可以查看构建日志等信息。
然后检查下容器

可以看到容器运行正常,再访问下地址看看

也可以正常访问。
至此我们每次只需要在编写完代码后,提交到 gitee 仓库,然后打开 Jenkins 界面,点击立即构建即可完成项目部署的全部流程!!
这篇主要是围绕项目的快速部署,我们的部署方案,也从最开始的需要直接操作容器,到需要简单操作容器,再到最后不需要操作容器即可自动化部署。整个演变的流程图如下。

其实关于容器相关的话题,短短几篇内容是无法道出其精髓,我个人也是开始对容器的相关技术进入了痴迷的状态,也在逐步的摸索和试验。
这篇就到这,下篇继续。
版权声明: 本文为 InfoQ 作者【为自己带盐】的原创文章。
原文链接:【http://xie.infoq.cn/article/4f735951a021aa02c5c290f09】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论