首页 / 资讯中心 / 文章详情

银河麒麟v10 server安装Docker:双yum源与固定版本实践

银河麒麟v10 server安装Docker:双yum源与固定版本实践 ★ FEATURED ARTICLE
简介银河麒麟v10 sp1 server安装docker手册是一份面向Linux运维与云计算部署人员的实操文档主要解决国产化银河麒麟v10 SP1服务器上Docker环境搭建中官方源无docker-server包、依赖组件不兼容等典型问题资源为单个docx格式电子文档包体仅17KB内容目录清晰便于在服务器终端旁快速查阅并逐条执行。截至当前该手册已有7165人学习下载反映出麒麟系统容器化部署需求旺盛。文档从配置yum源入手详细说明新建docker-ce.repo复用阿里云CentOS 7镜像并补充kylin_aarch64.repo官方源以满足依赖安装随后逐步演示安装docker-ce-cli与docker-ce-18.09.7-3.el7、systemctl启动服务及docker --version版本核验全过程。此外特别指出无法通过yum安装最新版docker如20.10.17的报错根源即container-selinux依赖缺失并给出--skip-broken等排查提示有助于读者快速定位同类故障、降低试错成本。1. 银河麒麟v10 sp1 server安装docker不走官方源是第一步银河麒麟v10 sp1 serveraarch64架构上安装docker最顺的路径不是直接执行yum install docker-ce也不是官网一键脚本而是先手动配好两个yum源再把版本锁死在docker-ce-18.09.7-3.el7上。我第一次在这台机器上部署时直接装最新版docker被nothing provides container-selinux 2:2.74这条依赖错误卡了半天翻遍麒麟官方源发现里面根本没有docker服务端包。最后绕道阿里云的CentOS 7 docker源同时保留麒麟官方源补齐依赖才把容器环境跑起来。这里就把这个过程拆开写包括双源配置、固定版本号安装、启动验证以及四个当时没绕过去的坑。适合信创环境、内网离线部署以及装完docker还要跑容器的场景。2. 配置yum源阿里Docker源与麒麟官方源缺一不可2.1 选型理由为什么是CentOS 7的stable仓库银河麒麟v10 sp1 server的ISO里自带repo只有系统本身的包docker相关的rpm一个都搜不到。我当时在麒麟官方源里翻了半天发现连docker-engine的影子都没有所以必须引入第三方源。选源时有两条路docker官方源download.docker.com以及阿里云镜像站的docker-ce源。最后用了阿里源原因有两个。第一银河麒麟v10 sp1的内核是4.19系列的ARM版本和RHEL/CentOS 7的兼容性比CentOS 8更好。docker-ce在CentOS 7仓库linux/centos/7路径里维护了完整的aarch64架构包18.09.7-3.el7在aarch64上有明确的rpm而centos/8目录下18.09.7时代的构建产物并不完整后续的20.10版本又依赖高版本container-selinux麒麟sp1官方源给不出来硬装会把系统selinux策略搞坏。第二阿里源在国内服务器上拉取速度比docker官方源稳定repo文件写法现成复制到/etc/yum.repos.d就能生效。这里要理解baseurl里的一个变量$basearch。在aarch64机器上yum会自动把它替换成aarch64最终访问地址是https://mirrors.aliyun.com/docker-ce/linux/centos/7/aarch64/stable/如果你把路径写死成x86_64在ARM机器上会直接404repo源加载不到任何包。我看过不少人在这一步翻车明明源文件放对了repolist里就是没有docker-ce-stable最后发现是架构路径写错。gpgcheck1表示yum安装rpm前要校验GPG签名gpgkey指向阿里源提供的公钥。这个配置建议保留不要改成0。阿里源的密钥是完整的校验不会失败改成0虽然也能装但以后排查问题时会多一个不确定因素而且在生产环境里关签名校验不是个好习惯。2.2 双源配置docker-ce.repo与kylin_aarch64.repo在/etc/yum.repos.d目录下新建docker-ce.repo内容如下# /etc/yum.repos.d/docker-ce.repo [docker-ce-stable] nameDocker CE Stable - 7 baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable enabled1 gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/docker-ce/linux/centos/gpg保存后再检查麒麟官方源。这里说的官方源不是ISO里自带的那个而是kylin_aarch64.repo里指向archive.kylinos.cn的在线源# /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这两个文件缺一不可。docker-ce.repo负责提供docker本体kylin_aarch64.repo负责提供docker的依赖包比如container-selinux、libcgroup、iptables等基础组件。我当时只配了阿里源结果yum install docker-ce时提示找不到依赖加上麒麟源后依赖解析才顺利通过。关于gpgcheck0麒麟这个archive源没有提供对应的公钥文件所以只能置0。archive.kylinos.cn是麒麟官方域名来源可信如果你在内网有自建的镜像仓库可以把公钥导入后再开启校验。参数enabled1表示这个repo默认启用如果后续想临时禁用可以在yum命令里加--disablerepoks10-os-media不用改文件。2.3 验证源生效repolist、makecache与提前试安装配好两个源后先清缓存再重建# 清理yum缓存避免旧的repo列表干扰 yum clean all # 重新生成元数据缓存 yum makecache # 查看当前生效的repo列表 yum repolist执行后预期输出里应该看到docker-ce-stable和ks10-os-media都在列表里状态列显示的是可用包数量。如果docker-ce-stable没出现先检查baseurl里的$basearch在aarch64机器上是否解析成功再检查到mirrors.aliyun.com的网络连通性如果ks10-os-media没出现多半是baseurl里sp1-openstack-q这个路径被防火墙拦截换内网可通的镜像地址就行。yum makecache报404时把报错URL复制出来看一眼十有八九是路径拼写问题。更稳的做法是用一条只解析、不安装的命令验证依赖能对上# 只做依赖解析并不实际安装 yum install docker-ce-18.09.7-3.el7 --assumeno如果这条命令能走到Is this ok [y/N]这一步说明两个源配合正常如果报缺失依赖先看缺的是哪个包再去对应源里确认是否存在。这一步能提前暴露源配置问题比直接装到一半再回滚强得多。3. 固定版本安装18.09.7先cli后ce启动并确认3.1 为什么锁版本一条依赖规则银河麒麟v10 sp1 server上装不了最新docker不是docker本身的问题是依赖链断了。直接执行yum install docker-ce会选中20.10.17这个版本的rpm依赖container-selinux 2:2.74。而container-selinux在麒麟sp1官方源里的版本低于这个要求不可能从第三方源合进来因为selinux策略包和系统版本强耦合。当时的报错原文是Error: Problem: cannot install the best candidate for the job - nothing provides container-selinux 2:2.74 needed by docker-ce-3:20.10.17-3.el7.aarch64注意报错里两个有效信息best candidate说明yum默认选择最新版本needed by docker-ce-3:20.10.17-3.el7.aarch64说明是aarch64架构的包依赖缺失。解决方向是让yum不要选最新版而是显式指定18.09.7-3.el7。这个版本对container-selinux没有强依赖在麒麟sp1上能完整装上并正常启动。有人会问能不能用--nobest让yum自己去匹配我试过yum确实会降级匹配但匹配结果不一定是你要的版本而且后续跑yum update时可能又把依赖关系弄坏。更干净的做法是显式把版本号写进安装命令一劳永逸。3.2 安装顺序两条yum命令与顺序坑安装时按先cli后ce的顺序执行# 1. 先安装docker-ce-cli固定版本号 yum install docker-ce-cli-18.09.7-3.el7 -y # 2. 再安装docker-ce本体同样固定版本号 yum install docker-ce-18.09.7-3.el7 -y这个顺序不是随便写的。docker-ce这个包依赖了docker-ce-cli的对应版本如果先执行yum install docker-ce-18.09.7-3.el7yum解析依赖时发现docker-ce-cli还没装会自己去选一个最新的cli版本。最新cli和18.09.7的daemon之间版本差异过大docker命令行提示和实际行为会不一致我见过client版本比server版本高两个大版本后docker info输出的API版本对不上的问题。先装cli再装ceyum的依赖解析器看到cli已满足就不会再动它。参数说明-y是跳过确认提示在自动化脚本里必须加如果不加手工会停在Is this ok [y/N]这步。版本号里的18.09.7是docker版本3.el7是rpm构建号el7表示面向RHEL/CentOS 7系构建。银河麒麟v10 sp1虽然系统版本不带el7字样但整个包管理系统和依赖库是兼容el7的所以这个rpm可以正常安装。安装完成后用rpm -qa确认两个核心包都在# 确认已安装的docker相关rpm rpm -qa | grep docker正常会看到docker-ce-18.09.7-3.el7.aarch64和docker-ce-cli-18.09.7-3.el7.aarch64两行。如果只看到cli说明ce没装上回查上一步报错。如果想确认docker文件都放到了哪些位置可以用rpm -ql docker-ce快速过一遍重点看/usr/bin/dockerd和/etc/systemd/system/docker.service.d是否存在。3.3 启动与验证systemctl三连与docker version安装完成后第一件事是启动docker守护进程# 启动docker服务 systemctl start docker # 设置开机自启服务器重启后docker自动拉起 systemctl enable docker # 查看服务状态确认没有异常退出 systemctl status docker如果start之后几秒内status显示active (running)说明daemon起来了。接着验证客户端和服务端版本# 查看docker版本简版输出 docker --version # 更完整的版本信息分Client和Server两段 docker version18.09.7在这个环境下的典型输出是Docker version 18.09.7, build 2d0083ddocker version命令会分Client和Server两段显示Server段里有Engine、API version还有存储驱动信息。如果Server段显示Cannot connect to the Docker daemon说明daemon没起来需要回到systemctl status docker看日志这个坑下一章专门写。这里推荐一个额外操作确认存储驱动。aarch64的服务器在部分虚拟化场景里overlay2驱动会加载失败docker会自动降级到vfs磁盘占用会急剧膨胀。用docker info命令看一眼Storage Driver字段是overlay2就放心是vfs就检查内核模块再决定要不要继续用。4. 安装复盘与避坑四个真实翻车点4.1 依赖缺失nothing provides container-selinux现象在只配了阿里源、没有麒麟源或者直接执行yum install docker-ce不加版本号时yum报错nothing provides container-selinux 2:2.74安装中断。原因最新版docker-ce的rpm依赖高版本container-selinux而银河麒麟v10 sp1的软件仓库里这个包的版本停留在更老的水平无法满足2:2.74的约束。yum的依赖解析是在本地源元数据里做的不会自动从别处拉包所以只能报错。这个报错还容易让人误判以为只是源的问题实际是版本依赖链的问题。解决两条路。一是把docker版本固定到18.09.7-3.el7绕过高版本依赖二是手动找高版本container-selinux rpm安装但后者在麒麟sp1上风险很大selinux策略包升级可能影响系统其他组件不建议在生产环境做。最后走的是第一条路加麒麟官方源补充基础依赖同时锁版本安装。修复后这个报错就不会再出现因为18.09.7的依赖元数据里根本没有container-selinux这一条。4.2 官网脚本直装失败get.docker.com在麒麟上不识别现象执行curl -fsSL https://get.docker.com | sh脚本跑一下就退出或者提示操作系统不受支持安装无法继续。原因get.docker.com脚本内部通过/etc/os-release识别发行版然后根据发行版拼接源地址。银河麒麟v10 sp1的/etc/os-release里写的是Kylin Linux Advanced ServerID是kylin这个标识不在脚本的分支判断里脚本找不到对应源就退出了。这是发行版识别问题不是网络或权限问题。解决放弃脚本方案手动配置yum源用第2章的阿里源麒麟源双源方案。这个方式绕过了脚本里的发行版判断直接把docker-ce的rpm源挂到yum上装什么版本、怎么装依赖都可控。提醒一句不要在麒麟上强行修改/etc/os-release来骗过脚本那样会导致后续系统更新时依赖与身份不匹配这种黑匣子式的排查很容易把系统搞崩。4.3 启动失败journalctl里常见的三种退出原因现象systemctl start docker执行后docker version的Server段连不上daemonsystemctl status显示failedjournalctl -u docker日志里有报错。原因常见的三种。第一种overlay2模块在aarch64内核里没加载dockerd尝试挂载overlay时失败报mount point /var/lib/docker/overlay2 does not exist之类第二种/var/lib/docker目录所在分区容量不够或权限不对daemon初始化失败第三种iptables规则写入失败内网环境禁用了ip转发或相关内核模块。解决按日志逐个处理。overlay2问题先modprobe overlay确认模块存在再修改/etc/docker/daemon.json加storage-driver: vfs降级容量问题检查分区挂载和inode使用率必要时把/var/lib/docker迁移到大分区iptables问题确认net.ipv4.ip_forward1并sysctl -p生效。修改daemon.json后要systemctl daemon-reload再restart docker不是start。这步我在好几台机器上踩过改完配置直接restartdocker没反应后来才发现systemd缓存了旧配置。4.4 镜像加速配置了但拉取还是失败现象在/etc/docker/daemon.json里配置了registry-mirrorsdocker info也能看到Registry Mirrors列表但docker pull镜像时还是连接超时或EOF。原因加速地址配错了或者用的公共加速器在当前网络出口不可达。公共加速地址现在很多名存实亡返回的列表看起来可用实际转发到Docker Hub的连接根本不通。另一个常见错误是daemon.json里格式写错逗号或括号不对docker会在启动时直接忽略这个文件配置等于白写。解决先检查daemon.json的格式用python3 -c import json;print(json.load(open(/etc/docker/daemon.json)))验证格式不对会直接抛出异常再换一个确定可用的加速地址。如果是阿里云账号用容器镜像服务控制台里分配的专属加速地址替换掉公共地址。拉取时如果还失败可以直接curl测试到Docker Hub的连通性确定是网络问题还是配置问题。注意加速器只负责转发镜像层下载不负责DNS解析和TLS握手系统网络不通换什么加速器都白搭。这一章四个坑前三个是安装期的第四个是安装后的。最花时间的还是第一个依赖缺失报错信息会让人误以为是源的问题折腾了半天源配置最后才发现是版本依赖的问题属于典型的报错在地图外。5. 后续加固镜像加速、离线分发与一次部署自检清单5.1 配置镜像加速daemon.json的写法docker装好之后第一件事是配置镜像加速。当前环境下公共加速器大多不可靠建议使用账号专属的加速地址。在/etc/docker/daemon.json里写入{ registry-mirrors: [https://xxxx.mirror.aliyuncs.com] }把xxxx替换成阿里云容器镜像服务控制台里分配的字符串。改完执行# 重载配置并重启docker让加速地址生效 systemctl daemon-reload systemctl restart docker之后docker info的Registry Mirrors一栏能看到这个地址再用docker pull验证效果。注意daemon.json里如果已有其他配置项比如storage-driver要把新项合并进去不能覆盖整个文件。我在这里吃过亏改配置把之前设置好的storage-driver冲掉了docker启动后直接退回vfs驱动容器一多磁盘就开始报警。5.2 离线环境分发docker save/load与tar包很多银河麒麟服务器部署在网络隔离的内网不能连外网拉镜像。这种情况我一般在一台能联网的机器上先把镜像打成tar包再转移到内网机器上加载# 在一台有外网的机器上导出镜像为tar包 docker save -o mysql-5.7.tar mysql:5.7 # 在内网银河麒麟机器上加载镜像 docker load -i mysql-5.7.tardocker load之后docker images就能看到这个镜像标签和之前save时一致。如果有多个镜像要分发可以一次性导出多个docker save -o app.tar image1:tag1 image2:tag2。文件会比较大传输时建议用md5sum校验避免U盘拷贝或网络传输中途损坏。我遇到过tar包在scp传输后docker load报unexpected EOF的情况最终是存储介质问题重新拷贝校验后再load就正常了。5.3 一次部署的自检清单给一个我在每台新服务器上都会执行的检查顺序按这个表过一遍基本不会漏。检查项命令预期结果yum源生效yum repolistdocker-ce-stable与ks10-os-media都在列表docker版本匹配docker versionClient与Server都是18.09.7不能一高一低服务运行中systemctl status dockeractive (running)无频繁重启记录存储驱动docker infoStorage Driver为overlay2或已确认降级原因加速器生效docker infoRegistry Mirrors里能看到配置的地址拉取验证docker pull hello-worldPull成功且能运行容器这套自检清单也是我某次误操作后的血泪总结。当时在一台新机器上跳过了yum repolist检查直接装docker-ce装到一半发现依赖解析失败回头排查才发现麒麟源里少了一个基础包。自从那次之后我每次给银河麒麟装docker都强制先走一遍源验证再动手安装省下来的排查时间比安装时间多得多。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站