ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

银河麒麟v10 SP1 Server装Docker 18.09.7:yum源配置与依赖避坑指南

银河麒麟v10 SP1 Server装Docker 18.09.7:yum源配置与依赖避坑指南

简介:《银河麒麟v10 sp1 server安装docker手册》是一份面向国产化环境运维人员与开发者的实操文档,专门解决麒麟服务器上因软件源缺失、依赖不兼容而装不上docker的问题。全部内容集中在一个docx文档(共1个文件)中,压缩包仅17KB,篇幅精简但步骤完整。文档先指导配置yum源:既加入阿里云docker-ce源,又补充麒麟官方源用于安装依赖包;随后依次演示安装docker-ce-cli 18.09.7、安装docker-ce、启动docker服务并查看版本,每个环节都给出了命令与输出示例,便于读者对照执行和验证。同时,文档特别说明了无法通过yum直接安装最新版docker的原因,列出了container-selinux版本缺失的具体报错,并介绍了--skip-broken、--nobest等可尝试参数,为后续排错提供了切入点。该资料已有7199人学习,适合需要在银河麒麟v10 sp1 server上快速搭建docker环境的技术人员参考使用。

1. 银河麒麟 v10 SP1 Server 装 Docker:先确认为什么只能停在 18.09.7

在银河麒麟 v10 SP1 Server 上装 Docker,很多人的第一反应是直接 yum install docker-ce,但大概率会在依赖解析这一步翻车,要么提示找不到包,要么报 nothing provides container-selinux 这种玄学错误。手册里稳定跑通的方案是锁定 docker-ce 18.09.7,先配好双源再安装。这篇笔记把源配置、安装步骤、报错现场和安装后的验证全部拆开讲,适合刚接手麒麟服务器、要在上面跑容器服务的运维同学,也适合排查“为什么新版 Docker 在麒麟上装不动”这类问题。

2. yum 源配置:官方源缺 docker 包,第三方源和麒麟源怎么分工

银河麒麟 v10 SP1 Server 的官方源里没有 docker server 软件包,这一点手册写得很直接,安装只能借助第三方源。但第三方源只负责 docker-ce 本体,docker-ce 启动时依赖的底层组件仍然要从麒麟官方源获取,所以两张 repo 文件都要配,缺一张都会在依赖检查阶段报错。很多人这里只配了一个源,导致yum install docker-ce-cli时提示缺依赖包,然后开始怀疑源地址没用对。

2.1 动手前先确认系统版本与架构

在写任何 repo 文件之前,先确认系统和 CPU 架构。麒麟 v10 SP1 Server 的 aarch64 版本和 x86_64 版本的软件包不通用,docker-ce 仓库的 baseurl 里写了$basearch,yum 会把它展开成实际架构:aarch64 就访问.../aarch64/stable,x86_64 就访问.../x86_64/stable。跳过这一步直接复制网上的 x86_64 源配置,后面几乎一定会遇到 404 或找不到包。

cat /etc/os-release uname -m

输出里重点看VERSION_ID是否为 10 SP1,以及uname -m返回的是 aarch64 还是 x86_64。麒麟系统的 os-release 文件字段比 CentOS 多,但VERSION_ID和PLATFORM_ID一眼就能看清主版本。架构确认后,后续所有源配置都以它为准,不要照搬 CentOS 8 的仓库路径——麒麟虽然兼容 CentOS 生态,但仓库目录结构不完全一致。

2.2 编写 docker-ce.repo:第三方源的关键参数拆解

确认架构没问题后,在 /etc/yum.repos.d 目录下新建 docker-ce.repo。这里用的第三方源是 docker-ce 官方仓库的国内镜像节点,目录结构保持和 Docker 官方一致,只是访问路径换成镜像站的地址。手册里给的这份 repo 文件可以直接落盘:

vim /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

文件里的几个参数各自管一件事。name只是仓库显示名,yum repolist时会展示;baseurl是真正取包的地址,路径里的centos/7表示这个仓库是按 RHEL/CentOS 7 体系发布的,麒麟 v10 兼容这一体系所以可以直接复用;$basearch是动态变量,yum 会自动替换为当前架构;enabled=1表示启用该仓库;gpgcheck=1开启 GPG 校验,gpgkey指向镜像站同步下来的公钥文件。注意gpgkey的路径是镜像站的,不是 Docker 官方主站的,不要手动改,否则公钥校验会失败。

有同事问过为什么不直接配 Docker 官方仓库而是绕到镜像站。原因很直接:在麒麟环境下直连官方仓库,大概率在网络层就被卡住,yum 会停在 downloading 阶段直到超时。镜像站至少在内网可达性上稳定得多,这也是手册选择第三方源而不是官方源的原因。

