目录

一、问题背景与分析

二、解决步骤

(一)检查 docker-compose 版本

(二)升级 docker-compose

1. 对于 Linux 系统

2. 对于 Windows 系统

(三)验证升级

(四)重新运行 docker-compose ps

三、迁移 x86 架构 Docker 镜像至 ARM 环境

(一)环境配置

(二)注意事项

(三)镜像拉取与转换

1. 使用 Docker Buildx

(1)安装 Docker Buildx

(2)创建构建器

(3)构建多平台镜像

2. 使用 qemu-user-static

(1)安装 qemu-user-static

(2)构建 ARM 镜像

(四)实际案例

1. Docker-Xiaoya 项目

2. 华为云鲲鹏架构 SpringBoot 微服务部署

四、其他注意事项

(一)查看系统架构

1. 使用 uname 命令

2. 使用 lscpu 命令

3. 查看 /proc/cpuinfo 文件

4. 使用 arch 命令

(二)重新标记镜像

(三)避免端口冲突

五、总结

在目标机器上导入镜像

注意事项

2. 重新标记镜像

. 构建 ARM 架构的 Docker 镜像

在 x86 架构的机器上,使用 Buildx 构建 ARM 架构的 Docker 镜像:

3. 运行 ARM 架构的镜像

关键修改点

1. 忽略警告

去官网查找是否有对应的arm版本


随着 ARM 架构在服务器和边缘计算领域的广泛应用,将 x86 架构的 Docker 镜像迁移到 ARM 环境变得越来越重要。本文将详细介绍如何将 x86 架构的 Docker 镜像转换为 ARM 架构,并提供代码示例和应用场景。

一、问题背景与分析

在进行迁移之前,我们先来看一个实际问题。假设你在运行 docker-compose ps 时遇到了错误,提示 docker-compose.yaml 文件中包含不支持的配置选项 profiles。这表明你的 docker-compose 版本可能过低,无法识别这些配置选项。

profiles 是 Docker Compose 1.28.0 及更高版本引入的一个特性,用于定义服务的配置文件。如果你的 docker-compose 版本低于 1.28.0,就会出现这种错误。

二、解决步骤

(一)检查 docker-compose 版本

你当前的 docker-compose 版本是 1.27.4,这是一个较旧的版本。你需要升级到 1.28.0 或更高版本。

(二)升级 docker-compose

根据你的操作系统,选择合适的升级方法。

1. 对于 Linux 系统
sudo pip uninstall docker-compose
sudo pip install docker-compose

或者使用以下命令:

sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -Po '"tag_name": "\K.*\d"')" /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
2. 对于 Windows 系统

如果你使用的是 Windows,可以通过 Docker Desktop 的设置界面进行升级,或者手动下载最新版本的 docker-compose 并替换旧版本。

(三)验证升级

升级完成后,运行以下命令验证 docker-compose 版本:

docker-compose --version

确保版本号至少为 1.28.0 或更高。

(四)重新运行 docker-compose ps

升级完成后,再次运行以下命令:

docker-compose ps

这应该不会再报错。

三、迁移 x86 架构 Docker 镜像至 ARM 环境

(一)环境配置

在开始之前,确保你的开发环境已经准备好。你需要在 ARM 设备上安装 Docker,并确保 Docker 支持多架构镜像构建。

sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker

(二)注意事项

  1. 确保 QEMU 二进制文件已注册:在 x86 架构的机器上运行 ARM 架构的镜像,需要安装 QEMU 并注册 binfmt_misc 支持。

    docker run --privileged --rm tonistiigi/binfmt --install all
  2. 启用 Docker 实验性功能:为了使用 Buildx 的多平台构建功能,需要启用 Docker 的实验性功能。

    sudo vi /etc/docker/daemon.json

    添加以下内容:

    {"experimental": true
    }

    然后重启 Docker 服务:

    sudo systemctl daemon-reload
    sudo systemctl restart docker

(三)镜像拉取与转换

1. 使用 Docker Buildx

Docker Buildx 是基于 BuildKit 引擎的增强型构建工具,支持跨不同硬件架构构建容器镜像。

(1)安装 Docker Buildx
docker buildx install
(2)创建构建器
docker buildx create --name mybuilder --use
(3)构建多平台镜像
docker buildx build --platform linux/arm64 -t myimage:arm64 .
2. 使用 qemu-user-static

qemu-user-static 是一个用户态模拟器,可以在 x86 平台上运行 ARM 架构的容器。

(1)安装 qemu-user-static
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
(2)构建 ARM 镜像
docker build --tag myimage:arm64 .

(四)实际案例

1. Docker-Xiaoya 项目

