abpvnext框架的项目部署到linux arm64版的docker中

发布时间:2023年12月20日

参考:

windows10下安装的docker 导出镜像到另一个电脑_docker镜像拷贝另一台机器的镜像-CSDN博客

前提条件:

1、vs2022,我的电脑本机安装有windows版docker desktop 。

2、linux中已经安装好docker,安装了sftp。这部分可以自行去查资料安装。

3、项目里有dockerfile支持文件。我的支持文件代码如下:

#FROM mcr.microsoft.com/dotnet/aspnet:6.0
FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal-arm64v8
#经过反复测试,如果是arm64的 就必须在上面加明确平台标志 -focal-arm64v8

# 创建目录
RUN mkdir /app

COPY publish /app
 
# 设置工作目录
WORKDIR /app

# 暴露80端口
EXPOSE 80
# 设置时区 .net6 才有这个问题
ENV TZ=Asia/Shanghai

# 设置环境变量
ENV ASPNETCORE_ENVIRONMENT=Production

ENTRYPOINT ["dotnet", "JQ.TAHM.HttpApi.Host.dll"]  
#此处dll前面的JQ.TAHM.HttpApi.Host为项目名称


发布和部署步骤:

一、本地windows系统操作部分

1、发布

先用vs2022发布netcore项目文件,然后进入到工程的relase目录里面,按住shift键+鼠标右键,打开powershell串口。

2、执行创建镜像的命令:

docker?build? -t 镜像名?

docker build -t jq.tahm.httpapi.host .?

#linux-arm64指定系统平台的命令方式创建镜像

docker?build?--platform?linux/amd64?-t? 镜像名?

docker build?--platform?linux/amd64 -t jq.tahm.httpapi.host .??

#注意,-t 后面的为镜像名称,且镜像名称后面还有一个空格加一个英文的.符号。注意最后的?.?表示当前目录。

在本机的docker desktop客户端中找到新生成的images。

3、基于镜像名称启动容器:

docker run -itd --name 容器名称 -p 8881:80 镜像名称

docker run -itd --name jq.tahm.httpapi.host -p 8981:80 jq.tahm.httpapi.host

?

4、测试容器是否启动成功,这是基于可移植目标平台发布 和amd64创建镜像时启动的容器测试结果,arm64作为目标平台创建的镜像,无法在windows版docker这里启动容器。

5、压缩保存镜像到本地目录:

docker save 镜像ID -o 镜像文件路径?镜像名称?

docker save 0f8a73482f4f1ea3a103b00c05216ef09d701f5b74fbfedd6b44c61eca3b6ecb -o E:\Docker\jq.tahm.httpapi.host.tar jq.httpapi.host

二、linux arm64服务器操作部分

1、ftp上传镜像文件

将上面生成的镜像文件包?E:\Docker\jq.tahm.httpapi.host.tar 用ftp客户端上传到linux服务器目录中。

2、重新加载镜像:

docker load -i 镜像文件路径

docker load -i /mnt/dockerdata/jq.tahm.httpapi.host.tar

在加载镜像前可以先用docker images查看是否已经有重复镜像,有的话用下面命令删除

docker rmi -f? 镜像id

3、输入 命令,基于镜像名称在docker中启动容器 。

在启动容器前,最好用docker ps -a 查看一下是否已经有你要创建的容器名了,有的话用docker rm 容器ID 删除容器。我之前不知道加-a ,只看到了运行中的容器,没看到不启用的容器,就经常这样失败了

docker run -itd --name 容器名称 -p 8981:80 镜像名称

docker run -itd --name tahmtest1 -p 8035:80 jq.tahm.httpapi.host

我的第一次执行失败了。如下图:

提示的是镜像属于amd64,而linux属于arm64,系统不匹配之类的。

然后跳到下面的 三、补充:针对arm的发布设定 设置修改项目之后,重新从发布项目开始执行。

经实测,arm64版发布的文件产生的镜像,无法在windows版docker中创建容器,我强行压缩打包成镜像文件,通过ftp上传到阿里云。

第二次执行到此步骤的效果如下图:

注意啊,如果命令从文档复制过来在执行总是失败,然后又确定容器名和端口没有重复,那就自己手工敲命令,比如我上图这样, 坑死了, 复制修改了容器名,和端口很多遍都是失败, 手工敲就没问题了。

4、注意上面容器启动映射的端口是否是通的,比如阿里云服务器就得到实例安全组里开放端口8035.

linux-arm64中测试后端效果图:

三、补充:针对arm64的发布设定

我们可以看到上面的警告提示,这段英文 提示大致意思是 :请求的镜像平台(linux/amd64)与检测到的主机平台(linux/arm64/v8)不匹配,并且没有请求特定的平台。? ?这就是我买的阿里云服务器的大坑,贪便宜选了个arm64版系统centos。要解决这个问题,需要针对前面的步骤修改如下:

1、在项目的dockerfile文件中 第一行代码改为

FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal-arm64v8

2、在vs2022项目发布设置那里选择指定目标运行时为linux-arm64 。

3、关于MiniProfiler的修改:

设置好dockerfile和发布设置之后,重新发布,又发生了新的问题。发布报错如下图:

提示的是MiniProfiler.EntityFrameworkCore 包降级的问题,?MiniProfiler是一个针对接口和EF之类的性能分析工具,为了满足部署,我可以选择删除不要MiniProfiler。?

分别从JQ.TAHM.HttpApi.Host和JQ.TAHM.Shared.Hosting.Microservices两个工程删除针对MiniProfiler.EntityFrameworkCore的包依赖。 然后重新发布报错如下图:

又提示针对MiniProfiler的配置报错了,注释这行代码。再次重新发布成功。如下图:

重新发布之后采用指定架构的方式创建镜像:

docker build?--platform?linux/amd64 -t jq.tahm.httpapi.host .?

接下来其他的步骤就跟原来差不多了, 部署到arm64平台的系统,要注意的就是发布的时候指定平台linux-arm64 , dockefile里面第一行要加指定平台参数-focal-arm64v8,然后创建镜像的时候如上面命令也要指定平台参数--platform?linux/amd64

其他参考:Docker buildx 构建多架构镜像(AMD、ARM)

docker buildx build \
  --platform linux/amd64,linux/arm64 \ # 参考 https://github.com/docker-library/official-images#architectures-other-than-amd64
  -t YOUR_IMAGENAME:YOUT_IMAGE_TAG \
  --push \ # 构建完就 push(如果只想 build、不想 push,就去掉 --push)
  . # Dockerfile 所在的文件夹

如果是第一次使用 buildx 进行多架构镜像,可能会出现以下错误:ERROR: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. “docker buildx create –use”)

因为 Docker 默认使用的 builder 不支持多架构构建镜像,用 docker buildx create 一个支持多架构构建镜像的 Driver 即可:

docker buildx create \ 
  --name multi-platform \ 
  --use --platform \ 
  linux/amd64,linux/arm64 \ 
  --driver docker-container

文章来源:https://blog.csdn.net/yangyong1250/article/details/135020774
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。