目标 ARM64 麒麟电脑无法直接拉取 Redis 镜像,需在 Windows x86 电脑上通过 多架构构建工具(如 Docker Buildx) 生成适配 ARM64 的 Redis 镜像,再打包传输到目标设备。
一、核心问题:跨架构镜像兼容性
直接保存的 redis:latest 是 x86 镜像,无法在 ARM64 设备上运行。
目标机器无法拉取镜像,需在 Windows 上生成 ARM64 镜像后手动传输。
二、解决方案:使用 Docker Buildx 构建多架构镜像
步骤 1:启用 Docker Buildx
确保 Docker Desktop 已启用 Buildx(默认已支持):
docker buildx version
如果未启用,在 Docker Desktop 设置中勾选 “Enable Docker BuildKit”。
步骤2:创建 Buildx 构建器(支持多架构)
1、列出所有构建器实例
docker buildx ls
输出表明当前系统中有 3 个可用的构建器实例(multiarch、default、desktop-linux),且它们均支持 多架构(ARM64、ARMv7、PPC64le 等)。
STATUS 为 running 表示实例可用。
PLATFORMS 需包含 linux/arm64,否则无法构建 ARM64 镜像。
(1) 检查当前使用的构建器
docker buildx inspect --bootstrap | findstr "Name"
如果输出显示的是 default,而 default 不支持 ARM64,则需要切换到其他实例(如 multiarch-builder)。
(2)如果已有支持 ARM64 的构建器
直接切换到该实例:
docker buildx use multiarch-builder
验证是否切换成功:
docker buildx inspect --bootstrap | findstr "Platforms"
确保输出包含 linux/arm64。
(3)如果现有构建器不支持 ARM64
删除并根据下面的第2步重新初始化创建
# 删除旧实例(如 multiarch-builder)
docker buildx rm multiarch-builder
2、如果没有支持我想要的麒麟Linux的ARM64架构
①初始化 Buildx:
docker buildx create --name multiarch --use
docker buildx inspect --bootstrap
此命令创建并启用一个支持多架构的构建器实例。
②验证 Buildx 是否就绪:
docker buildx ls
确认输出中包含 multiarch 构建器,且状态为 ready。
注意:
(1)multiarch 构建器如果已经支持 ARM64(linux/arm64),构建完Redis的配置后,后续构建 MySQL的 ARM64的版本镜像时,可以跳过这步创建构建器了。
(2)multiarch 构建器 是全局的 Docker 资源,切换目录不会影响其可用性。无论你在哪个目录执行 docker buildx 命令,只要构建器名称(如 multiarch)和配置正确,就可以正常使用。
步骤 3:构建 ARM64 版本的 Redis 镜像
由于 Redis 官方镜像已支持多架构,我们可以直接用 buildx 拉取并重新打包(命令中指定的 -f Dockerfile 要求必须存在该文件):
docker buildx build --platform linux/arm64 -t redis:arm64-custom --load -f Dockerfile .
注意:Dockerfile 是一个文本文件,包含一系列指令(如 FROM、RUN、COPY 等),用于自动化构建镜像。没有 Dockerfile,Docker 无法知道如何构建镜像,更无法指定目标架构(如 ARM64)。
在执行 docker buildx build 时,因为打开的cmd默认当前目录是(C:\Users\admin),一开始此目录下是没有 Dockerfile 文件的,如果只是想基于官方 redis:latest 镜像构建 ARM64 版本,可以通过以下两个方法在 C:\Users\admin 下创建一个简单的 Dockerfile:
(1)创建 Dockerfile:
echo FROM --platform=linux/arm64 redis:latest > Dockerfile
或者用文本编辑器(如 Notepad)新建 Dockerfile,内容为:
# Dockerfile
FROM --platform=linux/arm64 redis:latest
或最简单就是:
①右键空白处 → 新建 → 文本文档。
②将文件名改为 Dockerfile(注意:删除 .txt 后缀,确保文件类型为 Dockerfile 而非 Dockerfile.txt)。
③如果系统隐藏了扩展名,需先启用显示扩展名:在文件资源管理器中点击 查看 → 勾选 文件扩展名。
用记事本打开 Dockerfile,粘贴以下内容:
FROM --platform=linux/arm64 redis:latest
(2)重新运行构建命令:
docker buildx build --platform linux/arm64 -t redis:arm64-custom --load .
其实最好是先新建一个文件夹比如redisDockerfile,然后在该目录下创建 Dockerfile,构建 ARM64 版本的redis镜像,再通过步骤4打包tar文件。(因为还需要创建MySQL等镜像然后打包,Dockerfile里需要的内容不一样不能复用)
步骤 4:打包镜像并传输
检查本地镜像列表
docker images
输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE
redis arm64-custom 62b6b206d951 10 minutes ago 105MB
如果镜像名称是 redis:arm64-custom,则应执行:
docker save -o redis-arm64.tar redis:arm64-custom
传输文件到 ARM64 设备:
使用 U 盘、SCP 或网络共享将 redis-arm64.tar 复制到目标机器。
步骤5:在 ARM64 设备上加载并运行Redis
打开终端,cd到tar文件所在目录;
1、加载镜像:
sudo docker load -i redis-arm64.tar
2、运行 Redis 容器:
sudo docker run -d -p 6379:6379 --name my-redis redis:arm64-custom
3、验证运行状态:
sudo docker exec -it my-redis redis-cli
输入PING结果PONG,容器 my-redis 正在运行与容器内的 Redis 服务正常响应;
三、最终: 测试redis连接
在目标电脑运行redis后,在另外一台电脑通过docker测试能不能连接redis;
麒麟Linux使用hostname -I
查看目标电脑IP;
docker run -it --rm redis redis-cli -h 199.169.39.77 -p 6379
如果连接成功,会进入 Redis CLI,输入 PING 应返回 PONG。
如果失败,会报错:
Could not connect to Redis at 199.169.39.77:6379: Connection refused
四、 拓展:
上面构建Redis已经创建过 ARM64 版本构建器,所以复用直接从步骤3开始构建ARM64 版本的 Mysql 、Java8镜像。
一、构建 ARM64 版本的 Mysql 镜像
步骤一、构建ARM64 版本的 Mysql 镜像
①右键空白处 → 新建 → 目录 mysql-arm64-build→文本文档。
②将文件名改为 Dockerfile(注意:删除 .txt 后缀,确保文件类型为 Dockerfile 而非 Dockerfile.txt)。
③如果系统隐藏了扩展名,需先启用显示扩展名:在文件资源管理器中点击 查看 → 勾选 文件扩展名。
用记事本打开 Dockerfile,粘贴以下内容:
docker buildx build --builder multiarch --platform linux/arm64 -t mysql-arm64:latest --load .
出现importing to docker
说明成功构建ARM64 版本的 Mysql 镜像。
步骤二、打包ARM64 版本的 Mysql 镜像
docker save -o mysql-arm64.tar mysql-arm64:latest
步骤三、在 ARM64 设备上加载并运行Mysql
打开终端,cd到tar文件所在目录;
(1)在目标 ARM64 设备上加载 mysql-arm64.tar :
sudo docker load -i mysql-arm64.tar
(2)运行 MySQL 容器
sudo docker run -d --name mysql-arm64 -e MYSQL_ROOT_PASSWORD=yourpassword -p 3306:3306 mysql-arm64:latest
如果3306端口被占用(默认密码123456):
sudo docker run -d --name mysql-arm64 -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 mysql-arm64:latest
(3)验证运行状态
docker ps | grep mysql-arm64
docker logs mysql-arm64
步骤四、 测试连接
mysql -h 199.169.39.77 -P 3306 -u root -p
输入密码 yourpassword,成功连接后应看到 MySQL 提示符:
mysql>
如果是3307:
mysql -h 199.169.39.77 -P 3307 -u root -p
二、构建 ARM64 版本的 Java8 镜像
参考上面的MySQL
步骤一、构建ARM64 版本的 Java8 镜像
cd D:\java8-arm64-build
docker buildx build --platform linux/arm64 -t java8-arm64:latest --load .
步骤二、打包ARM64 版本的 Java8 镜像
docker save -o java8-arm64.tar java8-arm64:latest
步骤三、在 ARM64 设备上加载并运行Java8
打开终端,cd到tar文件所在目录;
(1)在目标 ARM64 设备上加载 java8-arm64.tar :
sudo docker load -i java8-arm64.tar
(2)运行 Java8 容器
sudo docker run -d -p 8080:8080 java8-arm64:latest
①运行基础 Java 环境
sudo docker run -it --rm --name java-test java8-arm64:latest java -version
应输出类似:
openjdk version "1.8.0_XXX"
②运行 Java 应用(如 Spring Boot)
如果 Dockerfile 中已指定 CMD(如 java -jar myapp.jar),则直接运行:
sudo docker run -d --name myapp -p 8080:8084 java8-arm64:latest
检查容器状态:
sudo docker ps -a | grep myapp
查看日志:
sudo docker logs myapp
步骤四、 测试连接
Java 应用暴露 HTTP 端口(如 8080)
1、使用浏览器或 curl 测试:
Invoke-WebRequest -Uri "http://199.169.39.77:8080" -UseBasicParsing
或直接在浏览器访问 http://199.169.39.77:8080。
2、使用 PowerShell 测试端口连通性:
Test-NetConnection 199.169.39.77 -Port 8080
TcpTestSucceeded: True 表示端口可访问。
三、构建 ARM64 版本的 Nginx 镜像
参考上面的MySQL
步骤一、构建ARM64 版本的 Nginx 镜像
cd D:\nginx-arm64-build
docker buildx build --platform linux/arm64 -t nginx-arm64:latest -f Dockerfile . --load
步骤二、打包ARM64 版本的 Nginx 镜像
docker save nginx-arm64:latest -o nginx-arm64.tar
步骤三、在 ARM64 设备上加载并运行Nginx
打开终端,cd到tar文件所在目录;
(1)在目标 ARM64 设备上加载 nginx-arm64.tar :
sudo docker load -i nginx-arm64.tar
(2)运行 Nginx 容器
sudo docker run -d -p 80:80 --name nginx-test nginx-arm64:latest
步骤四、 测试连接
1、使用浏览器访问
打开浏览器,访问 http://199.169.39.77(替换为 ARM64 设备的实际 IP)。
预期结果:
显示 Nginx 默认欢迎页或自定义的 index.html。
2、 使用 Test-NetConnection 测试 TCP 端口
Test-NetConnection 199.169.39.77 -Port 80
成功输出:
ComputerName : 199.169.39.77
RemoteAddress : 199.169.39.77
RemotePort : 80
TcpTestSucceeded : True
五、查询所有容器状态:
检查现有的所有容器,
docker ps -a
应该有RedisMysql,而且STATUS里显示的时up正在运行