Docker-Xiaoya 项目通过 Docker Compose 一键部署 Alist、Emby 和 Jellyfin 服务。

sudo apt install docker-compose
git clone https://gitcode.com/ghmirrors/do/docker-xiaoya
cd docker-xiaoya
docker-compose up -d
2. 华为云鲲鹏架构 SpringBoot 微服务部署

在华为云鲲鹏架构上部署 SpringBoot 微服务,涉及 elasticsearch、rabbitmq、mysql 等服务。

docker build -t mall:latest .

docker-compose.yml 文件内容如下:

version: '3'
services:mall:image: mall:latestports:- "8080:8080"mysql:image: arm64v8/mysql:5.7environment:MYSQL_ROOT_PASSWORD: rootpasswordelasticsearch:image: arm64v8/elasticsearch:8.12.2environment:- discovery.type=single-node

运行以下命令启动服务:

docker-compose up -d

四、其他注意事项

(一)查看系统架构

在 CentOS 7 系统中,你可以通过多种方法来查看当前系统的架构(x86 或 ARM)。以下是几种常用的方法:

1. 使用 uname 命令
uname -m
  • 如果输出是 x86_64,则表示系统是基于 x86_64 架构的。

  • 如果输出是 armv7laarch64,则表示系统是基于 ARM 架构的。

2. 使用 lscpu 命令
lscpu

在输出中,查找 Architecture 一行。

3. 查看 /proc/cpuinfo 文件
cat /proc/cpuinfo

在输出中,查找 architecturemodel name 一行。

[root@centos7 ~]# cat /proc/cpuinfo | grep "model name"
model name      : Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz
4. 使用 arch 命令
arch

(二)重新标记镜像

使用 docker tag 命令将一个镜像重新标记为新的名称和标签。例如,假设你有一个名为 old-image:latest 的镜像,你希望将其重命名为 new-image:v1,可以运行以下命令:

docker tag old-image:latest new-image:v1

然后删除旧镜像并推送新镜像:

docker rmi old-image:latest
docker push new-image:v1

(三)避免端口冲突

  1. Centos 查看端口占用

    比如查看 80 端口占用情况使用如下命令:

    lsof -i tcp:80
  2. 列出所有端口

    netstat -ntlp

五、总结

将 x86 架构的 Docker 镜像迁移到 ARM 环境,不仅需要技术层面的精细操作,还需要对整体架构和资源利用有深入的理解。随着 ARM 架构在服务器市场的逐步普及,掌握这一迁移技术将变得越来越重要。

补充:

  1. 导出镜像: 使用 docker save 命令将镜像导出为一个 .tar 文件。例如,导出名为 my-python-app:latest 的镜像:

    docker save my-python-app:latest > my-python-app-latest.tar
在目标机器上导入镜像
# 导入镜像
docker load < /path/to/destination/my-python-app-latest.tar

注意事项

  1. 文件大小: 导出的 .tar 文件可能会比较大,具体取决于镜像的大小。确保目标机器上有足够的磁盘空间。

  2. 多平台镜像: 如果你导出的镜像支持多个平台(如 ARM 和 AMD64),导入后仍然可以使用这些多平台镜像。

2. 重新标记镜像

  1. 拉取 ARM 架构的镜像

使用 --platform 参数指定拉取 ARM 架构的镜像:

docker pull --platform=linux/arm64 ubuntu/squid:latest

. 构建 ARM 架构的 Docker 镜像

在 x86 架构的机器上,使用 Buildx 构建 ARM 架构的 Docker 镜像:

#导入镜像
docker buildx build   --platform linux/arm64   --tag ubuntu/squid-arm:latest  --load  .
docker buildx build   --platform linux/arm64   --tag postgres:15-alpine  --load  .
#导出镜像
docker save ubuntu/squid:latest  > ubuntu.tar
docker save postgres:15-alpine > postgres.tar

3. 运行 ARM 架构的镜像

关键修改点

  1. sysctls 配置

    • sysctls 配置从列表改为键值对映射:

      sysctls:net.core.somaxconn: "511"
  2. healthcheck 配置

    • 确保 healthchecktest 字段是一个列表:

      healthcheck:test: ["CMD", "redis-cli", "ping"]
1. 忽略警告

你可以通过配置 Redis 忽略这个警告。在 Redis 配置文件中(通常是 /etc/redis/redis.conf 或你的自定义配置文件),添加以下配置:

ignore-warnings ARM64-COW-BUG

如果你使用的是 docker-compose,可以在 docker-compose.yml 文件中通过 command 参数添加这个配置。例如:

