如何跨系统构建docker镜像?

湖蓝几何球体LinkedIn Banner.png
转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。


1. 前言

docker镜像有基于amd64系统的,也有基于arm64系统的。

前段时间用了一个在x86_64的centos7服务器上构建的image在一台国产aarch64服务器上运行,遇到了如下报错:
standard_init_linux.go:219: exec user process caused: exec format error

上述报错就是因为docker镜像的系统架构与部署容器的宿主机系统架构不一致。image文件的“Architecture”字段是amd64;运行镜像的服务器系统是aarch64架构。

想要构建在arm64/aarch64系统上能够运行的docker镜像,可以采取以下方法:

  • 在arm64/aarch64系统服务器上构建镜像;
  • 在x86_64/amd64服务器上使用buildx工具跨平台构建。

2. 测试使用buildx构建image

使用buildx有个非常重要的前提条件:docker版本为Docker 19.03+

2.1 buildx实验规划

image.png

2.2 test103服务器安装buildx插件

1)在test103服务器上安装docker,版本为20.10.6(步骤略)
2)在test103服务器安装buildx

2.2.1 修改配置文件

1)修改/root/.docker/config.json,加入一行:“experimental”: “enabled”。如果/root/.docker下面不存在该文件,则可以新创建。

[root@ops03 .docker]# cat /root/.docker/config.json 
{"experimental": "enabled"  #加入该行,这里文件是新的,所以只写了这一行内容
}
[root@ops03 .docker]#

2)修改/etc/docker/daemon.json文件,加入一行:“experimental”: true

[root@ops03 docker]# cat /etc/docker/daemon.json
{"graph":"/docker","experimental": true,   #加入该行"exec-opts":["native.cgroupdriver=systemd"],"insecure-registries": ["harbor.test.com:8081"],"registry-mirrors": ["https://1l3yp2sl.mirror.aliyuncs.com"],"default-address-pools": [{"base": "192.168.0.0/16","size": 24}]
}
[root@ops03 docker]# 

然后重启docker

systemctl daemon-reload
systemctl restart docker
2.2.2 安装buildx插件

如果是yum安装的docker,则该插件包含在docker里了,可以略过该步骤。使用脚本安装的docker,则需要手动安装buildx

1)创建buildx插件目录(注意路径,Linux下的安装路径为 $HOME/.docker/cli-plugins),下载buildx文件

# mkdir /root/.docker/cli-plugins
# cd /root/.docker/cli-plugins/
# wget https://github.com/docker/buildx/releases/download/v0.8.2/buildx-v0.8.2.linux-amd64  #当前版本最新为v0.8.2
# mv buildx-v0.8.2.linux-amd64 docker-buildx
# chmod +x docker-buildx

image.png

2)install buildx插件

# docker buildx install         #install buildx
# docker buildx create --use --name multiarch-builder  #创建自己的构建容器
# docker buildx inspect multiarch-builder --bootstrap  #初始化构建容器,这个步骤会从外网拉取`moby/buildkit`镜像,即使本地存在该镜像,也会从外网去拉

执行过程如下图
image.png

2.3 使用buildx构建arm64系统镜像

1)下载arm64系统的minio可执行文件,并编写Dockerfile(注意FROM的基础镜像也要用arm64的

FROM centos@sha256:43964203bf5d7fe38c6fca6166ac89e4c095e2b0c0a28f6c7c678a1348ddc7fa 
RUN set -ex \&& mkdir -p /data \&& mkdir -p /minio
COPY minio /minio/
RUN chmod 777 /minio/minio
EXPOSE 9000 9001
CMD ["/minio/minio","server","/data","--console-address",":9001"]

image.png

2)使用“–platform=linux/arm64”参数,指定构建镜像的系统平台

docker buildx build . --platform=linux/arm64 -t minio:test --load

image.png

注意:命令末尾必须加上 --load或–push。–load可以将build的镜像加载到服务器本地;–push将build的镜像推送到默认仓库。
如果不加,会报如下错误,且docker image看不到刚刚构建的镜像:

