参考:
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目录里面。比如我的发布目录是项目根目录下的\bin\Release\net6.0\publish\,那我应该进入\bin\Release\net6.0。按住shift键+鼠标右键,打开powershell串口。
2、执行创建镜像的命令:
docker build -t 镜像名
docker build -t jq.tahm.httpapi.host .
#linux-arm64指定系统平台的命令方式创建镜像 ,这个后面论证没啥用,必须用dockerfile文件第一行来指定平台类型
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 8035:80 镜像名称
docker run -itd --name jq.tahm.httpapi.host -p 8035:80 jq.tahm.httpapi.host
4、测试容器是否启动成功,这是基于可移植目标平台发布 和amd64创建镜像时启动的容器测试结果,arm64作为目标平台创建的镜像,无法在windows版docker这里启动容器。
5、压缩保存镜像到本地目录:
docker save 镜像ID -o 镜像文件路径 镜像名称
docker save 48f480484bd33643236fa78e4ed822e2fc5cdb0cf4a532e309c456eaa596bfc5 -o E:\Docker\jq.tahm.httpapi.host.tar jq.tahm.httpapi.host
二、linux arm64服务器操作部分
1、ftp上传镜像文件
将上面生成的镜像文件包 E:\Docker\jq.tahm.httpapi.host.tar 用ftp客户端上传到linux服务器目录中。
2、重新加载镜像:
在加载镜像前可以先用docker images查看是否已经有重复镜像,有的话用下面命令删除
docker rmi -f 镜像id
docker rm -f 容器id
按下面的命令格式用命令加载镜像:
docker load -i 镜像文件路径
docker load -i /mnt/dockerdata/jq.tahm.httpapi.host.tar
3、输入 命令,基于镜像名称在docker中启动容器 。
在启动容器前,最好用docker ps -a 查看一下是否已经有你要创建的容器名了,有的话用docker rm 容器ID 删除容器。我之前不知道加-a ,只看到了运行中的容器,没看到不启用的容器,就经常这样失败了
docker run -itd --name 容器名称 -p 8981:80 镜像名称
docker run -itd --name jq.tahm.httpapi -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”)文章来源:https://www.toymoban.com/news/detail-777338.html
因为 Docker 默认使用的 builder 不支持多架构构建镜像,用 docker buildx create 一个支持多架构构建镜像的 Driver 即可:文章来源地址https://www.toymoban.com/news/detail-777338.html
docker buildx create \
--name multi-platform \
--use --platform \
linux/amd64,linux/arm64 \
--driver docker-container
到了这里,关于abpvnext框架的项目部署到linux arm64版的docker中的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!