version: '3.8'services:redis:image: redis:6-alpinerestart: alwayssysctls:net.core.somaxconn: "511"environment:REDISCLI_AUTH: ${REDIS_PASSWORD:-difyai123456}volumes:- ./volumes/redis/data:/datacommand: redis-server --requirepass ${REDIS_PASSWORD:-difyai123456} --ignore-warnings ARM64-COW-BUGhealthcheck:test: ["CMD", "redis-cli", "ping"]

.直接解压mydata.zip文件

[root@cgls ]# unzip mydata.zip
去官网查找是否有对应的arm版本

https://hub.docker.com/

amd64是X86架构的CPU,64位版。amd64又叫X86_64。主流的桌面PC,笔记本电脑,服务器(包括虚拟机)都在用X86_64的CPU。
arm64是ARM架构的CPU,64位版。苹果新出的电脑在用ARM架构的CPU。有些路由器和嵌入式设备在用arm64的CPU。手机和安卓平板电脑最常用的CPU也是ARM架构的。
MIPS是MIPS架构的CPU。有些嵌入式设备和家用路由器在用MIPS架构的CPU。

避免端口冲突

1、Centos查看端口占用

比如查看80端口占用情况使用如下命令:

lsof -i tcp:80

2、列出所有端口

netstat -ntlp
    ulimits:memlock:soft: ${OPENSEARCH_MEMLOCK_SOFT:--1}hard: ${OPENSEARCH_MEMLOCK_HARD:--1}nofile:soft: ${OPENSEARCH_NOFILE_SOFT:-65536}hard: ${OPENSEARCH_NOFILE_HARD:-65536}

希望本文的详细解析能帮助你在实际操作中顺利完成 x86 到 ARM 的 Docker 镜像迁移。如果有任何问题或需要进一步的帮助,欢迎咨询和交流。

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

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

相关文章

零代码部署工业数据平台:TRAE + TDengine IDMP 实践

对于编程初学者来说&#xff0c;软件开发流程中的开发环境配置、安装异常或报错往往需要花费大量时间查阅资料和反复试错&#xff0c;才能正常安装和启动某些软件工具。现在&#xff0c;在 TRAE 的帮助下&#xff0c;即使完全没有接触过编程&#xff0c;也能通过自然语言直接表…

史上最全Flink面试题(完整版)

1、简单介绍一下 FlinkFlink 是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算。并且 Flink 提供了数据分布、容错机制以及资源管理等核心功能。Flink提供了诸多高抽象层的API以便用户编写分布式任务&#xff1a;DataSet API&#xff0c; 对静态数…

C# .NET中使用log4Net日志框架指南

C# .NET中使用log4Net日志框架指南 log4Net是Apache基金会开发的一款高效、灵活的日志记录框架&#xff0c;广泛应用于.NET生态系统中。它支持多种日志输出目标&#xff08;如文件、数据库、控制台&#xff09;&#xff0c;并提供细粒度的日志级别控制&#xff0c;帮助开发者监…

每日算法刷题Day68:9.10:leetcode 最短路6道题,用时2h30min

一. 单源最短路&#xff1a;Dijkstra 算法 1.套路 1.Dijkstra 算法介绍 (1)定义 g[i][j] 表示节点 i 到节点 j 这条边的边权。如果没有 i 到 j 的边&#xff0c;则 g[i][j]∞。 (2)定义 dis[i] 表示起点 k 到节点 i 的最短路长度&#xff0c;一开始 dis[k]0&#xff0c;其余 …

Spring Boot + Apache Tika 从文件或文件流中提取文本内容

应用效果&#xff1a;1、安装 Apache Tika 依赖pom.xml<!-- Apache Tika 从文件中提取结构化文本和元数据 --><dependency><groupId>org.apache.tika</groupId><artifactId>tika-core</artifactId><version>2.9.2</version>&l…

qqq数据结构补充

1.绪论1.存储方式顺序存储&#xff1a;逻辑相邻&#xff0c;物理相邻链式存储&#xff1a;逻辑相邻&#xff0c;物理不一定相邻2.线性表1.顺序表1.不可扩容数组写一个顺序表1.在头文件中应有#pragam once&#xff0c;防止头文件多次编译&#xff1b;如果头文件多次编译&#x…

Anaconda与Jupyter 安装和使用

Anaconda内部集成了很多科学计算包&#xff0c;并且可以实现环境隔离 1. 安装Anaconda 定义&#xff1a;Anaconda是一个集成的Python发行版&#xff0c;专为数据科学、机器学习和AI开发而设计。它包含了常用的Python库、包管理工具&#xff08;Conda&#xff09;和Jupyter No…

5.后台运行设置和包设计与实现

