当前位置: 首页 > news >正文

openEuler 22.03 x86架构下docker运行arm等架构的容器——筑梦之路

为什么要这样做?

随着国产化的普及,国家政策对信创产业的支持,尤其一些金融证券行业、政府单位等,逐渐开始走国产化信创的路线,越来越多接触到国产 CPU (arm 平台,比如华为的鲲鹏处理器)

自己买 arm 平台的 CPU,这个成本着实吃不消,于是尝试 x86 平台运行 arm 平台的容器来降本增效。

环境说明

 1. 操作系统版本: 华为openEuler 22.03 lts  x86_64

 2. docker版本:20.10.12  二进制方式安装

 3. buildx插件版本:0.9.1

Docker二进制方式安装和buildx插件安装

1. 二进制方式安装docker并配置

# 二进制方式安装docker并配置#下载二进制离线压缩包
wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.12.tgz#解压文件
tar -zxvf docker-20.10.12.tgzchmod +x docker/*#将二进制文件拷贝到/usr/bin/
cp docker/* /usr/bin/#注册到系统服务
vim /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
#指定docker存储目录/TRS/APP/docker/lib
ExecStart=/usr/bin/dockerd --graph /APP/docker/
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
asksMax=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target#重载
mkdir -p /APP/docker/lib
systemctl daemon-reload#启动服务并加入开机启动
systemctl enable docker --now#检查
systemctl status docker# 配置
mkdir -p /etc/dockercat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],"exec-opts": ["native.cgroupdriver=systemd"],"experimental": true,"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2","storage-opts": ["overlay2.override_kernel_check=true"]
}
EOF

2. 安装docker-buildx插件

# 创建目录mkdir -p  ~/.docker/cli-plugins/# 下载插件并改名wget -c https://github.com/docker/buildx/releases/download/v0.9.1/buildx-v0.9.1.linux-amd64mv buildx-v0.9.1.linux-amd64 docker-buildxchmod +x docker-buildxmv docker-buildx ~/.docker/cli-plugins/# 检查验证docker buildx  versiondocker buildx ls

注册可支持的架构解释器

不指定 CPU 平台,使用 register 来注册可支持的架构解析器

docker run --rm \
> --privileged \
> multiarch/qemu-user-static:register \
> --reset

ls  /proc/sys/fs/binfmt_misc/ 

cat /proc/sys/fs/binfmt_misc/qemu-mips64elcat /proc/sys/fs/binfmt_misc/qemu-aarch64cat /proc/sys/fs/binfmt_misc/qemu-ppc64le

 启动arm架构的容器

1. 下载qemu-aarch64-static

GitHub - multiarch/qemu-user-static: :earth_africa: `/usr/bin/qemu-*-static`

wget -c https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-aarch64-static# 其他架构https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-arm-statichttps://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-mips-statichttps://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-mips64-statichttps://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-mipsel-statichttps://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-ppc64-statichttps://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-s390x-statichttps://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-x86_64-static
chmod +x qemu-aarch64-static

启动容器时将 qemu-aarch64-static 带入到容器内

注意 qemu-aarch64-static 二进制文件的路径,可以自己归纳到指定的路径,只需要带入到容器内的 /usr/bin 目录下就好了

简单测试

# 进运行一条命令查看架构docker run -t --rm --platform arm64 -v `pwd`/qemu-aarch64-static:/usr/bin/qemu-aarch64-static alpine uname -mdocker run -i --rm --platform arm64 -v `pwd`/qemu-aarch64-static:/usr/bin/qemu-aarch64-static debian:11 uname -m# 创建一个容器并开启一个终端docker run -it --rm --platform arm64 -v `pwd`/qemu-aarch64-static:/usr/bin/qemu-aarch64-static debian:11 /bin/bash

 同理,启动ppc64le架构的镜像如下:

wget -c https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-ppc64le-staticchmod +x qemu-ppc64le-static# 简单测试docker run -t \
--rm \
--platform ppc64le \
-v $(pwd)/qemu-ppc64le-static:/usr/bin/qemu-ppc64le-static \
alpine \
uname -m

以上测试了两种非x86架构的镜像,均可以正常运行,其他架构的类似,这里就不再赘述。 

龙芯架构这里,做特别说明

loongarch 架构的支持

1. 注册解释器

wget https://gitee.com/michael0066/qemu-loongarch64-static/blob/master/qemu-loongarch64-staticchmod +x qemu-loongarch64-static
# 注册echo ":qemu-loongarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x01:\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-loongarch64-static:" > /proc/sys/fs/binfmt_misc/register# 查看
ls  /proc/sys/fs/binfmt_misc/ |grep loonqemu-loongarch64

2.  简单测试

docker run --rm \
--platform loongarch64 -t \
-v `pwd`/qemu-loongarch64-static:/usr/bin/qemu-loongarch64-static \
loongsongd/debian10_loongarch64_x64:e15.0 \
uname -m

参考资料:

x86 架构运行 其他架构镜像 - 简书

https://hub.docker.com/r/loongsongd/debian10_loongarch64_x64

构建arm镜像

 以构建arm64镜像为例来说明如何构建其他平台架构的镜像。

1. 编写Dockerfile

FROM centos:7.9.2009
COPY ./qemu-aarch64-static /usr/bin/qemu-aarch64-static
RUN yum install -y net-tools gcc gcc-c++ make vim && \yum clean all

2. 构建镜像

docker build \
--platform arm64 \
-t centos_make:7.9_aarch64 .

3. 检查验证

docker inspect centos_make:7.9_aarch64 | grep -i 'architecture'

 

另一种方式: 

docker build --rm -t "arm64v8/redis_new" -<<EOF
FROM multiarch/qemu-user-static:x86_64-aarch64 as qemu
FROM arm64v8/redis
COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin
EOFdocker run --rm -t "arm64v8/redis_new" uname -m
#aarch64

这里没有使用buildx插件来构建其他架构的镜像,提供了另外一种构建其他架构镜像的思路和方法,但在云原生一般场景下构建多架构的docker镜像还是推荐使用docker buildx方式,效率更高。

相关文章:

openEuler 22.03 x86架构下docker运行arm等架构的容器——筑梦之路

为什么要这样做&#xff1f; 随着国产化的普及&#xff0c;国家政策对信创产业的支持&#xff0c;尤其一些金融证券行业、政府单位等&#xff0c;逐渐开始走国产化信创的路线&#xff0c;越来越多接触到国产 CPU &#xff08;arm 平台&#xff0c;比如华为的鲲鹏处理器&#xf…...

【Java】HashMap常见的面试题

HashMap常见面试题 1.HashMap key 是否可以是为 我们自定义对象&#xff1f;——可以 2.HashMap 存储数据 有序还是无序&#xff1f;——无序 3.HashMap key 是否可以存放 null值&#xff1f;如果可以的话 存放在 数组中那个位置&#xff1f;——可以;存放在 index0的位置 4.Ha…...

openpnp - src - 配置文件载入过程的初步分析

文章目录 openpnp - src - 配置文件载入过程的初步分析概述笔记自己编译用的git版本报错截图问题1 - 怎么在调试状态下, 定位到抛异常的第一现场?结合单步调试找到的现场, 来分析报错的原因openpnp配置文件读取的流程END openpnp - src - 配置文件载入过程的初步分析 概述 从…...

中国各城市土地利用类型(城市功能)数据集(shp)

中国各城市土地利用类型(城市功能)数据集 时间:2018年 全国范围的城市用地类型数据(居住/商业/交通用地等共计11类) 分类:居住用地、商业用地、工业用地、医疗设施用地、体育文化设施用地、交通场站用地、绿地等用地类型 含城市编码、一级分类5个、二级分类11个 数据按…...

Linux网络编程:数据链路层

目录 一. 数据链路层概述 二. 以太网 2.1 以太网的概念 2.2 以太网数据帧 2.3 对于MAC地址的认识 2.4 数据碰撞问题 三. MTU和MSS 3.1 什么是MTU 3.2 MTU对UDP的影响 3.3 MTU对TCP的影响&#xff08;MSS的概念&#xff09; 四. ARP协议 4.1 ARP协议的作用 4.2 ARP数…...

python 线程 超时时间

python 线程 超时时间_mob649e815f0f18的技术博客_51CTO博客...

LeetCode:274. H 指数、275. H 指数 II(C++)

目录 274. H 指数 题目描述&#xff1a; 实现代码与解析&#xff1a; 排序暴力 275. H 指数 II 题目描述&#xff1a; 实现代码与解析&#xff1a; 二分 比较简单&#xff0c;不再写解析&#xff0c;注意二分的时候&#xff0c;r指针为n&#xff0c;含义为个数&#xf…...

多线程及锁

1.lock锁和synchronized锁的区别。 1&#xff1a;Synchronized 是Java的一个关键字&#xff0c;而Lock是java.util.concurrent.Locks 包下的一个接口&#xff1b; 2&#xff1a;Synchronized 使用过后&#xff0c;会自动释放锁&#xff0c;而Lock需要手动上锁、手动释放锁&am…...

C++ 写一个Data类的注意问题

Data类 声明和定义分离的一些问题 声明里面我们不带缺省参数&#xff0c;定义我们给缺省参数&#xff0c;如下面两段代码&#xff1a; Data.h#pragma once #include<iostream> using namespace std; class Data { public:Data(int year,int month,int day);private:in…...

postman做接口测试

之前搞自动化接口测试&#xff0c;由于接口的特性&#xff0c;要验证接口返回xml中的数据&#xff0c;所以没找到合适的轮子&#xff0c;就自己用requests造了个轮子&#xff0c;用着也还行&#xff0c;不过就是case管理有些麻烦&#xff0c;近几天又回头看了看postman也可以玩…...

hdlbits系列verilog解答(always块)-29

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 由于数字电路由用网线连接的逻辑门组成,因此任何电路都可以表示为模块和赋值语句的某种组合。然而,有时这不是描述电路的最方便方式。过程procedure(其中 always 的块就是一个示例)提供了描述电路的替代语法…...

uniapp实现瀑布流

首先我们要先了解什么是瀑布流&#xff1a; 瀑布流&#xff08;Waterfall Flow&#xff09;是一种常见的网页布局方式&#xff0c;也被称为瀑布式布局或砌砖式布局。它通常用于展示图片、博客文章、商品等多个不同大小和高度的元素。 瀑布流布局的特点是每个元素按照从上到下…...

15. 机器学习 - 支持向量机

Hi, 你好。我是茶桁。 逻辑回归预测心脏病 在本节课开始呢&#xff0c;我给大家一份逻辑回归的练习&#xff0c;利用下面这个数据集做了一次逻辑回归预测心脏病的练习。 本次练习的代码在「茶桁的AI秘籍」在Github上的代码库内&#xff0c;数据集的获取在文末。这样做是因为我…...

如何根据进程号查询服务的端口号

ps -ef | grep nacos ps -ef | grep nacos 命令是用于查找系统中所有包含 "nacos" 关键字的进程。这个命令的含义如下&#xff1a; ps: 这是一个用于显示当前正在运行的进程的命令。 -ef: 这两个选项一起使用&#xff0c;表示显示所有进程的详细信息。 -e 选项表示显…...

2.10、自定义量化优化过程

introduction 如何自定义量化优化过程&#xff0c;以及如何手动调用优化过程 code from typing import Callable, Iterableimport torch import torchvision from ppq import QuantizationSettingFactory, TargetPlatform from ppq.api import (ENABLE_CUDA_KERNEL, Quantiz…...

MySQL如何添加自定义函数

深入MySQL&#xff1a;学习如何添加自定义函数 MySQL 是一种流行的开源关系型数据库管理系统&#xff0c;它支持很多内置函数来完成各种操作。不过有时候这些内置函数无法满足我们的需求&#xff0c;这时候就需要自定义函数了。在 MySQL 中&#xff0c;可以通过编写自定义函数…...

超融合数据库:解锁全场景数据价值的钥匙

前言 近日&#xff0c;四维纵横对外官宣已完成上亿元 B 轮融资。作为超融合数据库理念的提出者&#xff0c;三年来 YMatrix 持续在超融合数据库领域中保持精进与迭代&#xff0c;对于超融合数据库在行业、场景中的应用和理解也更为深刻。 本篇文章&#xff0c;我们将基于 YMa…...

Pap.er for Mac:高清壁纸应用打造你的专属视觉盛宴

在浩瀚的互联网海洋中&#xff0c;你是否曾为寻找一张心仪的高清壁纸而烦恼&#xff1f;或者是在大量的壁纸应用中感到困扰&#xff0c;不知道哪一个能满足你的需求&#xff1f;今天&#xff0c;我要向你介绍的&#xff0c;是一款独特的5K高清壁纸应用——Pap.er for Mac。 Pa…...

AI:46-基于深度学习的垃圾邮件识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…...

【骑行贝丘渔场】一场与海的邂逅,一段难忘的旅程

在这个渐凉的秋日&#xff0c;我们校长骑行队一行人骑着自行车&#xff0c;从大观公园门口出发&#xff0c;开始了一段别开生面的海滩之旅。沿途穿越草海隧道湿地公园、迎海路、海埂公园西门&#xff08;第二集合点&#xff09;、宝丰湿地公园、斗南湿地公园、蓝光城&#xff0…...

STM32F411 USB声卡时钟同步优化与中文命名实战

1. STM32F411 USB声卡开发基础 第一次接触STM32F411的USB声卡开发时&#xff0c;我被它的简洁配置流程惊艳到了。用CubeMX生成代码&#xff0c;接上PCM5102A解码芯片&#xff0c;不到半小时就能让电脑识别出音频设备。但很快我就发现事情没那么简单——播放音乐时总会出现周期…...

Ollama部署LFM2.5-1.2B-Thinking:从CSDN文档到实际调用的完整链路

Ollama部署LFM2.5-1.2B-Thinking&#xff1a;从CSDN文档到实际调用的完整链路 1. 认识LFM2.5-1.2B-Thinking模型 LFM2.5-1.2B-Thinking是一个专门为设备端部署设计的智能文本生成模型。这个模型属于LFM2.5系列&#xff0c;是在LFM2架构基础上通过扩展预训练和强化学习进一步优…...

避开这些坑!算法工程师自学必备的5个高效学习法与工具推荐

避开这些坑&#xff01;算法工程师自学必备的5个高效学习法与工具推荐 1. 为什么大多数自学算法工程师会失败&#xff1f; 在咖啡馆见到老张时&#xff0c;他正对着电脑屏幕上的LeetCode题目发呆。这位转行学习算法的前机械工程师已经坚持了8个月&#xff0c;但最近一次面试还是…...

Qwen3-Reranker-0.6B快速体验:搭建个人语义排序服务的简单方法

Qwen3-Reranker-0.6B快速体验&#xff1a;搭建个人语义排序服务的简单方法 1. 为什么你需要一个轻量级语义排序服务 在信息检索和问答系统中&#xff0c;语义排序&#xff08;Reranking&#xff09;是一个关键环节。想象一下&#xff0c;当用户输入一个问题后&#xff0c;系统…...

**发散创新:策略即代码 —— 用 Rust实现动态权限控制引擎**在现代软件架构中,**权限管理不再是静态配

发散创新&#xff1a;策略即代码 —— 用 Rust 实现动态权限控制引擎 在现代软件架构中&#xff0c;权限管理不再是静态配置的附属品&#xff0c;而是核心业务逻辑的一部分。传统 RBAC&#xff08;基于角色的访问控制&#xff09;虽然成熟&#xff0c;但在微服务、多租户和复杂…...

OpenClaw压力测试:nanobot持续运行72小时稳定性

OpenClaw压力测试&#xff1a;nanobot持续运行72小时稳定性 1. 测试背景与目标 最近在本地部署了基于OpenClaw的nanobot项目&#xff0c;这是一个超轻量级的自动化助手框架。它内置了vllm部署的Qwen3-4B-Instruct-2507模型&#xff0c;通过chainlit提供推理界面。在实际使用中…...

深入解析SerialPort:从硬件流控制到实战串口通信

1. 串口通信基础&#xff1a;从水管到数据流 第一次接触串口通信时&#xff0c;我盯着电脑上的COM接口发呆了半小时。这玩意儿看起来就像老式打印机接口&#xff0c;但它却是连接硬件世界的魔法通道。串口通信就像用一根水管在两个水桶之间传递水&#xff0c;只不过我们传递的…...

ADS差分传输线前仿真:从S参数模板到信号完整性快速评估

1. 差分传输线前仿真入门&#xff1a;为什么需要S参数模板&#xff1f; 刚入行那会儿&#xff0c;我最头疼的就是每次新项目都要从头搭建仿真环境。直到发现ADS里藏着现成的4端口S参数模板&#xff0c;工作效率直接翻倍。这就像做菜时有了预制高汤&#xff0c;不用再从熬骨头汤…...

NVIDIA vGPU许可服务器HA配置避坑指南:从环境准备到故障切换测试

NVIDIA vGPU许可服务器高可用配置实战&#xff1a;从零搭建到容灾验证 在虚拟化与AI计算融合的今天&#xff0c;NVIDIA vGPU技术已成为图形工作站、云游戏和机器学习平台的核心支撑。但许多团队在享受显卡虚拟化红利时&#xff0c;往往忽略了许可服务的高可用保障——当单点故障…...

探索Rufus全新应用场景:为老旧设备注入Windows 11新生命

探索Rufus全新应用场景&#xff1a;为老旧设备注入Windows 11新生命 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus 还在为Windows 11严格的硬件要求而烦恼吗&#xff1f;你的旧电脑完全可以运行…...