ARM设备安装Docker:arm64与amd64选型及实战配置

ARM设备安装Docker:arm64与amd64选型及实战配置 简介面向ARM64架构Linux系统的一键部署资源包供开发者、运维人员在树莓派等ARM设备上快速安装Docker 19.03.9及Docker Compose。包内包含安装脚本install.sh与Docker日志配置脚本以及Docker引擎离线压缩包、docker-compose-linux-aarch64可执行文件和systemd服务单元文件共5个文件压缩后约61.54MB结构简单直接。使用安装脚本即可完成依赖检查、二进制部署、服务注册与自启动配置免去手动下载和编译的繁琐流程。已有4174人学习或下载适合希望在不同ARM64环境如国产化服务器、边缘网关、嵌入式开发板中快速搭建容器运行环境的用户。 这两年ARM架构设备越来越常见预算有限的NAS、云主机的ARM实例、新出的Windows笔记本、以及几乎所有M系列芯片的Mac后台跑的都是arm64。可只要一到装Docker很多人就懵了下载页面里的amd64和arm64到底该选哪个我用错安装包踩过几次坑之后决定把这套东西彻底捋清楚。这篇不聊虚的直接从arm64 docker安装包的选择开始手把手带你判断架构、下载正确的安装包、完成安装再把镜像加速、MySQL和Redis部署这些高频动作一次配好。适合刚入手ARM设备、以及打算在ARM服务器上跑Docker的同学阅读。1. 先搞清楚架构arm64 和 amd64 的差别为什么重要1.1 一条命令判断当前机器的架构架构这个词听起来抽象其实可以类比成语言。一套CPU只能听懂自己的指令集arm64和amd64就是两种方言。Docker、容器镜像、以及你下载的安装包最终都要编译成CPU能执行的指令。判断当前机器是哪种架构最快的办法是看内核输出。在Linux或macOS终端里执行uname -m输出x86_64或amd64说明是Intel/AMD 64位架构输出aarch64或arm64说明是ARM 64位架构。部分Linux系统也会显示arm64不用纠结两者在Docker语境下是同一个东西。Windows系统更直接在CMD里执行echo %PROCESSOR_ARCHITECTURE%结果是AMD64就是x64结果是ARM64就是ARM64。也可以打开“设置-系统-系统信息”在“系统类型”里看到完整描述。如果输出是armv7l这类属于老款32位ARM设备跑Docker会比较吃力很多官方镜像都不再提供32位ARM版本建议直接放弃折腾。1.2 选错架构会踩出哪些坑选错架构的直接后果就是安装后无法运行。最典型的例子是Windows on ARM笔记本下载了Download for Windows – AMD64的Docker Desktop安装包安装过程可能不报错但启动时直接提示virtualisation support wasnt detected或者进程起来后反复重启。Linux上错误更明显下载了x86_64版的静态二进制包执行时直接提示Exec format error因为内核不认这个ELF格式。Docker镜像也一样。虽然官方镜像大多做了“多架构发布”但确实还有不少老镜像只提供amd64版本。如果ARM机器上强行拉取这种镜像容器创建后跑不起来docker logs里能看到架构相关的报错。所以无论是装Docker本身还是选业务镜像架构匹配都是前提。这也解释了为什么下载页要把amd64和arm64分开列出。2. 各平台获取 arm64 Docker 安装包的渠道2.1 LinuxUbuntu/Debian用软件源安装在Linux上获取arm64 Docker安装包最推荐的方式不是下载离线包而是直接配置Docker官方软件源。Docker官方源会检查当前系统架构ARM64设备会自动使用arm64的包。以Ubuntu为例先安装依赖并添加GPG密钥sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod ar /etc/apt/keyrings/docker.asc然后写入软件源列表。注意下面的arch$(dpkg --print-architecture)部分这个命令在ARM64设备上会输出arm64确保apt源只拉取arm64包echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release echo $VERSION_CODENAME) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null之后执行sudo apt-get update再装docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin即可。安装完建议用docker info确认Architecture一栏是aarch64。注意如果不想折腾官方源部分发行版直接sudo apt install docker.io也能用只是版本更旧。对生产环境我倾向于官方源稳定性和更新节奏都更可控。2.2 Windows 平台Docker Desktop 的两个安装包别选错Docker Desktop 官方下载页把Windows安装包分成了两个版本Download for Windows – AMD64和Download for Windows – ARM64。选择原则很简单Intel或AMD处理器选AMD64骁龙X系列或联发科芯片的Arm Windows选ARM64。我自己在骁龙X Elite笔记本上装过arm64版本配合WSL2使用很顺。但前提是先打开Windows功能里的“虚拟机平台”和“适用于Linux的Windows子系统”再执行一次wsl --update然后安装Docker Desktop。装上之后启动它会自动识别当前是ARM64系统。如果之前误装了AMD64版建议完整卸载再下载ARM64安装包重装避免残留配置干扰。2.3 macOS 与其他场景直接匹配版本macOS的Docker Desktop下载页同样区分Intel与Apple SiliconM系列芯片选Apple Silicon下载对应就是arm64。Linux ARM服务器如果不想用软件源也可以去Docker官方静态包目录下载路径是download.docker.com/linux/static/stable/aarch64/选择最新的docker-xx.tgz解压到/usr/local/bin使用。这种方式适合没有systemd的嵌入式环境日常管理不如apt源方便我就不展开细说了。3. 安装后的必配项镜像源加速与数据目录调整3.1 为什么 ARM 环境下镜像拉取经常失败镜像拉取失败和架构没有直接关系主要是网络问题。默认Docker Hub在某些网络环境下连接不稳定经常出现dial tcp: lookup ... no such host或超时。ARM小主机用户遇到的另一类问题是某个镜像根本没有arm64版本拉取时提示manifest unknown。这时候再换加速源也没用只能找官方多架构镜像或自己build。3.2 配置 registry-mirrors 解决超时解决Docker Hub超时最常用的是配置镜像加速器。先创建配置文件sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://你的加速地址] } EOF加速地址建议使用云厂商控制台生成的专属地址或者公司内自建的Registry不要在网上随便找一个填进去很多已经失效。改完后执行sudo systemctl restart docker docker info看到Registry Mirrors列表里出现你配置的地址说明生效。如果pull镜像时还是慢可以多配置几个镜像地址Docker会按顺序尝试。3.3 顺手把数据根目录改到大分区ARM NAS或迷你主机通常系统盘不大Docker默认数据目录在/var/lib/docker跑几个容器、积累些镜像和日志根分区很容易被占满。建议准备一块独立数据盘挂载到比如/data然后在daemon.json里加上{ data-root: /data/docker, registry-mirrors: [https://你的加速地址] }修改前先停掉Docker把旧数据迁移到新目录sudo systemctl stop docker sudo mv /var/lib/docker /data/docker sudo systemctl start docker顺序千万别反。先启动再改目录Docker会以为容器数据丢失重新创建空目录之前跑的容器全都没了。4. 从“能跑”到“好用”部署 MySQL 8.0 和 Redis 主从4.1 自动匹配架构的多架构镜像现在Docker官方镜像普遍支持multi-arch执行docker pull mysql:8.0Docker会自动根据当前机器架构拉取对应平台镜像。如果怀疑拉错了可以用docker image inspect mysql:8.0 --format {{.Os}}/{{.Architecture}}输出linux/arm64就说明镜像架构正确。如果你手动指定--platform linux/amd64反而可能在ARM宿主机上跑不起来除非装了QEMU模拟。4.2 持久化部署 MySQL 8.0我习惯先建一个自定义bridge网络方便后续容器互通docker network create app-net docker run -d --name mysql8 \ --network app-net \ -e MYSQL_ROOT_PASSWORD你的密码 \ -e TZAsia/Shanghai \ -p 3306:3306 \ -v /data/mysql:/var/lib/mysql \ mysql:8.0-v /data/mysql:/var/lib/mysql是把宿主机目录挂进容器这样容器删了数据还在。宿主机目录建议提前确认空间充足否则MySQL初始化写到一半磁盘满又要清理重来。MySQL 8.0默认使用caching_sha2_password认证如果项目里用的是老版本驱动连接时可能报认证插件错误。最简单的解决办法是在docker run里加--default-authentication-pluginmysql_native_password或者启动后创建一个老认证方式的专用用户。4.3 Redis 主从部署与验证Redis主从部署比MySQL还简单两个容器就能搭起来docker run -d --name redis-master --network app-net -p 6379:6379 -v /data/redis-master:/data redis:7 redis-server --appendonly yes docker run -d --name redis-slave --network app-net -p 6380:6379 -v /data/redis-slave:/data redis:7 redis-server --appendonly yes --replicaof redis-master 6379--replicaof是较新的参数老版本用--slaveofRedis 5以后建议统一用前者。部署完成后验证主从状态docker exec -it redis-master redis-cli info replication输出里看到connected_slaves:1就说明从节点已经连上。如果之前不小心用--platform linux/amd64拉取了Redis镜像主从功能大概率还是能工作但性能会受到模拟层影响生产环境不建议这么干。5. 常见问题与排查技巧实录5.1 “exec format error” 的三种典型成因出现exec format error绝大多数是架构不匹配常见三种情况手动下载了错误架构的二进制安装包拉取镜像时用了--platform linux/amd64而宿主机没有对应模拟层在x86机器上直接运行arm64容器没启用binfmt模拟。排查顺序可以这样先uname -m确认宿主机架构再用docker image inspect 镜像名 --format {{.Architecture}}看镜像架构最后看容器启动命令是否强加了平台参数。如果是想跨架构测试Linux上可以装qemu-user-static并注册binfmt但生产环境不建议引入这种复杂度。5.2 Docker Desktop 报 virtualisation support wasnt detectedWindows on ARM装好arm64版Docker Desktop后启动时如果报failed to start because virtualisation support wasnt detected多半不是安装包选错而是系统虚拟化功能没打开。先把“控制面板-程序-启用或关闭Windows功能”里的“虚拟机平台”和“适用于Linux的Windows子系统”勾上重启电脑后执行wsl --update再启动Docker Desktop。如果问题依旧进BIOS确认虚拟化开关是否开启在ARM笔记本上通常叫VirtualizationIntel/AMD平台对应VT-x或SVM。5.3 镜像下载超时或镜像源失效怎么办镜像拉取超时先看完整报错再动手。常见路径是docker pull报超时就检查DNS和网络连通性报no such host通常是域名解析问题报no space left on device则是磁盘满了需要先清理空间。镜像源失效的更直接docker info里看Registry Mirrors有没有生效不合适就换新的。日常可以定期执行docker system prune清理无用镜像和构建缓存减轻磁盘压力。5.4 如何确认容器跑的是 arm64 版本部署完想确认容器架构进容器看一眼最直观docker exec -it 容器名 uname -m输出aarch64就是arm64容器输出x86_64说明跑的是amd64容器。不进入容器也可以用docker inspect --format {{.Architecture}} 容器名查看镜像架构用docker image inspect --format {{.Architecture}} 镜像名:标签我一般部署完都会固定检查一次防止某些自动化脚本在拉镜像时无意加了--platform导致架构漂移。6. 实操小结与踩坑心得6.1 用对安装包只是开始我最初在ARM Windows上装错amd64版Docker Desktop反复重启都进不去后来才发现除了选对arm64安装包还要把WSL2内核更新到最新。Linux服务器上则是把apt源、daemon.json和数据目录一次配齐。架构问题不是跑通就结束了后续每次拉镜像、跑容器都要留意平台是否匹配。现在这套组合在一台ARM小主机上稳定跑了半年MySQL和Redis都在里面日常备份也正常。6.2 后续还能这样扩展配好基础环境后可以把常用镜像导出成tar包比如docker save -o mysql8-arm64.tar mysql:8.0这样在没有公网下载条件的内网机器上直接docker load -i mysql8-arm64.tar就能恢复。也可以把端口、数据卷和网络配置整理成docker-compose.yml下次部署只要执行docker compose up -d少敲一堆命令也减少参数写错的风险。最后提醒一句ARM设备跑Docker已经很成熟但遇到问题先查架构再查网络最后才是镜像本身。按这个顺序排查能省下大量时间。本文还有配套的精品资源点击获取