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

这次的主题,我感觉要说的内容有点多,自己也是折腾了好久,觉得有很多内容要详细记录,所以预计可能会分 2-3 篇来完成,也就是上下篇或者上中下篇。
当然项目还是基于 dotnet(core) stable latest 框架环境,目前是 5.0.4(当前最新已经是 6.0)。
一、先让我们的项目在 Linux 内核的系统里跑起来
这一步,主要是熟悉下 linux 环境,我这里用的是 Ubuntu 20.0.4 LTS。
1.安装 dotnet 环境
安装的操作,我还是推荐官方的操作,传送门:https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-ubuntu#2004-
安装完成后可以在终端输入
来判定是否安装成功,如果有正常的版本日志打印出来,则说明安装成功了
2.把发布后项目拷贝到目标机器
把项目在本地发布完成后,打包上传到 Ubuntu 机器上,上传方式有很多,不一一列举,推荐使用 ssh 软件工具来完成,我这里用的是 MobaXterm,https://mobaxterm.mobatek.net/
新建一个目录,来保存项目文件
解压文件(根据你的压缩包格式解压,我这里用的 zip,如果是 rar 格式,可能需要下载 rar 工具包)
进入该文件夹,启动项目

正常来讲,到这里,项目就可以执行起来了

而后续的配置 nginx 等操作,这篇不做介绍,后边再说。
这里我要提一个点,因为我在执行到这里的时候,遇到了一个 ssl/tsl 证书过期的问题,因为我们的项目一定是需要连接数据库的,在版本较高的 Ubuntu 系统里,已经不支持 TSL2.0 以下的证书类型,所以需要手动设置。
找到 oid_section = new_oids 这一行
可以通过 vim 搜索,非编辑状态下输入 “/oid_section“编辑器会快速帮我们定位(ps,建议了解下 vim/vi 相关操作大全,操作 linux 系统的话,这是必不可少的)
找到后,进入编辑状态,在它下面贴上这段
然后数据库就可以正常连接了。
二、让项目在 docker 容器里跑起来
以前跨平台的名言就是,“一次编写,到处运行“,这是针对编程语言来说的,现在大部分的编程语言都是跨平台的,比如 java,c,rust,ruby,go,以及我们的主角 c#。到了跨平台 2.0 时代,也就是容器时代,跨平台的 slogan 变成了“一次编译,到处运行”,说的就是只需要在容器镜像中完成了项目编译,就可以把镜像导出到任意平台,直接运行,而跨平台 1.0 时代的产生的诸如依赖包混乱,或者“在我的机器上是正常的啊!”等问题,也就不存在了,因为是把整个编译好的环境直接进行移植。
好了,现在我们回到项目,让我们的项目在容器里跑起来。
首先,在 vs 里添加 docker 支持,如果在创建项目的时候没选的话,可以右击项目,“添加”->”docker 支持”,来添加
我把我的项目结构作为案例来展示一下

然后我这里生成的 Dockerfile 长这样
注意,要把这个项目拷贝到和项目文件同级的目录下!

提前说一下,dockerfile 里也增加了处理 ssl 协议相关的语句,不然就会出现像第一部分最后说的那个问题,数据库无法连接。
注意,接下来,就要构造 docker 镜像了。
这一步进行之前,要确保开发机器安装了 docker desktop。
如果没有,就需要把项目源文件拷贝到 linux 上进行,或者把发布好的文件拷贝上去,同样需要在 linux 机器上安装 docker 环境,这一步我这里也先不介绍,后边再说。
我这里就基于开发环境来介绍。
当我们把 dockerfile 文件移动到项目同级目录后,接下来的操作建议在控制台窗口进行。我是使用的 Windows Terminal。
先来生成镜像
上面的指令分别代表
docker–不解释
build–构造
-t –指定镜像的名字 (形参)
checkin –镜像的名字(实参)
.–dockerfile 的位置,注意不能丢这个“.”
更多命令可以是用 docker –help 来查询,或者到官网查询手册。
回车执行后,会开始构造镜像,需要花一些时间。

构造完成后,可以检查下 docker 镜像是否正常
上面那个 checkin 就是我们生成的镜像。
然后把镜像运行起来
–name 是指定容器的名称
-d 是守护进程
-p 是指定端口映射,5000:5000 前面的是外部接口,也就是我们访问的时候的端口,后边的是内部运行端口
checkin 是镜像名称
运行起来后可以输入
来查看正在运行的容器

也可以输入
来查看所有的 docker 容器

注意 STATUS 属性,up 表示正在运行,exited 表示退出了。
也可以在 docker desktop 里查看

好了,容器运行起来后,我们就可以访问站点了。

也可以查看 docker 容器产生的日志

还有,当我们发现生成的容器镜像有问题是,可以删掉容器和镜像,重新生成。
先停止容器,然后删除容器,在删除镜像。
在去通过 docker build 重新构造镜像文件。
注意,这里还有一个点要说一下,如果需要把项目移植到 docker 环境,需要在 program.cs 的 webbuilder 里指定一下 url,不然可能会出现容器正常运行,但外部无法访问的情况。这是我遇到这个问题后有效的解决办法,可能还有别的方式。

好了,这一篇先分享到这,下篇在写在 linux 运行容器环境和有关配置反向代理的操作。
版权声明: 本文为 InfoQ 作者【为自己带盐】的原创文章。
原文链接:【http://xie.infoq.cn/article/5fdeb09ec3872f86727a94a22】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论