简介:面向银河麒麟V10 SP1 Server操作系统的Docker安装实操手册,专门针对国产化环境下docker-ce部署依赖不全、官方源无docker server软件包等问题,给出可复用的安装方案,适合系统运维工程师、麒麟平台部署人员及国产化迁移项目参与者参考。资源为单个docx文档,压缩包约17KB,内容紧凑、步骤明确,可对照执行。手册内容覆盖yum仓库配置(阿里Docker源与麒麟官方源联合)、docker-ce-cli与docker-ce 18.09.7-3.el7版本安装、启动与验证,并提示最新版docker因container-selinux等依赖问题而无法安装的报错原因,帮助读者避开常见坑点。目前已有7148人在CSDN学习或下载该资源。
1. 银河麒麟v10 sp1 装 Docker:为什么绕不开 18.09.7 这个固定版本
拿到一台银河麒麟v10 sp1 server(aarch64 架构)时,我第一件事是跑yum install docker-ce,结果被一条报错直接堵住:nothing provides container-selinux >= 2:2.74 needed by docker-ce-3:20.10.17-3.el7.aarch64。这既不是网络问题,也不是源没配好,而是麒麟的依赖树根本喂不饱最新版 docker。折腾一轮之后,能稳定落地的方案只有一个:锁定 docker-ce 18.09.7 这个固定版本,先把docker-ce-cli-18.09.7-3.el7装上,再装docker-ce-18.09.7-3.el7,系统依赖全部走麒麟官方源补齐。下面这套步骤和踩坑记录,就是给在 ARM 麒麟服务器上部署容器环境的运维和开发准备的。
2. 装 Docker 前的底数核查:aarch64 架构、双 yum 源与版本对应关系
很多人一上来就写 repo 文件、跑安装命令,结果报错之后才发现连机器是 x86 还是 ARM 都没确认。麒麟 v10 sp1 同时发 x86_64 和 aarch64 两套 iso,docker-ce 的 RPM 包也分两种架构,repo 里的$basearch变量会自动解析,但前提是你得知道自己属于哪一套。下面先说清楚开工前必须确认的三件事。
2.1 先认清机器:aarch64 还是 x86_64,内核是不是麒麟改过的 4.19
确认架构用uname -m,确认系统版本看/etc/os-release,再顺便看一眼内核版本。
uname -m cat /etc/os-release | head -5 uname -runame -m输出aarch64说明这是 ARM 64 位机器,实际跑在鲲鹏 920 这类芯片上;输出x86_64则走另一套 rpm 包。麒麟 v10 sp1 的内核默认是 4.19 系列,但打过麒麟自己的补丁,版本号里会带kylin字样,uname -r看一眼就知道系统是不是被换过内核的。这一步别省,因为后面所有 docker 存储驱动、iptables 兼容性问题都跟内核有关。
2.2 双源逻辑:为什么阿里 docker 源不够用,麒麟官方源又不能省
银河麒麟 v10 sp1 的官方源里没有 docker-ce 软件包,这是手册里明确写到的。所以要装 docker,第一步必须是引入第三方源,常见做法是走阿里云镜像。但阿里源只提供 docker 本体和它的直接组件,docker-ce 的 RPM 依赖链条里还有container-selinux、audit-libs-python、iptables等系统级包,这些必须从麒麟官方源拿——因为阿里源是按 CentOS 7 的 yum 仓库结构组织的,它的依赖元数据对麒麟系统不成立,硬指过去会出现“找不到基准”的错。
| 源 | 提供内容 | 作用 |
|---|---|---|
| 阿里 docker 源 | docker-ce、docker-ce-cli、containerd.io | docker 本体及 CLI 工具 |
| 麒麟官方源 | container-selinux、audit-libs-python、iptables 等系统依赖包 | 补齐依赖树,保证 yum 能完成整条解析 |
实际安装时,yum 会同时读这两个源,RPM 包本体从阿里拉,缺失的系统依赖从麒麟源补。两个源缺一个都会导致安装中断。
2.3 el7 后缀的含义:麒麟不是 CentOS,但依赖按 CentOS 7 的规范解析
docker-ce 的 rpm 包名里带着el7,比如docker-ce-18.09.7-3.el7.aarch64.rpm,很多人看到这个很心虚,觉得麒麟是不是装不了。这里要说透:el7不是指这个包只能在 CentOS 上跑,而是指它的依赖关系按照 RHEL 7 / CentOS 7 的规范声明。麒麟 v10 sp1 的包体系兼容这个规范,所以阿里源里linux/centos/7/路径下的 aarch64 仓库可以直接用。这也是为什么 baseurl 要指向 centos/7 而不是 centos/8,方向错了版本解析就对不上。
3. 配置 yum 源:阿里 Docker 源与麒麟官方源的写法及参数拆解
底数摸清之后,下一步就是落地两个 repo 文件。这部分参数有一个算一个,全都要能解释清楚,否则后面 gpg 校验失败或者 404 了你都不知道往哪儿查。
3.1 新建 docker-ce.repo:阿里源的路径结构与参数逐行拆解
在/etc/yum.repos.d/目录下新建文件docker-ce.repo,内容如下。
[docker-ce-stable] name=Docker CE Stable - 7 baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-stable]是仓库唯一标识符,yum 通过它去重;baseurl里的$basearch是变量,aarch64 机器上会自动解析成aarch64,所以实际请求的是https://mirrors.aliyun.com/docker-ce/linux/centos/7/aarch64/stable,不需要你手动改成 arm64 之类的路径;gpgcheck=1表示拉下来的 rpm 要做签名校验,公钥从gpgkey指定的地址下载。如果你的服务器在内网,访问公网不通,这两个参数是第一批要调整的,后面避坑章会说。
3.2 配置 kylin_aarch64.repo:依赖包从这里补齐
单独新建麒麟官方源文件,名字随意,但路径里的 sp 版本号一定不能抄错。
[ks10-os-media] name = Kylin Linux Advanced Server 10 - Os baseurl = http://archive.kylinos.cn/yum/v10/sp1-openstack-q/aarch64/os gpgcheck = 0 enabled = 1这里有个细节值得注意:baseurl里是sp1-openstack-q,这个仓库是麒麟为服务器场景维护的集合仓库,aarch64 的依赖包都集中在os子路径下。gpgcheck=0是因为麒麟源的签名公钥在部分内网环境下拉不回来,手册里也直接关掉了校验,这在企业内网部署里是常见做法,不算错误配置。
3.3 验证源配置:repolist、makecache 与常见的 404 排查
配置完两个 repo 文件之后,先清理缓存再重建,然后看仓库是否正常加载。
yum clean all yum makecache yum repolistyum clean all会清掉/var/cache/yum下的旧元数据,这一步在改过 repo 之后必须做,否则 yum 可能用缓存里的旧索引去解析,表现成“明明改了源却不生效”。yum repolist输出里应该能看到两个仓库,repo id 分别是docker-ce-stable和ks10-os-media。如果makecache阶段报 404,多半是路径里的版本号不对,或者内网 DNS 解析不到archive.kylinos.cn,优先检查这两处,不要急着改http为https。
4. 固定版本安装 Docker:从 docker-ce-cli 到 docker-ce 的完整命令链
源配好之后,真正的安装阶段其实只有几步命令,但顺序有讲究。先装谁后装谁,不是随手写的,而是由 RPM 的依赖关系决定的。
4.1 为什么必须先把 docker-ce-cli 锁版本
直接yum install docker-ce会触发 yum 自动解析依赖,它大概率会选仓库里最新版的docker-ce-cli和containerd.io,然后和你要装的固定版本拼出一个“混搭依赖树”。后果就是 dockerd 是 18.09.7,而 CLI 可能是 20.10.17,两边协议握手直接失败,docker ps都能跑,但docker exec或者容器 attach 时行为诡异,非常难排查。所以正确顺序是:先把 CLI 钉死在指定版本,再装 docker-ce 本体,让 yum 顺着已经锁死的依赖去匹配。
yum install -y docker-ce-cli-18.09.7-3.el7 yum install -y docker-ce-18.09.7-3.el7这里-y表示自动确认,省去交互提示;版本号18.09.7-3.el7是完整写法,-3是 release 号,.el7是构建目标系统标记,aarch64 架构下 yum 会自动选对应 rpm,不用你手动指定架构后缀。两条命令依次执行,如果第二条报依赖缺失,回头检查第三章里麒麟源是不是没配好。
4.2 启动并验证:systemctl 和 docker 双端检查
安装完成后启动服务并验证,命令如下。
systemctl start docker systemctl status docker docker --version docker versionsystemctl start docker只是启动服务,systemctl status docker能看到active (running)字样才算真正起来;docker --version输出的是客户端版本,预期是Docker version 18.09.7, build 2d0083d;docker version则同时显示 Client 和 Server 两段信息,Server 段出现才是 dockerd 正常响应的证据。很多人只看systemctl就说“启动成功”,其实 dockerd 崩了 systemd 有时候都不报错,docker version的 Server 段才是硬标准。
进一步验证容器能跑,拉个 hello-world 镜像。
docker run hello-worldaarch64 机器会拉取linux/arm64变体镜像,如果镜像拉取因为网络问题失败了,可以用docker pull busybox:latest代替验证,busybox 镜像小,拉取成功率更高。
4.3 如果仓库里有多个版本:用 showduplicates 查版本再精确锁定
如果你不是照抄手册,而是想确认仓库里有哪几个版本可用,用yum --showduplicates list查。
yum --showduplicates list docker-ce输出会列出仓库中所有可用版本,包括18.09.7-3.el7、20.10.17-3.el7等,选择目标版本后yum install docker-ce-<完整版本号>即可锁定安装。注意--showduplicates必须和list搭配使用,单独写yum list docker-ce默认只显示最高版本,你会误以为仓库里只有一个版本可选。
5. 常见问题与避坑:selinux 依赖、daemon 启动失败与源失效排查
手册里最值钱的其实不是安装步骤,而是“最新版装不上”这个结论。我在实际部署里把这条坑又踩了一遍,还额外碰到几个启动阶段的问题,整理成五条,按“现象 → 原因 → 解决”的顺序记录。
5.1 最新版 docker-ce 装不上:container-selinux 2.74 这道坎
现象:直接执行yum install docker-ce,报错nothing provides container-selinux >= 2:2.74 needed by docker-ce-3:20.10.17-3.el7.aarch64。
原因:20.10.17 这个版本的 docker-ce 依赖container-selinux至少 2.74 版本,而麒麟 v10 sp1 官方源里提供的版本远低于这个门槛,yum 找不到能满足依赖的包,于是放弃安装。
解决:放弃最新版,改用yum install docker-ce-18.09.7-3.el7固定版本。如果你想硬上最新版,需要手动从 CentOS 7 的 extras 源找高版本container-selinux的 rpm 离线装上,但它的依赖链条还会拖出python3-audit等一串包,在 ARM 架构下很容易滚雪球,我不建议在业务机器上这么赌。
5.2 docker ps 连不上 daemon:启动成功了但 socket 没起来
现象:systemctl start docker没有任何报错,但执行docker ps报Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?。
原因:systemd 显示服务处于 active 状态,但 dockerd 进程可能已经崩溃退出,/var/run/docker.sock文件不存在,CLI 自然连不上。常见诱因是 iptables 初始化失败,或者 overlay2 存储驱动与内核模块不匹配。
解决:先看日志定位,执行journalctl -u docker -n 50,重点看有没有Error starting daemon: Error initializing network controller之类的字段。麒麟服务器默认开着 firewalld,docker 的 FORWARD 链和它冲突是高频原因,临时验证可以把 firewalld 加入 docker0 接口到 trusted 区域,或者先systemctl stop firewalld确认是不是它的锅,再考虑长期策略。
5.3 gpg 校验失败:公钥拉不下来
现象:yum install时报GPG key retrieval failed或者提示公钥不存在。
原因:gpgcheck=1要求从gpgkey地址下载公钥做签名校验,内网环境访问mirrors.aliyun.com被防火墙或者代理拦截,公钥拉不回来。
解决:先手动导入公钥rpm --import https://mirrors.aliyun.com/docker-ce/linux/centos/gpg,成功之后再跑安装命令;如果公钥地址确实不通,临时把docker-ce.repo里的gpgcheck改成0,装完包之后改回来。注意不要长期开着gpgcheck=0,内网源还好,公网源不做完整性校验等于把服务器裸奔。
5.4 麒麟官方源 404:archive.kylinos.cn 的路径会变
现象:yum makecache报Cannot find a valid baseurl for repo: ks10-os-media,检查 URL 发现打开是 404。
原因:麒麟官方源的路径里带 sp 版本号和场景名(比如sp1-openstack-q),官方调整仓库结构时旧路径会失效,而且同类路径不止一个,很多人硬拼一个出来结果打不开。
解决:去麒麟官网或社区找当前 sp 版本对应的最新仓库路径,替换 repo 文件里的baseurl,替换后必须重新执行yum clean all && yum makecache。别想着用浏览器访问archive.kylinos.cn一层层点进去看,目录列表大概率是关的,直接搜别人验证过的路径更高效。
5.5 装完 docker 后防火墙端口不通
现象:容器起来了,但宿主机上其他机器访问容器映射出来的端口超时,telnet都不通。
原因:麒麟默认启用 firewalld,它和 docker 的 iptables 规则叠加之后,FORWARD 链的默认策略会丢掉转发流量。
解决:最简单的是把 docker0 加入 trusted 区域,firewall-cmd --permanent --zone=trusted --add-interface=docker0,然后firewall-cmd --reload。如果业务对安全要求高,可以精确放行暴露的端口,但这种场景下我一般建议直接用docker run -p加宿主机防火墙放行指定端口,而不是动整个 docker0。
6. 装完不等于能用:daemon.json、开机自启与离线 rpm 缓存技巧
docker 装好、能跑 hello-world,这只是开始。上线之前,我会强制自己在每台麒麟服务器上过一遍下面三件事,它们能挡住你后面至少一个月的零碎问题。
先配置/etc/docker/daemon.json,把镜像加速、数据目录和日志轮转一次配好。
{ "registry-mirrors": ["https://<你的加速ID>.mirror.aliyuncs.com"], "data-root": "/data/docker", "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" }, "iptables": true }registry-mirrors填阿里云容器镜像服务的加速地址或内网 Harbor 的地址;>systemctl enable docker
这一步必须在确认 dockerd 能稳定启动之后再执行,避免服务器重启后进入一个“服务起不来、业务全挂”的状态。
最后是很实用的离线缓存技巧。生产环境很多麒麟服务器和外网隔离,你不可能在每台机器上重新走一遍在线安装,我一般会在一台能连外网的机器上用yumdownloader把装 docker 所需的全部 rpm 攒下来。
yum install -y yum-utils yumdownloader --resolve --destdir=/root/docker_rpm docker-ce-18.09.7-3.el7 docker-ce-cli-18.09.7-3.el7--resolve会把依赖包一起拉下来,--destdir指定输出目录。拿到这包 rpm 之后,内网机器上用rpm -Uvh *.rpm就能离线装完,不用再配任何外网源。注意yumdownloader属于yum-utils工具集,先装yum-utils再用。
从那以后,我在麒麟机器上装 docker,头两步永远是uname -m看架构,再yum --showduplicates list docker-ce看仓库里实际有哪些版本,确认依赖树能完整解析才动手。这个习惯帮我挡掉了不少玄学问题——大部分“装不上”并不是命令写错,而是源和版本没对好。希望帮到你。
本文还有配套的精品资源,点击获取