2.3 麒麟官方源的角色:只负责依赖包

第三方源负责 docker-ce 本体,但它的依赖组件,比如容器运行时、selinux 策略工具链等,要从麒麟官方源拿。这里新建 kylin_aarch64.repo,注意仓库名ks10-os-media是固定的,不要改,改了 yum 可能识别不到:

vim /etc/yum.repos.d/kylin_aarch64.repo
[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

这份源里的gpgcheck=0是手册原文就有的,意思是下载包时不检查 GPG 签名。对麒麟官方源来说内网环境这么用是常态,但从安全角度有隐患:如果源地址被劫持或投毒,yum 不会主动拒绝坏包。在内网部署时我一般保留原样,但如果你对安全等级要求高,建议先手动获取公钥并开启gpgcheck=1,代价是每次更新要多维护一把公钥。

还有一个容易忽略的点:baseurl指向的是sp1-openstack-q相对路径,它对应麒麟 v10 SP1 的一个 openstack 衍生源目录。这个目录里除了 openstack 相关包,还维护了系统基础组件,docker 18.09.7 的依赖能在这里找到,是因为这套源始终在跟随 SP1 版本更新。不要用 v10 的通用源路径替换它,替换后依赖版本会错位。

2.4 源配完先验证:repolist 和 makecache

两个 repo 文件写完,先别急着装包,跑一遍 repolist 确认仓库被识别,再跑 makecache 生成缓存。这一步能过滤掉八成配置错误:

yum repolist yum makecache

如果 repolist 里能看到docker-ce-stable和ks10-os-media两个仓库,说明 yum 已经正确读到配置。如果只看到一个,说明另一个 repo 文件语法有错或路径写错。常见情况是 docker-ce.repo 里 baseurl 行多了空格,或者 kylin_aarch64.repo 的gpgcheck被误写成gpgcheck=1导致校验失败——虽然公钥冲突在麒麟源上很少见,但一旦出现,yum 会拒绝整个仓库。

makecache 过程中如果报 404,先检查$basearch是不是被错误地写成了硬编码架构;如果报连接失败,用 curl 访问一下 baseurl 地址确认网络通不通。这一步排查完,源配置才算真正结束,进入安装环节。

3. 用 yum 锁定 18.09.7:先 cli 后 ce,四步装完再验证

源配好之后,安装环节比想象中容易翻车,尤其是版本锁定和依赖顺序。手册把安装拆成两步:先装docker-ce-cli-18.09.7-3.el7,再装docker-ce-18.09.7-3.el7。这个顺序不是随意写的,而是麒麟源环境下验证过的最稳路径。

3.1 为什么先装 docker-ce-cli 而不是直接装 docker-ce

常规动作是直接yum install docker-ce,但在麒麟 v10 SP1 Server 上直接这么做,yum 的依赖解析器可能会挑到版本更新但依赖冲突的候选包。先锁定 cli 包让它落盘,相当于先把 docker 命令行工具固定下来,再回头装 daemon 本体。两步走看起来多敲一条命令,实际上避开了 yum 自动选择时把 cli 和 daemon 版本拉成不一致的隐患。

实际踩过这样一个坑:yum 自动解析时选了 cli 20.x 和 daemon 18.09.7 的混搭组合,安装完成后docker version里 Client 和 Server 版本对不上,排查起来非常绕。手动锁版本分两步走,从根上避开这个问题。

3.2 安装命令与预期输出

现在执行安装。两条命令都要带完整版本号,不要省略-3.el7后缀:

yum install docker-ce-cli-18.09.7-3.el7 yum install docker-ce-18.09.7-3.el7

第一条命令执行时,yum 会解析 cli 包的依赖,通常包括 rootless-extras、containerd 相关组件;前提是麒麟官方源配置正确且 makecache 刚跑过。执行期间会有一次确认提示,输入 y 回车即可。第二条命令安装 daemon 本体,会连带拉取容器运行时组件,安装完成后输出里会出现Installed: docker-ce的提示。

如果第二条命令也报nothing provides container-selinux,先停止安装,回到第 2 章检查麒麟源是否启用。这个报错本质上是新版 docker 的依赖要求,18.09.7 并不强制那么高版本的 container-selinux。出现这个报错说明版本锁得不够死,yum 解析时又往新版跑了。

3.3 启动 docker 并确认版本

安装完成之后启动服务并验证版本:

systemctl start docker docker --version

预期输出是Docker version 18.09.7, build 2d0083d。systemctl start在麒麟上使用 systemd 标准 unit 文件,启动过程会拉起 dockerd 守护进程并创建 /var/run/docker.sock socket 文件。docker --version输出版本号只证明客户端二进制能跑,不代表守护进程工作正常,所以还要做下一步检查。

3.4 确认服务和 socket 状态

这一步容易被跳过,但恰恰是出问题最多的地方。执行下面两条命令:

systemctl status docker ls -l /var/run/docker.sock

systemctl status输出里Active状态必须是active (running),如果显示failed或者active (exited),说明 dockerd 启动后立即退出了,原因通常是存储驱动不兼容或 selinux 策略拦截,这在第 4 章专门排查。socket 文件存在说明客户端和守护进程之间的通信通道已建立,ls -l能看到文件类型是s,也就是 socket 类型,不是普通文件。确认这两点后,Docker 才算真正进入可用状态。

4. 安装过程常见问题与避坑:四条现场报错解决记录

源配置和安装步骤是直线流程,但实际执行时问题都出在细节上。这一章把手册里提到的报错和我自己踩过的坑整理成四条记录,每条按现象、原因、解决三个部分写,方便对号入座直接处理。

4.1 安装新版 docker-ce 报 nothing provides container-selinux

现象:执行yum install docker-ce不带版本号,yum 解析到最后输出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,而麒麟 v10 SP1 官方源里该组件版本停留在更低版本,无法满足这个>=约束。yum 在安装阶段就拒绝继续,因为它无法找到合法的依赖组合。注意这里报错的包名是docker-ce-3:20.10.17-3.el7.aarch64,3:是 epoch 号,aarch64 是架构,都说明 yum 解析到的是最新候选包。

解决:不要在麒麟系统上硬装最新版 docker,直接把版本锁定到 18.09.7-3.el7。18.09.7 的依赖条件比 20.10.17 宽松很多,麒麟源能完整满足。执行时两条命令都带完整版本号,不要偷懒写docker-ce-18.09.7,写完用yum info docker-ce-18.09.7-3.el7确认仓库里存在这个具体版本再装。

4.2 源配置了却提示 No package docker-ce available

现象:两个 repo 文件都建好了,执行yum install docker-ce-cli-18.09.7-3.el7却提示没有可用软件包,甚至yum search docker搜不到任何 docker 相关包。

原因:最常见的是 docker-ce.repo 的enabled参数被写成enabled=0,或者文件名后缀不是.repo导致 yum 不读取。另一类是 baseurl 中的$basearch在编辑时被手动替换成了空字符串或错误架构,仓库访问 404 后 yum 自动丢弃该仓库。

解决:先执行yum repolist all查看仓库是否在列表里,再看docker-ce-stable的启用状态是不是 disabled。确认文件后缀为.repo,用cat -A检查 repo 文件里是否有不可见控制字符。$basearch保持变量形式不要手动替换,yum 会自动展开。

4.3 加 --nobest 硬闯新版依赖,装了等于白装

现象:有人尝试用yum install docker-ce --nobest跳过依赖校验安装 20.10.17,安装命令走完了,但运行容器时直接失败,docker run hello-world拉取镜像成功却起不来容器。

原因:--nobest会容忍依赖不满足继续安装,但缺失的 container-selinux 并不会因为安装成功就自动出现。dockerd 启动时读取系统安全策略失败,容器创建被阻断,表现为镜像拉下来了但 run 阶段报错退出。

解决:删除已安装的 docker 包,命令是yum remove docker-ce docker-ce-cli,然后回到第 3 章按锁定版本步骤重装。这个场景没有后悔药,如果在生产环境执行了--nobest,务必先把 docker 相关包全部清理干净再重装,不要直接在旧包上叠加安装。

4.4 systemctl start docker 启动失败,journal 里没有明显报错

现象:systemctl start docker执行后状态显示 failed,journalctl日志里只看到 overlay2 相关关键字,没有明确的 error 信息。这种情况最让人头疼,因为报错不指向具体组件。

原因:麒麟内核默认支持 overlay2,但部分内核补丁或安全模块会和 overlay2 存储驱动冲突,导致 dockerd 初始化存储驱动失败。这是麒麟上装 Docker 最隐蔽的坑之一,报错信息不直接,容易被误判成 selinux 问题。

解决:先执行journalctl -xe拉取完整日志,确认关键字是 overlay2 还是 selinux;如果是 overlay2,在 /etc/docker/daemon.json 中显式指定存储驱动为 vfs 先跑通业务,之后升级内核到麒麟官方维护的版本再切回 overlay2。如果是 selinux 拦截,根据你们的安全策略决定是否放行 docker 相关进程,不建议无脑关闭 selinux。

5. 装完不代表能用:镜像加速、hello-world 与开机自启

docker 装好只是第一步,真正能跑起来还要做三件事:配置镜像加速、验证完整容器链路、设置开机自启。镜像加速解决拉取超时,hello-world 验证链路贯通,开机自启避免服务器重启后 docker 不在了。这三件事做完,安装才真正收口。

5.1 配置镜像加速:daemon.json 的写法与参数

docker 默认从 Docker Hub 拉镜像,这个行为在麒麟服务器所在的网络环境里经常超时。配置镜像加速是安装后的第一件事,原理是让 dockerd 拉镜像时优先访问可达的镜像仓库缓存节点。修改 /etc/docker/daemon.json:

vim /etc/docker/daemon.json
{ "registry-mirrors": ["https://your-internal-registry.example.com"] }

registry-mirrors是数组,可以配多个地址,dockerd 拉镜像时会依次尝试。这里给的是占位地址,实际部署时填你们内网搭建的镜像仓库地址,或者团队统一维护的加速节点。改完配置必须重启才会生效:

systemctl daemon-reload systemctl restart docker

注意 daemon.json 必须是合法 JSON,很多人在这里翻车,行尾少逗号或引号用了中文全角,dockerd 直接拒绝解析并报错。校验可以用python3 -m json.tool /etc/docker/daemon.json,输出没有异常再重启。重启后再用docker info确认 registry-mirrors 配置已生效。

5.2 用 hello-world 验证一条完整链路

镜像加速配好后,跑一遍 hello-world 验证 docker 的拉取、创建、执行全链路:

docker run hello-world

首次执行会先从配置的 mirror 地址查找 hello-world 镜像,没有命中会回源拉取,输出里出现Hello from Docker!说明整个链路是通的。如果卡在unable to find image或dial tcp超时,先检查内网能否访问镜像仓库地址,再查 DNS 配置。这一步和 yum 源是两套网络路径,经常出现 yum 能装包但 docker 拉不到镜像的情况,不要混为一谈。

5.3 设置开机自启与日常管理命令

服务器重启后想让 docker 自动拉起,执行:

systemctl enable docker

日常用得最多的管理命令按使用频次列一张简表:

命令用途
docker ps查看运行中的容器,加 -a 看全部容器
docker images查看本地镜像列表
docker logs 容器名/ID查看容器日志
docker inspect 容器名/ID查看容器或镜像的详细配置

其中docker inspect最容易被低估,容器的挂载点、网络模式、entrypoint 都能通过它看到结构化信息,排查诡异问题时基本靠它。docker ps加-a能看到已退出容器的状态码,这个状态码对判断容器为什么挂掉非常关键。

6. 备用方案与体检:离线 rpm 应急安装和 docker info 检查

yum 源依赖外部网络,内网环境或镜像站故障时安装会直接卡住。提前把 rpm 包下载到一个目录,离线安装是最后的兜底方案。需要准备的包主要是 docker-ce、docker-ce-cli 以及配套的 containerd.io,下载时用和 18.09.7 配套的版本,不要混搭更高版本。

yum install --downloadonly --downloaddir=/data/docker-rpm docker-ce-18.09.7-3.el7 docker-ce-cli-18.09.7-3.el7

离线机器上执行安装时,依赖检查由 rpm 自己完成,文件缺失会直接报error: Failed dependencies,缺哪个包就看哪一行,然后从另一台相同架构的机器上拷对应 rpm 过去。注意--downloadonly需要 yum-plugin-downloadonly 插件,有些麒麟环境没默认安装,装不上就先yum install yum-plugin-downloadonly。

安装完成后用docker info做一次标准体检,重点看两行:

docker info | grep -E "Storage Driver|Cgroup Driver"

Storage Driver应该显示 overlay2,如果显示 vfs 说明之前踩过存储驱动坑,容器性能会明显下降,只能做临时应急;Cgroup Driver应该显示 systemd,如果不是 systemd,容器资源限制会和 systemd 管理冲突,跑复杂编排时会出现奇怪问题。这两项都正常,再跑一次 hello-world 和systemctl status docker,才算真正收工。

那次在生成环境上直接装了最新版 docker-ce,结果依赖解析全乱,最后只能清包重装,整个晚上都在折腾 rpm 依赖。从那以后我每次装完都强制走一遍docker info加 hello-world 双验证,缺一个都不放心。这个习惯帮我提前发现了很多隐患,希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进