写点什么

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

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

    阅读完需:约 9 分钟

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

这次的主题,我感觉要说的内容有点多,自己也是折腾了好久,觉得有很多内容要详细记录,所以预计可能会分 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-

安装完成后可以在终端输入

dotnet --version
复制代码

来判定是否安装成功,如果有正常的版本日志打印出来,则说明安装成功了

2.把发布后项目拷贝到目标机器

把项目在本地发布完成后,打包上传到 Ubuntu 机器上,上传方式有很多,不一一列举,推荐使用 ssh 软件工具来完成,我这里用的是 MobaXterm,https://mobaxterm.mobatek.net/

新建一个目录,来保存项目文件

sudo mkdir /home/project/checkin
复制代码

解压文件(根据你的压缩包格式解压,我这里用的 zip,如果是 rar 格式,可能需要下载 rar 工具包)

sudo unzip publish.zip
复制代码

进入该文件夹,启动项目


dotnet checkinsystem.dll
复制代码


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



而后续的配置 nginx 等操作,这篇不做介绍,后边再说。

这里我要提一个点,因为我在执行到这里的时候,遇到了一个 ssl/tsl 证书过期的问题,因为我们的项目一定是需要连接数据库的,在版本较高的 Ubuntu 系统里,已经不支持 TSL2.0 以下的证书类型,所以需要手动设置。

sudo vim /etc/ssl/openssl.cnf
复制代码

找到 oid_section = new_oids 这一行

可以通过 vim 搜索,非编辑状态下输入 “/oid_section“编辑器会快速帮我们定位(ps,建议了解下 vim/vi 相关操作大全,操作 linux 系统的话,这是必不可少的)

找到后,进入编辑状态,在它下面贴上这段

openssl_conf = default_conf
[default_conf]ssl_conf = ssl_sect
[ssl_sect]system_default = system_default_sect
[system_default_sect]MinProtocol = TLSv1.1CipherString = DEFAULT@SECLEVEL=1
复制代码

然后数据库就可以正常连接了。


二、让项目在 docker 容器里跑起来

以前跨平台的名言就是,“一次编写,到处运行“,这是针对编程语言来说的,现在大部分的编程语言都是跨平台的,比如 java,c,rust,ruby,go,以及我们的主角 c#。到了跨平台 2.0 时代,也就是容器时代,跨平台的 slogan 变成了“一次编译,到处运行”,说的就是只需要在容器镜像中完成了项目编译,就可以把镜像导出到任意平台,直接运行,而跨平台 1.0 时代的产生的诸如依赖包混乱,或者“在我的机器上是正常的啊!”等问题,也就不存在了,因为是把整个编译好的环境直接进行移植。

好了,现在我们回到项目,让我们的项目在容器里跑起来。

首先,在 vs 里添加 docker 支持,如果在创建项目的时候没选的话,可以右击项目,“添加”->”docker 支持”,来添加

我把我的项目结构作为案例来展示一下



然后我这里生成的 Dockerfile 长这样

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base# 下面2行是防止在容器里出现关系数据库无法连接的问题,处理ssl/tsl协议问题RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1.0/g' /etc/ssl/openssl.cnfRUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1.0/g' /usr/lib/ssl/openssl.cnf
WORKDIR /appEXPOSE 5000

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS buildWORKDIR /srcCOPY ["CheckInSystem/CheckInSystem.csproj", "CheckInSystem/"]COPY ["PassportModels/PassportModels.csproj", "PassportModels/"]COPY ["Assistant/CheckInAssistant.csproj", "Assistant/"]COPY ["CheckInModels/CheckInModels.csproj", "CheckInModels/"]
RUN dotnet restore "CheckInSystem/CheckInSystem.csproj"COPY . .WORKDIR "/src/CheckInSystem"RUN dotnet build "CheckInSystem.csproj" -c Release -o /app/build

FROM build AS publishRUN dotnet publish "CheckInSystem.csproj" -c Release -o /app/publish
FROM base AS finalWORKDIR /appCOPY --from=publish /app/publish .ENTRYPOINT ["dotnet", "CheckInSystem.dll"]
复制代码

注意,要把这个项目拷贝到和项目文件同级的目录下!



提前说一下,dockerfile 里也增加了处理 ssl 协议相关的语句,不然就会出现像第一部分最后说的那个问题,数据库无法连接。

注意,接下来,就要构造 docker 镜像了。

这一步进行之前,要确保开发机器安装了 docker desktop。

如果没有,就需要把项目源文件拷贝到 linux 上进行,或者把发布好的文件拷贝上去,同样需要在 linux 机器上安装 docker 环境,这一步我这里也先不介绍,后边再说。

我这里就基于开发环境来介绍。

当我们把 dockerfile 文件移动到项目同级目录后,接下来的操作建议在控制台窗口进行。我是使用的 Windows Terminal。

先来生成镜像

docker build -t checkin .
复制代码

上面的指令分别代表

docker–不解释

build–构造

-t –指定镜像的名字 (形参)

checkin –镜像的名字(实参)

.–dockerfile 的位置,注意不能丢这个“.”

更多命令可以是用 docker –help 来查询,或者到官网查询手册。

回车执行后,会开始构造镜像,需要花一些时间。



构造完成后,可以检查下 docker 镜像是否正常

docker images
复制代码

上面那个 checkin 就是我们生成的镜像。

然后把镜像运行起来

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


–name 是指定容器的名称

-d 是守护进程

-p 是指定端口映射,5000:5000 前面的是外部接口,也就是我们访问的时候的端口,后边的是内部运行端口

checkin 是镜像名称

运行起来后可以输入

docker ps
复制代码

来查看正在运行的容器



也可以输入

docker ps -a
复制代码

来查看所有的 docker 容器



注意 STATUS 属性,up 表示正在运行,exited 表示退出了。

也可以在 docker desktop 里查看



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



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

docker logs --details cst
复制代码




还有,当我们发现生成的容器镜像有问题是,可以删掉容器和镜像,重新生成。

docker stop cstdocker rm cstdocker rmi checkin
复制代码

先停止容器,然后删除容器,在删除镜像。

在去通过 docker build 重新构造镜像文件。

注意,这里还有一个点要说一下,如果需要把项目移植到 docker 环境,需要在 program.cs 的 webbuilder 里指定一下 url,不然可能会出现容器正常运行,但外部无法访问的情况。这是我遇到这个问题后有效的解决办法,可能还有别的方式。



好了,这一篇先分享到这,下篇在写在 linux 运行容器环境和有关配置反向代理的操作。

发布于: 13 小时前阅读数: 9
用户头像

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

狂奔的小码农

评论

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