x86 架构 Docker 镜像迁移至 ARM 环境的详细指南

[复制链接]
发表于 2025-5-9 04:43:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
一、问题配景与分析
二、办理步骤
(一)查抄 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 体系

bash复制
  1. sudo pip uninstall docker-compose
  2. sudo pip install docker-compose
复制代码
或者使用以下命令:
bash复制
  1. 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
  2. sudo chmod +x /usr/local/bin/docker-compose
复制代码
2. 对于 Windows 体系

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

升级完成后,运行以下命令验证 docker-compose 版本:
bash复制
  1. docker-compose --version
复制代码
确保版本号至少为 1.28.0 或更高。
(四)重新运行 docker-compose ps

升级完成后,再次运行以下命令:
bash复制
  1. docker-compose ps
复制代码
这应该不会再报错。
三、迁移 x86 架构 Docker 镜像至 ARM 环境

(一)环境设置

在开始之前,确保你的开辟环境已经预备好。你需要在 ARM 装备上安装 Docker,并确保 Docker 支持多架构镜像构建。
bash复制
  1. sudo apt update
  2. sudo apt install docker.io
  3. sudo systemctl start docker
  4. sudo systemctl enable docker
复制代码
(二)留意事项


  • 确保 QEMU 二进制文件已注册:在 x86 架构的机器上运行 ARM 架构的镜像,需要安装 QEMU 并注册 binfmt_misc 支持。
    bash复制
    1. docker run --privileged --rm tonistiigi/binfmt --install all
    复制代码
  • 启用 Docker 实验性功能:为了使用 Buildx 的多平台构建功能,需要启用 Docker 的实验性功能
    bash复制
    1. sudo vi /etc/docker/daemon.json
    复制代码
    添加以下内容:
    JSON复制
    1. {
    2.   "experimental": true
    3. }
    复制代码
    然后重启 Docker 服务:
    bash复制
    1. sudo systemctl daemon-reload
    2. sudo systemctl restart docker
    复制代码
(三)镜像拉取与转换

1. 使用 Docker Buildx

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

bash复制
  1. docker buildx install
复制代码
(2)创建构建器

bash复制
  1. docker buildx create --name mybuilder --use
复制代码
(3)构建多平台镜像

bash复制
  1. docker buildx build --platform linux/arm64 -t myimage:arm64 .
复制代码
2. 使用 qemu-user-static

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

bash复制
  1. docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
复制代码
(2)构建 ARM 镜像

bash复制
  1. docker build --tag myimage:arm64 .
复制代码
(四)实际案例

1. Docker-Xiaoya 项目

Docker-Xiaoya 项目通过 Docker Compose 一键摆设 Alist、Emby 和 Jellyfin 服务。
bash复制
  1. sudo apt install docker-compose
  2. git clone https://gitcode.com/ghmirrors/do/docker-xiaoya
  3. cd docker-xiaoya
  4. docker-compose up -d
复制代码
2. 华为云鲲鹏架构 SpringBoot 微服务摆设

在华为云鲲鹏架构上摆设 SpringBoot 微服务,涉及 elasticsearch、rabbitmq、mysql 等服务。
bash复制
  1. docker build -t mall:latest .
复制代码
docker-compose.yml 文件内容如下:
yaml复制
  1. version: '3'
  2. services:
  3.   mall:
  4.     image: mall:latest
  5.     ports:
  6.       - "8080:8080"
  7.   mysql:
  8.     image: arm64v8/mysql:5.7
  9.     environment:
  10.       MYSQL_ROOT_PASSWORD: rootpassword
  11.   elasticsearch:
  12.     image: arm64v8/elasticsearch:8.12.2
  13.     environment:
  14.       - discovery.type=single-node
复制代码
运行以下命令启动服务:
bash复制
  1. docker-compose up -d
复制代码
四、其他留意事项

(一)检察体系架构

在 CentOS 7 体系中,你可以通过多种方法来检察当前体系的架构(x86 或 ARM)。以下是几种常用的方法:
1. 使用 uname 命令

bash复制
  1. uname -m
复制代码


  • 如果输出是 x86_64,则体现体系是基于 x86_64 架构的。
  • 如果输出是 armv7l 或 aarch64,则体现体系是基于 ARM 架构的。
2. 使用 lscpu 命令

bash复制
  1. lscpu
复制代码
在输出中,查找 Architecture 一行。
3. 检察 /proc/cpuinfo 文件

bash复制
  1. cat /proc/cpuinfo
复制代码
在输出中,查找 architecture 或 model name 一行。
  1. [root@centos7 ~]# cat /proc/cpuinfo | grep "model name"
  2. model name      : Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz
