写点什么

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

作者:为自己带盐
  • 2021 年 12 月 08 日
  • 本文字数:3205 字

    阅读完需:约 11 分钟

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

上篇聊到,在 linux 内核的发行版系统(Ubuntu)里发布 dotnet 项目,生成 docker 文件,并通过运行 docker 镜像的形式来运行项目。这篇主要围绕快速部署项目展开聊聊。

一、容器迁移

上篇我们在本地成功构建了 docker 镜像,并成功在本地运行了镜像。现在可以把镜像上传到生产环境,直接运行。

有两种方式,一是导出本地的镜像文件或者导出容器快照,然后再将导出的文件上传到服务器进行加载或导入,最后运行容器即可。

docker save -o checkin.tar checkin
复制代码

执行命令后将会把名称为 checkin 的镜像导出成 check.tar 文件包,后面的-o 是指定文件存储名

或者直接生成容器快照

docker export  -o checkin.tar 2d391009c283
复制代码

然后登陆模板服务器,导入镜像

docker load -i checkin.tar
复制代码

或者导入容器快照

docker import checkin.tar jkcheckin
复制代码

导入镜像后,在目标服务器运行容器镜像

docker run --name jkcheckin -d -p 5000:5000 checkin
复制代码



如此,便完成了镜像的迁移工作,不需要多余任何操作,docker 就是把整个的运行环境和所有依赖项全部搬运了过来。


二、容器仓库

可能大家还觉得这样来操作,仍然需要不少的步骤,比如需要在开发机器构建镜像,还需要上传到生产服务器,上传之后还需要在服务器运行镜像,虽然复杂程度降低了很多,但操作步骤仍然很多。

在此基础上,效仿 Git 的方式,引入类似代码仓库一样的概念—-容器仓库。

在安装 docker,会有一个默认的 docker 仓库,dockerhub,我们可以直接在 dockerhub 里拉取一些常用的库或开发环境,比如操作系统 centos,比如 nginx 等

可以直接在终端输入

docker search 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 目录

cd \homemkdir jenkins
复制代码

然后在 jenkins 目录,下载 Jenkins 的 war 包

cd jenkinswget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
复制代码


2.下载好后,安装 jdk

因为 Jenkins 是用 java 语言开发的,所以需要安装 java 开发/运行环境才能运行

建议按照 jdk8 或者 jdk11

如果不做 java 开发,而且使用的 Ubuntu 系统,我建议直接使用 Ubuntu 包管理系统的 openjdk 版本,不仅免费,而且安装便捷;

#搜索下可以使用的openjdk版本apt-cache search openjdk#选择要安装的版本sudo apt install openjdk-11-jdk
复制代码

如果要安装 oracle 官方的 jdk,可以到官方下载 jdk 安装包,然后进行安装和配置。


3.安装 Jenkins

#控制台启动,首次按照可以这样看一下Jenkins启动后的日志java -jar jenkins.war --httpPort=8081#平时使用,让jenkins在后台运行即可nohup java -jar jenkins.war --httpPort=8081 &
复制代码

执行上面命令中的 nohup java -jar jenkins.war –httpPort=8081 & 后,浏览器打开 ip:8081,这里安装过程要小等一会才能打开



打开后,按照提示,复制密码

cat /root/.jenkins/secrets/initialAdminPassword
复制代码

然后进入这个界面



选择推荐的插件

装完后,进入到创建用户的界面,输入信息后保存。



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



安装完成



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



这一步不是必须的,按需执行。

至此,Jenkins 的安装完成,接下来我们要把项目提交到代码仓库中,我这里使用的是 gitee,也可以使用自己公司搭建的代码仓库 gitlab 或者是 github 等

4.配置代码仓库

在 gitee 创建一个私有仓库



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



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

#安装gitsudo apt install git#生成ssh keyssh-keygen -t rsa -C "{youremailaddress}.com"
复制代码



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

然后查看公钥文件

cat /home/tony/.ssh/id_rsa.pub
复制代码



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




5.创建自动化构建任务

回到 Jenkins,新建任务,选择自由风格(FreeStyle)



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




然后添加私钥



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

cat /home/tony/.ssh/id_rsa
复制代码



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



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



然后到【构建】栏目

选择构建方式为脚本模式



之后输入如下内容,注意 docker 的启动参数要按需调整

#!/bin/bash# 获取短版本号GITHASH=`git rev-parse --short HEAD`echo ---------------开始编译程序...------------------echo ---------------Building Docker Image...------------------docker build -t jkcheckin:$GITHASH .docker tag jkcheckin:$GITHASH jkcheckin:latestecho ---------------Launching Container...------------------docker rm -f jkcheckindocker run -d -p 5000:5000 --name jkcheckin jkcheckin:latest
复制代码

保存之后,回到管理面板,可以看到我们创建的自动构建目录



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



这里还可以查看构建日志等信息。

然后检查下容器



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



也可以正常访问。

至此我们每次只需要在编写完代码后,提交到 gitee 仓库,然后打开 Jenkins 界面,点击立即构建即可完成项目部署的全部流程!!

这篇主要是围绕项目的快速部署,我们的部署方案,也从最开始的需要直接操作容器,到需要简单操作容器,再到最后不需要操作容器即可自动化部署。整个演变的流程图如下。



其实关于容器相关的话题,短短几篇内容是无法道出其精髓,我个人也是开始对容器的相关技术进入了痴迷的状态,也在逐步的摸索和试验。

这篇就到这,下篇继续。

发布于: 2 小时前阅读数: 12
用户头像

学着码代码,学着码人生。 2019.04.11 加入

狂奔的小码农

评论

发布
暂无评论
说了半天跨平台,今儿咱就来跨跨!(中)