WARNING: No output specified for docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load
警告:没有为 docker 容器驱动程序指定输出。生成结果将仅保留在生成缓存中。将结果映像推送到注册表使用 --push 或将映像加载到 docker 使用 --load

image.png

3 镜像部署验证

1)查看镜像的“Architecture”字段是否为arm64

docker inspect minio:test

image.png

2)镜像架构如为arm64,则将x86_64服务器构建出来的镜像minio:test远程scp到aarch64服务器test104,测试部署

docker save minio:test>minio.tar.gz
scp minio.tar.gz root@10.0.0.4:/tmp/

3)在aarch64服务器test104上加载镜像并部署minio

docker load</tmp/minio.tar.gz

4)在test104服务器启动容器

docker run -d --privileged --restart=unless-stopped \
-p 9001:9000 \
-p 9002:9001 \
--name minio \
-v /tmp/data:/data \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=myadmin@123" \
minio:test

5)浏览器访问验证
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NSSCTF sql

开启环境: ?wllm1 回显正常,试试?wllm1 出现报错;加上%23正常 ?wllm-1or 11%23出现过滤 测试,空格用**替代, 等号用like替代 测试长度 ?wlmm1order/**/by/**/3%23正常 ?wlmm1order/**/by/**/4%23报错 长度为3,测试回显位置: ?wlmm-1union/**/select/**/1,2,3%23 …

快速入门ESP32——点亮你的第一个LCD屏幕

相关文章 快速入门ESP32——开发环境配置Arduino IDE 快速入门ESP32——开发环境配置PlatformIO IDE 快速入门ESP32—— platformIO添加开源库和自己的开发库 快速入门ESP32—— 解决platformIO添加开源库下载失败的问题 快速入门ESP32——点亮你的第一个LCD屏幕 前言一、移植T…

B01、运行时数据区概述-03

1、什么是内存 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。 2、线程共享和…

利用MATLAB绘制折线图

x20:20:140;%x轴上的数据&#xff0c;第一个值代表数据开始&#xff0c;第二个值代表间隔&#xff0c;第三个值代表终止a[0.85, 2.2, 3.45, 2.65, 1.5, 1.9, 1.25]; %a数据y值plot(x,a,-*b); %线性&#xff0c;颜色&#xff0c;标记 axis([0,160,0,4]) %确定x轴与y轴框图大小 …

WIN10自带查看硬盘运行时间的指令

#创作灵感# 之前一直在捣腾电脑&#xff0c;最近又搞了个R720XD&#xff08;后续会有分享&#xff09;&#xff0c;所以对硬盘比较关注&#xff0c;查了一下硬盘方面的一些坑&#xff0c;机械硬盘最关注的问题就是运行时间了。 #正文# 查看硬盘运行时间需要用到Get-Disk指令&a…

电脑提示找不到msvcp140.dll的修复方法,亲测有效的两种方法

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一个组件&#xff0c;它包含了许多C运行时库文件。这些库文件为运行基于C编写的应用程序提供了必要的支持。当系统中缺少某个或某些库文件时&#xff0c;就可能出现msvcp140.dll丢失的错误。 一、以下是msvcp140.dll文…

【数据结构】二叉树(一)——树和二叉树的概念及结构

前言: 本篇博客主要了解什么是树&#xff0c;什么是二叉树&#xff0c;以及他们的概念和结构。 文章目录 一、树的概念及结构1.1 树的基本概念1.2 树的相关特征1.3 树的实现 二、二叉树的概念及性质2.1 二叉树的概念2.2 二叉树的性质 一、树的概念及结构 1.1 树的基本概念 树&…

Multisim仿真实例(1-10)

本文分享10个常用电路&#xff0c;供大家参考学习&#xff0c;需要具体资料可以私聊我。 1、基于三极管的DC-AC全桥逆变电路 该电路利用脉冲控制Q1/Q3与Q2/Q4导通从而改变电流流过负载的方向&#xff0c;将直流信号逆变成交流信号。 电路图&#xff1a; 输入输出结果&#x…

springboot整合webservice使用总结