复制代码
4. 使用 arch 命令

bash复制
  1. arch
复制代码
(二)重新标志镜像

使用 docker tag 命令将一个镜像重新标志为新的名称和标签。例如,假设你有一个名为 old-image:latest 的镜像,你希望将其重定名为 new-image:v1,可以运行以下命令:
bash复制
  1. docker tag old-image:latest new-image:v1
复制代码
然后删除旧镜像并推送新镜像:
bash复制
  1. docker rmi old-image:latest
  2. docker push new-image:v1
复制代码
(三)制止端口冲突


  • Centos 检察端口占用
    比如检察 80 端口占用环境使用如下命令:
    bash复制
    1. lsof -i tcp:80
    复制代码
  • 列出所有端口
    bash复制
    1. netstat -ntlp
    复制代码
五、总结

将 x86 架构的 Docker 镜像迁移到 ARM 环境,不光需要技术层面的精细操作,还需要对整体架构和资源利用有深入的明白。随着 ARM 架构在服务器市场的渐渐遍及,把握这一迁移技术将变得越来越重要。
补充:


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

在目的机器上导入镜像

bash复制
  1. # 导入镜像
  2. docker load < /path/to/destination/my-python-app-latest.tar
复制代码
留意事项


  • 文件巨细: 导出的 .tar 文件大概会比较大,具体取决于镜像的巨细。确保目的机器上有充足的磁盘空间。
  • 多平台镜像: 如果你导出的镜像支持多个平台(如 ARM 和 AMD64),导入后仍然可以使用这些多平台镜像。
2. 重新标志镜像


  • 拉取 ARM 架构的镜像
使用 --platform 参数指定拉取 ARM 架构的镜像:
bash复制
  1. docker pull --platform=linux/arm64 ubuntu/squid:latest
复制代码
. 构建 ARM 架构的 Docker 镜像

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

  1. #导入镜像
  2. docker buildx build   --platform linux/arm64   --tag ubuntu/squid-arm:latest  --load  .
  3. docker buildx build   --platform linux/arm64   --tag postgres:15-alpine  --load  .
  4. #导出镜像
  5. docker save ubuntu/squid:latest  > ubuntu.tar
  6. docker save postgres:15-alpine > postgres.tar
复制代码
3. 运行 ARM 架构的镜像

关键修改点


  • sysctls 设置

    • 将 sysctls 设置从列表改为键值对映射:
      yaml复制
      1. sysctls:
      2.   net.core.somaxconn: "511"
      复制代码

  • healthcheck 设置

    • 确保 healthcheck 的 test 字段是一个列表:
      yaml复制
      1. healthcheck:
      2.   test: ["CMD", "redis-cli", "ping"]
      复制代码

1. 忽略警告

你可以通过设置 Redis 忽略这个警告。在 Redis 设置文件中(通常是 /etc/redis/redis.conf 或你的自界说设置文件),添加以下设置:
conf复制
  1. ignore-warnings ARM64-COW-BUG
复制代码
如果你使用的是 docker-compose,可以在 docker-compose.yml 文件中通过 command 参数添加这个设置。例如:
yaml复制
  1. version: '3.8'
  2. services:
  3.   redis:
  4.     image: redis:6-alpine
  5.     restart: always
  6.     sysctls:
  7.       net.core.somaxconn: "511"
  8.     environment:
  9.       REDISCLI_AUTH: ${REDIS_PASSWORD:-difyai123456}
  10.     volumes:
  11.       - ./volumes/redis/data:/data
  12.     command: redis-server --requirepass ${REDIS_PASSWORD:-difyai123456} --ignore-warnings ARM64-COW-BUG
  13.     healthcheck:
  14.       test: ["CMD", "redis-cli", "ping"]
复制代码
.直接解压mydata.zip文件
  1. [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端口占用环境使用如下命令:
  1. lsof -i tcp:80
复制代码
2、列出所有端口
  1. netstat -ntlp
复制代码
  1.     ulimits:
  2.       memlock:
  3.         soft: ${OPENSEARCH_MEMLOCK_SOFT:--1}
  4.         hard: ${OPENSEARCH_MEMLOCK_HARD:--1}
  5.       nofile:
  6.         soft: ${OPENSEARCH_NOFILE_SOFT:-65536}
  7.         hard: ${OPENSEARCH_NOFILE_HARD:-65536}
复制代码
希望本文的详细解析能帮助你在实际操作中顺利完成 x86 到 ARM 的 Docker 镜像迁移。如果有任何问题或需要进一步的帮助,欢迎咨询和交流。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表