x86 架构 Docker 镜像迁移至 ARM 环境的详细指南_dockerx86转arm镜像
目录
一、问题背景与分析
二、解决步骤
(一)检查 docker-compose 版本
(二)升级 docker-compose
1. 对于 Linux 系统
2. 对于 Windows 系统
(三)验证升级
(四)重新运行 docker-compose ps
(一)环境配置
(二)注意事项
(三)镜像拉取与转换
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-composesudo 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-composesudo 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 updatesudo apt install docker.iosudo systemctl start dockersudo systemctl enable docker
(二)注意事项
-
确保 QEMU 二进制文件已注册:在 x86 架构的机器上运行 ARM 架构的镜像,需要安装 QEMU 并注册 binfmt_misc 支持。
docker run --privileged --rm tonistiigi/binfmt --install all
-
启用 Docker 实验性功能:为了使用 Buildx 的多平台构建功能,需要启用 Docker 的实验性功能。
sudo vi /etc/docker/daemon.json
添加以下内容:
{ \"experimental\": true}
然后重启 Docker 服务:
sudo systemctl daemon-reloadsudo 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-composegit clone https://gitcode.com/ghmirrors/do/docker-xiaoyacd docker-xiaoyadocker-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 架构的。 -
如果输出是
armv7l
或aarch64
,则表示系统是基于 ARM 架构的。
2. 使用 lscpu 命令
lscpu
在输出中,查找 Architecture
一行。
3. 查看 /proc/cpuinfo 文件
cat /proc/cpuinfo
在输出中,查找 architecture
或 model 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:latestdocker push new-image:v1
(三)避免端口冲突
-
Centos 查看端口占用
比如查看 80 端口占用情况使用如下命令:
lsof -i tcp:80
-
列出所有端口
netstat -ntlp
五、总结
将 x86 架构的 Docker 镜像迁移到 ARM 环境,不仅需要技术层面的精细操作,还需要对整体架构和资源利用有深入的理解。随着 ARM 架构在服务器市场的逐步普及,掌握这一迁移技术将变得越来越重要。
补充:
-
导出镜像: 使用
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
注意事项
-
文件大小: 导出的
.tar
文件可能会比较大,具体取决于镜像的大小。确保目标机器上有足够的磁盘空间。 -
多平台镜像: 如果你导出的镜像支持多个平台(如 ARM 和 AMD64),导入后仍然可以使用这些多平台镜像。
2. 重新标记镜像
-
拉取 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.tardocker save postgres:15-alpine > postgres.tar
3. 运行 ARM 架构的镜像
关键修改点
-
sysctls
配置:-
将
sysctls
配置从列表改为键值对映射:sysctls: net.core.somaxconn: \"511\"
-
-
healthcheck
配置:-
确保
healthcheck
的test
字段是一个列表: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 镜像迁移。如果有任何问题或需要进一步的帮助,欢迎咨询和交流。