目录
在 x86 架构的机器上,使用 Buildx 构建 ARM 架构的 Docker 镜像:
随着 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
(二)注意事项
-
确保 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-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 架构的。 -
如果输出是
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:latest
docker 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.tar
docker 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 镜像迁移。如果有任何问题或需要进一步的帮助,欢迎咨询和交流。