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

目录

一、问题背景与分析

二、解决步骤

(一)检查 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:latest
    ports:
      - "8080:8080"
  mysql:
    image: arm64v8/mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
  elasticsearch:
    image: arm64v8/elasticsearch:8.12.2
    environment:
      - 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-alpine
    restart: always
    sysctls:
      net.core.somaxconn: "511"
    environment:
      REDISCLI_AUTH: ${REDIS_PASSWORD:-difyai123456}
    volumes:
      - ./volumes/redis/data:/data
    command: redis-server --requirepass ${REDIS_PASSWORD:-difyai123456} --ignore-warnings ARM64-COW-BUG
    healthcheck:
      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 镜像迁移。如果有任何问题或需要进一步的帮助,欢迎咨询和交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CarlowZJ

我的文章对你有用的话,可以支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值