程序的入口点(想让其后台默认.exe进程运行)也可以不通过vs设置也可以通过定义预处理设置第三种就是没有窗口的变成后台运行的了 处理client传来的数据包 第一步&#xff1a;咱们怎么设计一种包呢&#xff1f;FEFF在网络环境里面出现的概率低所以就采用这个 自己数据包截断了&am…

【开题答辩全过程】以 基于微信小程序校园综合服务平台的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

地级市人口集聚、经济集聚、产业集聚与绿色经济效率匹配数据(含区域经济研究相关的控制变量,Excel|shp|免费数据)

D006 地级市人口集聚、经济集聚、产业集聚与绿色经济效率匹配数据&#xff08;含区域经济研究相关的控制变量&#xff0c;Excel|shp|免费数据&#xff09;数据简介今天我们分享的数据是2004-2020年地级市人口聚集、经济聚集与绿色经济效率匹配数据&#xff0c;并对其进行可视化…

视觉SLAM第7讲:视觉里程计2(3D-2D:PnP、3D-3D:ICP)

接上文&#xff0c;视觉SLAM第7讲&#xff1a;视觉里程计1&#xff08;特征点法、2D-2D对极约束&#xff09;&#xff0c;本节主要学习3D-2D:PnP、3D-3D:ICP。 目录 7.7 3D-2D:PnP 7.7.1 直接线性变换&#xff08;DLT&#xff09; 7.7.2 P3P 1.原理 2.小结 7.7.3 最小化重…

友元的功能解析

目录 一、友元的作用 二、实例说明 1. 友元方法 例&#xff1a; 2.友元类 例&#xff1a; 三、注意事项 一、友元的作用 1. 可以让一个类外 函数 或 类对象 访问一个 类内私有 成员或方法。 二、实例说明 1. 友元方法 例&#xff1a; 用friend 关键字在Tom 类中声明…

GNSS校准气压计

1、gnss信号较好的时候得到的GNSS高&#xff0c;得到海拔高。2、气压计数据转到标准数据然后计算出来海拔高。3、gnss高作基准 - 气压高 高差 &#xff1b;需要修正的是气压偏差&#xff0c;那么如何得到气压偏差1&#xff09;用gnss高 反求出一个气压&#xff0c;这个气压与…

基于Springboot + vue3实现的校园二手交易平台

项目描述本系统包含管理员、用户两个角色。管理员角色&#xff1a;用户管理&#xff1a;管理系统中所有用户的信息&#xff0c;包括添加、删除和修改用户。配置管理&#xff1a;管理系统配置参数&#xff0c;如上传图片的路径等。权限管理&#xff1a;分配和管理不同角色的权限…

新型存储介质应用:CXL内存扩展技术与AI工作负载适配

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 引言&#xff1a;AI计算的内存瓶颈挑战 当前AI技术发展正面临着一…

Java 多线程(二)

目录synchronized刷新内存synchronized的特性可重入的出现死锁的情况如何避免死锁&#xff08;重点&#xff0c;死锁的成因和解决&#xff09;volatile关键字wait和notify多线程的代码案例饿汉模式和懒汉模式的线程安全问题指令重排序问题阻塞队列使用自己实现一个阻塞队列实现…

MySql 内外连接

1.内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的查询都是内连 接&#xff0c;也是在开发过程中使用的最多的连接查询。 语法&#xff1a;select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件&#xff1b;备注&…

【大前端】 断点续传 + 分片上传(大文件上传优化) 的前端示例

写一个 断点续传 分片上传&#xff08;大文件上传优化&#xff09; 的前端示例。这样即使网络中断&#xff0c;文件也可以从已上传的部分继续传&#xff0c;不需要重新传整个大文件。&#x1f539; 分片上传 断点续传思路分片切割&#xff1a;把大文件切成固定大小的小块&…

机器学习的发展与应用:从理论到现实

目录 引言 一、机器学习的发展历程 1. 萌芽阶段&#xff08;1950s–1970s&#xff09; 2. 符号主义与统计学习阶段&#xff08;1980s–1990s&#xff09; 3. 数据驱动与算法突破&#xff08;2000s–2010s&#xff09; 4. 深度学习崛起&#xff08;2012年至今&#xff09; …

Python实现讯飞星火大模型Spark4.0Ultra的WebSocket交互详解

核心架构设计与初始化机制 代码采用面向对象的设计模式构建了Ws_Param类作为核心配置载体。该类在初始化时接收四个关键参数:APPID(应用标识)、APIKey(接口密钥)、APISecret(签名秘钥)和Spark_url(服务端点地址)。通过urlparse模块解析URL结构,分离出主机名(host)与…