因为做的项目中用到了webservice,所以在此总结一下。 一、webservice简介 Web Service也叫XML Web Service, WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求&#xff0c;轻量级的独立的通讯技术。是通过SOAP在Web上提供的软件服务&#xff0c;使…

solidity案例详解(七)复杂众筹合约

自己原创智能合约&#xff0c;有作业需求可加下面的图片中的裙 1、在 Remix 中&#xff0c;以 Account1 完成“众筹项目”合约的编译和部署。&#xff08;显示合约、函数、状态变量、结构体、事件的命名&#xff09; 2、在 Remix 中&#xff0c;以 Account2 完成“参与众筹”合…

Python电能质量扰动信号分类(四)基于CNN-BiLSTM的一维信号分类模型

往期精彩内容&#xff1a; 引言 1 数据集制作与加载 1.1 导入数据 1.2 制作数据集 2 CNN-BiLSTM分类模型和超参数选取 2.1定义CNN-BiLSTM分类模型 2.2 设置参数&#xff0c;训练模型 3 模型评估 3.1 准确率、精确率、召回率、F1 Score 3.2 十分类混淆矩阵&#xff1a…

C++多态性——(3)动态联编的实现——虚函数

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 成功的秘诀就在于多努力一次&#xff…

gookit/color - Go语言命令行色彩使用库教程

gookit/color - Go语言命令行色彩使用库教程 1.安装2.基础颜色(16-color)3.256色彩/RGB风格 1.安装 go get github.com/gookit/color2.基础颜色(16-color) 提供通用的API方法&#xff1a;Print Printf Println Sprint Sprintf 1、例如&#xff1a; color.Yellow.Println(&q…

嵌入式系统(二)单片机基础 | 单片机特点 内部结构 最小系统 电源 晶振 复位

上一篇文章我们介绍了嵌入式系统 嵌入式系统&#xff08;Embedded System&#xff09;是一种特定用途的计算机系统&#xff0c;它通常嵌入在更大的产品或系统中&#xff0c;用于控制、监测或执行特定的任务。这些系统通常由硬件和软件组成&#xff0c;旨在满足特定的需求&…

echarts条纹进度条

drawmonthqualified(){this.monthqualified echarts.init(document.getElementById(monthqualified));this.monthqualified.setOption({grid: {top: "15%",left:"20%",right:20%,bottom: "0%" //也可设置left和right设置距离来控制图表的大小},…

【致远OA】获取指定人员的协同待发列表

接口请求说明 V6.0接口更新:不在传入ticket&#xff0c;改为传memberId人员ID V6.0之前http请求方式&#xff1a;GET http://ip:port/seeyon/rest/affairs/draft 如 http://127.0.0.1/seeyon/rest/affairs/draft?ticketxxxxxx V6.0http请求方式&#xff1a;GET http://ip:p…

常见网络协议

1.DNS协议 &#xff08;域名系统&#xff09; DNS协议使用的端口号是53 位于OSI模型中的应用层 DNS系统的作用&#xff1a;将域名&#xff08;网址&#xff09;解析为IP地址。 DNS的基本原理是&#xff1a;将域名映射到IP地址 DNS工作流程 当用户给定一个域名&#xff0…

【十三】【动态规划】1745. 分割回文串 IV、132. 分割回文串 II、516. 最长回文子序列,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

移动端APP版本治理

1、背景 在许多公司&#xff0c;APP版本都是不受重视的&#xff0c;产品忙着借鉴&#xff0c;开发埋头编码&#xff0c;测试想着不粘锅。 只有在用户反馈app不能用的时候&#xff0c;你回复客服说&#xff0c;让用户升级最新版本&#xff0c;是不是很真实。 而且业界也很少有…

一文讲清数据资产入表实操

《中共中央 国务院关于构建数据基础制度更好发挥数据要素作用的意见》已发布一年&#xff0c;数据资产化和入表已成为2023年的热门话题&#xff0c;随着2023年底国家数据局吹风《"数据要素x"三年行动计划&#xff08;2024-2026年&#xff09;》即将发布&#xff0c;这…