银河麒麟aarch64安装Docker 18.09.7与yum源依赖避坑
发布时间:2026/10/24 17:52:40 锦皓数字建站

简介这份文档面向在国产化服务器环境中部署容器平台的运维工程师与信创适配人员聚焦银河麒麟 v10 SP1 Server 上 Docker 的落地安装问题。由于官方源缺少 docker server 软件包文档给出阿里云 docker-ce 源与麒麟官方依赖源的配置方法并说明为何只能安装 18.09.7 版本、无法直接升级到最新版。资源为 1 个 docx 文件压缩包约 17KB体量轻便适合离线查阅或随环境交付存档。内容按「配置 yum 源—安装 docker-ce-cli 与 docker-ce—启动服务—查看版本」的顺序组织附有完整 repo 文件内容、可复制的命令与真实报错信息读者可据此快速复现安装流程并借助其中的 container-selinux 依赖报错分析掌握排查思路。该文档已有 7220 人学习下载对需要在麒麟系统上搭建容器运行环境的初、中级用户具有直接参考价值。1. 从一台 aarch64 服务器说起麒麟上装 Docker 为什么先降版本第一次在银河麒麟 v10 SP1 Server 上敲yum install docker-ce多数人以为十分钟能收工结果终端甩回一行nothing provides container-selinux 2:2.74。机器是 aarch64 架构系统自带源里压根没有 docker server 包第三方源里最新版的依赖又跟麒麟的 selinux 策略包对不上装到一半就卡死。这类机器在国产化改造的场景里太常见了docker 银河麒麟这个组合踩的坑九成都集中在「版本对不上」和「源没配对」两件事上。下面按我实际装过的那套流程走一遍先核对架构和版本再配双源然后按 cli → engine 的顺序钉死 18.09.7最后给一套能自查的验收命令。手上正卡在依赖报错、或者装完 docker 起不来的开发者可以照着复现。2. 装前把底子摸清麒麟 v10 SP1 的架构、内核与版本取舍动手改源之前先花三分钟做体检。这一步偷懒的人最多后面翻车的也最多——源地址里的$basearch填错、把 x86_64 的包往 aarch64 机器上怼、内核太老撑不起 overlay2都是在这个环节埋下的雷。2.1 三条命令确认系统版本、内核与 CPU 架构# 麒麟自己的发行版标识确认是不是 v10 SP1 cat /etc/kylin-release # 通用发行版信息重点看 ID 和 VERSION_ID cat /etc/os-release # CPU 架构aarch64 还是 x86_64直接决定源地址里 $basearch 展开成什么 uname -m # 内核版本4.19 及以上对 overlay2、cgroup v2 的支持才比较稳 uname -r/etc/kylin-release是麒麟特有的文件CentOS 上没有用它确认小版本号最直接SP1 和 SP2 的源路径不一样抄错一个字整段源就废。/etc/os-release里的ID字段一般会写成kylin有的镜像版本写成centos这会影响后面 yum 变量展开的行为装之前心里要有数。uname -m是关键中的关键。飞腾、鲲鹏这类机器输出aarch64海光、兆芯输出x86_64。同一个 Docker CE 源里两个架构的包是分目录放的$basearch写对了 yum 才会去对应目录取包。我见过有人把 x86_64 机器的 repo 文件整体拷到 aarch64 机器上$basearch虽然会展开但如果写成了硬编码的x86_64yum 就会报「没有可用软件包」而且报错信息完全不提架构的事特别迷惑。内核版本决定存储驱动。麒麟 v10 SP1 常见内核在 4.19 一带overlay2 能用如果碰上更老的 4.4 内核就得退回devicemapper性能和稳定性都差一截。先看清楚省得装完再折腾。检查项命令期望值不匹配的后果系统版本cat /etc/kylin-releaseKylin Linux Advanced Server V10 (SP1)源路径写错元数据拉不下来CPU 架构uname -maarch64 / x86_64拉到错误架构的包安装直接失败内核版本uname -r4.19 及以上overlay2 不可用需换存储驱动磁盘空间df -h /var剩余 20G 以上镜像一多就写满docker 服务假死2.2 版本选择18.09.7-3.el7 与 20.10 的取舍Docker CE 在 EL 系仓库里同时维护 el7 和 el8 两个包线aarch64 的构建产物主要挂在centos/7/aarch64/stable下面。麒麟 v10 SP1 的 glibc 和 systemd 版本其实更接近 EL8 时代但 el7 的 docker 包依赖少、自带组件多反而更容易在这套系统上落地。真正卡住的是新版。20.10 系列的 rpm 包在 spec 里硬性声明了container-selinux 2:2.74而麒麟 v10 SP1 自带源里的 container-selinux 版本低于这个门槛第三方源又不提供 aarch64 的 container-selinux于是依赖链在第一步就断了。yum 给出的建议是加--skip-broken或--nobest这两个参数看着像救命稻草实际上--skip-broken会把 docker-ce 本身也跳过--nobest则会降级去挑一个更老的候选包结果往往装上一个版本号更乱的残件。版本包名关键依赖在麒麟 v10 SP1 aarch64 的实际情况18.09.7docker-ce-18.09.7-3.el7依赖链短运行时组件内置能装、能起、能跑容器20.10.xdocker-ce-3:20.10.17-3.el7container-selinux 2:2.74源里找不到满足条件的包解析失败所以这份环境里我固定用18.09.7-3.el7。它不算新但 Docker 的 API 版本兼容性一向做得好日常的镜像构建、容器编排、私有仓库对接都不受影响。真要上新版得先自己编译 container-selinux 或者从别的源里找 aarch64 的包手动装那是另一个工作量级的事不适合在业务机器上折腾。2.3 装前清场卸掉残留 docker 与冲突包很多麒麟机器出厂自带 podman 或者装过旧版 docker直接覆盖装会出现二进制打架、/etc/docker目录残留配置覆盖新配置的问题。装之前先清一遍。# 卸掉历史遗留的 docker 相关包不存在也不会报错 yum remove -y docker docker-client docker-client-latest docker-common \ docker-latest docker-latest-logrotate docker-logrotate docker-engine # 看看有没有 podman / buildah / containerd / runc 占着底层依赖 rpm -qa | grep -E podman|buildah|containerd|runc # 残留的运行时目录确认没在用再删 ls -ld /var/lib/docker /etc/docker /run/docker.sock 2/dev/null第一条命令里的包名是从 EL 系历史沿革下来的麒麟上大部分不存在yum remove对不存在的包会静默跳过不会有副作用。第二条命令是重点podman 和 docker 都依赖 containerd、runc 这些底层组件但版本要求不一样如果系统里已经装了 podman 自带的一套 runcdocker 装上去可能跑的是不兼容的 runc 版本表现是容器起来了但秒退日志里报OCI runtime create failed。这种情况要么卸 podman要么用yum install时观察 runc 是否被升级。/var/lib/docker目录如果存在且里面还有旧数据新装的 docker 会直接接管镜像层格式不兼容时会出现「镜像列表里有但起不来」的怪现象。确认没数据就rm -rf有数据先备份。这一步做完环境才算干净。3. 配置 yum 源docker-ce 源加麒麟官方源的组合打法麒麟官方源里查不到 docker server 的包这是前提事实所以必须引第三方源。但只加第三方源又不够——docker 运行还需要libcgroup、iptables、container-selinux这类系统级依赖它们得从麒麟自己的源里来。两个源各管一段缺一个都装不完整。3.1 写 docker-ce.repo$basearch与 gpgcheck 两个关键参数先备份现有源出事能整段回滚这是血泪经验。# 备份现有 repo 文件到 /root 下出问题直接拷回来 mkdir -p /root/repo-backup cp -a /etc/yum.repos.d/*.repo /root/repo-backup/ # 新建 docker-ce 源文件 vi /etc/yum.repos.d/docker-ce.repo文件内容如下[docker-ce-stable] nameDocker CE Stable - 7 baseurlhttps://镜像站域名/docker-ce/linux/centos/7/$basearch/stable enabled1 gpgcheck1 gpgkeyhttps://镜像站域名/docker-ce/linux/centos/gpgbaseurl里的镜像站域名换成你环境里能访问的 Docker CE 镜像站域名内网有同步源就填内网地址比走公网稳。路径里的centos/7不是指操作系统必须是 CentOS 7而是 Docker 官方对 EL7 包线的目录约定aarch64 的构建产物就在centos/7/aarch64/stable下面。$basearch是 yum 的内置变量在 aarch64 机器上自动展开成aarch64在 x86_64 上展开成x86_64所以这一行在两个架构上都能用不要手写成固定值。gpgcheck1配合gpgkey做包签名校验安全上应该开。但如果内网镜像站是自建的、没有同步 gpg 文件校验会失败并报GPG key retrieval failed这时候要么把 gpgkey 指向内网可达的地址要么临时设gpgcheck0——后者是妥协装完记得改回来。enabled1表示默认启用。如果同一个 repo 文件里想禁用某个仓库单独写enabled0即可不用删文件。3.2 补一份麒麟官方源依赖包从这里来麒麟的源文件通常已经在/etc/yum.repos.d/下了文件名类似kylin_aarch64.repo。先看现有的# 列出所有 repo 文件 ls -l /etc/yum.repos.d/ # 看现有源里都配了哪些 baseurl抄一个能用的 grep -rh baseurl /etc/yum.repos.d/*.repo如果现有的源被禁用了或者地址失效需要补一份。内容参照这个结构[ks10-os-media] name Kylin Linux Advanced Server 10 - Os baseurl http://麒麟官方源域名/yum/v10/sp1-openstack-q/aarch64/os/ gpgcheck 0 enabled 1baseurl里的路径要跟你的系统版本严格对应v10 和 v10 SP1 的目录名不同sp1 后面还带-openstack-q这类仓库标识抄错就 404。最稳的办法是从机器上已有的源文件里复制一行过来改不要凭记忆手敲。gpgcheck 0在这里是常见做法。麒麟官方源的 gpg key 分发不一定完整开了校验经常拉不下来元数据导致整个源不可用。这个源只用来装系统依赖包风险可控但对安全要求高的环境还是应该把 key 导进去再开校验。3.3 刷新缓存并确认两个源都生效源文件写完不等于生效yum 有元数据缓存不清就是旧的。# 清掉所有缓存包括元数据和包 yum clean all # 重建缓存这一步会去两个源拉元数据耗时看网络 yum makecache # 列出所有启用的仓库确认 docker-ce-stable 和麒麟源都在 yum repolist # 看 docker-ce 有哪些可用版本重点确认 18.09.7-3.el7 在列表里 yum --showduplicates list docker-ceyum repolist的输出里每个仓库后面会跟一个包数量如果某个源显示0或者状态是repodata is over 2 weeks old说明元数据没拉到先解决源连通性再往下走。--showduplicates list会把同一个包的所有可用版本列出来aarch64 的 18.09.7 应该出现在 docker-ce-stable 那一列没出现就是$basearch或者路径写错了。麒麟 v10 上yum其实是dnf的软链接两条命令等价但dnf的报错信息更详细排查依赖问题时用dnf往往能多看到一层原因。4. 用 yum 装 docker-ce 18.09.7先 cli 再 engine 的顺序不能反源配好之后安装本身只有两条命令但顺序和版本号的写法有讲究。docker-ce这个包依赖docker-ce-cli的精确版本一次性装会让 yum 自己去解析依赖解析结果不一定是你要的那个版本。4.1 先装 docker-ce-cli把版本号钉死# 显式指定完整版本号连 release 号一起写 yum install -y docker-ce-cli-18.09.7-3.el7版本号必须写全18.09.7-3.el7只写18.09.7会让 yum 去匹配所有 release可能挑到el7之外的构建。-y是免交互确认脚本化部署时必带。为什么先装 clidocker-ce的 rpm 里声明了Requires: docker-ce-cli 18.09.7-3.el7这样的精确依赖。如果直接yum install docker-ce-18.09.7-3.el7yum 会顺带解析出 cli 的依赖理论上也能装上。但实际情况是仓库里同时存在 20.10 的 cliyum 的依赖解析器在遇到多版本候选时可能挑最新的那个装完就变成 cli 是 20.10、engine 是 18.09.7docker version里 Client 和 Server 版本对不上某些 API 调用直接报client version too new。先把 cli 钉死engine 安装时的依赖解析就只剩一层冲突概率大幅下降。这是我在几台机器上反复验证过的顺序不按这个来也能成但失败的次数明显更多。4.2 再装 docker-ceengine 与 cli 版本对齐# 同样写全版本号 yum install -y docker-ce-18.09.7-3.el7装完立刻核对 rpm 层面的一致性# 两个包的版本号应该完全一致 rpm -qa | grep docker-ce正常输出是两行docker-ce-18.09.7-3.el7.aarch64和docker-ce-cli-18.09.7-3.el7.aarch64架构后缀也必须是 aarch64。如果看到x86_64或者只有一行说明依赖解析出了问题yum remove重来。有个参数值得提一句--setoptobsoletes0。某些第三方源里会把 docker-ce 标记为废弃某个旧包加上obsoletes0能阻止 yum 顺带删掉你不想删的东西。一般用不上但在源比较杂的环境里是道保险。4.3 启动、开机自启与版本验证# 启动服务 systemctl start docker # 设开机自启服务器重启后容器要能自己回来 systemctl enable docker # 看服务状态--no-pager 避免输出被分页截断 systemctl status docker --no-pager # 只看客户端版本 docker --version # 客户端和服务端版本都看这个才是完整信息 docker versiondocker --version只打印一行Docker version 18.09.7, build 2d0083d那是客户端版本服务端起没起来它完全不管。很多人执行完这条看到版本号就以为装好了实际 dockerd 可能根本没跑。docker version会分成 Client 和 Server 两段输出Server 段能打出来才说明守护进程活着。这是验收环节最容易糊弄过去的一步。systemctl status的输出里如果看到Active: active (running)就正常如果是failed往下翻几行会有具体的错误原因配合journalctl -u docker -n 50 --no-pager能看到更详细的启动日志。4.4 配 daemon.jsondata-root、日志与 cgroup driver装完能跑只是及格线配置文件不改跑一阵子会出问题。/etc/docker/daemon.json是守护进程的主配置改完要systemctl daemon-reload systemctl restart docker。{ data-root: /data/docker, log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, exec-opts: [native.cgroupdriversystemd], storage-driver: overlay2 }># 有网的机器上导出busybox 镜像只有几 MB docker save -o busybox.tar busybox:latest # 拷到目标机器后导入 docker load -i busybox.tar # 用导入的镜像做冒烟测试能看到输出就说明运行时链路完整 docker run --rm busybox:latest echo docker ok--rm让容器退出后自动清理不留垃圾。这条命令打出来docker ok说明镜像加载、容器创建、runc 调用、网络命名空间初始化整条链路都是通的比单纯看版本号有说服力得多。如果这一步报网络相关的错再加--network none试一次能跑就说明是网络配置的问题不是 docker 本身。docker info里还有个容易被忽略的字段是Cgroup Driver配了 systemd 的话这里应该显示systemd显示cgroupfs说明exec-opts没生效。另外docker network ls应该能看到bridge、host、none三个默认网络少一个就说明 dockerd 初始化时出了问题去journalctl -u docker里翻。从那以后我每次装完麒麟的 docker都强制走一遍docker version的双端对齐检查再跑一条离线镜像的冒烟命令两步都过了才往生产环境推。这套流程不复杂但能挡掉八成「装完了但跑不起来」的返工。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。