
简介针对银河麒麟V10 SP1 Server系统安装Docker的实操手册面向需要在国产化操作系统环境中部署容器服务的运维人员与开发工程师。银河麒麟V10官方源未收录docker-server软件包手册提供了通过阿里云镜像源与麒麟官方源配合配置yum仓库的完整步骤并详细演示docker-ce-cli与docker-ce 18.09.7版本的安装、启动及版本验证方法。资源为1个DOCX文档容量仅17KB便于下载后随时查阅。文档还专门说明了无法通过yum安装最新版本docker的原因并给出container-selinux依赖缺失时的报错信息与规避思路可帮助读者少走弯路。目前已有7109人学习使用适合需要快速在银河麒麟环境搭建Docker基础平台的技术人员参考。1. 银河麒麟v10 sp1 server 安装 docker 手册适用的交付场景银河麒麟 V10 SP1 server 装 docker我一般不会上来就执行 install 命令。这个系统在 x86_64 和 aarch64 两个架构上都有大量服务器落地且很多节点处于不能直接访问外网的运维分区Docker 的安装包又同时依赖 yum 源、systemd、iptables-nft 和 containerd 的版本链。如果不先确认系统身份、内核和软件源布局很容易出现 dockerd 启动不了或者容器网络冲突。这篇手册就按“检查环境、在线安装、离线补包、迁移数据目录”的顺序来写覆盖生产环境里最常见的四类执行路径。适合正在写批量部署脚本的人也适合第一次接触银河麒麟的运维照着命令做并把安装时出错的判断点放在命令后面说明。2. 安装前检查版本、内核和 yum 源状态决定用哪套 docker 方案在银河麒麟 V10 SP1 server 上系统自带的 yum 仓库不一定能用“docker-ce”的包名直接搜到。所以要先采集四个维度的信息操作系统标识、CPU 架构、当前内核、安全策略。前两个决定下载哪个 rpm 包后两个决定 dockerd 起来以后是否稳定。2.1 用 os-release 和 uname 记录系统身份与架构我把下面几行命令放在安装脚本的最前面让输出直接落盘留档cat /etc/os-release /tmp/kylin_os_info.txt cat /etc/kylin-release 2/dev/null /tmp/kylin_os_info.txt uname -r -m /tmp/kylin_os_info.txt df -h /var/lib /tmp/kylin_os_info.txt第一行里的/etc/os-release会显示版本标识/etc/kylin-release在部分 SP1 镜像中也有放着不会影响命令执行。uname -m输出x86_64还是aarch64直接决定后续 baseurl 里该写哪个架构。最后一行看/var/lib的剩余空间Docker 默认把数据放在/var/lib/docker根分区小于 20GB 的服务器必须提前准备独立盘。接着再做一次包管理可用性检查yum repolist which curl tar ipvsadm 2/dev/null systemctl is-active firewalldyum repolist返回仓库数量不为 0说明 base/AppStream 仓库没被禁用。如果返回 “repolist: 0”后面安装 docker-ce 注定失败因为 docker 的 rpm 还要依赖 glibc 和 libseccomp 这些基础包。2.2 用一张表核对 iptables 和 firewall 策略容器网络要依赖 NAT 和端口转发dockerd 默认会写 iptables 规则。银河麒麟 server 的默认防火墙状态不一样有的镜像甚至把iptables命令换成了nft的兼容层检查项如下检查命令需要关注的值异常时的安装表现systemctl is-active firewalldactive / inactiveactive 时容器端口映射可能被防火墙拦截外部连接容器端口不通iptables -Vlegacy 或 nf_tables老版本 docker 在 nf_tables 后端下启动报 “cant initialize iptables table”nft --version有输出即可无输出说明 nftables 不在 PATH需要检查是否装了 nftables 包getenforceEnforcing / PermissiveEnforcing 下 docker 挂载 volume 会出现 SELinux 拒绝日志在/var/log/audit/audit.log我一般会把这些结果写进资产清单而不是用记忆判断。iptables和nftables的差异尤其影响离线安装如果目标机上只有iptables-nft而 docker 版本是 18.x会出现规则写入失败升级到 docker-ce 20.10 之后的版本基本都兼容 nftables因此线上环境我优先采用较新的 docker-ce。2.3 SELinux 的问题要不要安装前先处理很多人看到 SELinux 报错第一反应就是setenforce 0但在银河麒麟 server 上直接关闭并不是好做法。我会先查一下本机有没有专门给容器用的文件上下文getenforce semanage fcontext -l | grep docker 2/dev/null如果没有安装semodule和semanage说明 SELinux 相关工具链不完整很多“permission denied”其实是 audit 里提示上下文缺失。这种情况下比较稳妥的路径是先把 SELinux 临时设为 Permissive安装并启动 docker 后再逐步放行必要目录sudo setenforce 0注意这只是临时生效重启后仍回到 Enforcing。如果想把它写成安装手册的固定步骤我会在最后单独说明哪些目录需要打 label而不是直接改 SELinux 全局配置。提示生产环境尽量用semanage fcontext -a -t container_file_t给数据目录打标签而不是关闭 SELinux。3. 在线安装 docker-ce用 CentOS 8 软件源适配银河麒麟 V10 SP1 server银河麒麟 V10 SP1 server 的二进制兼容层偏向 CentOS 8所以在线安装最省事的做法是把 docker-ce 仓库挂到/etc/yum.repos.d/让 yum 自己处理依赖。这个方法不会替换系统自带 repo只增加一个来源。3.1 手工写 docker-ce.repo不依赖一键脚本一键脚本curl ... | sh虽然快但在国产化系统上无法审计它改了哪些 yum 配置维护阶段也不方便重放。我更建议先把 repo 文件固定下来sudo tee /etc/yum.repos.d/docker-ce.repo EOF [docker-ce-stable] nameDocker CE Stable - $basearch baseurlhttps://download.docker.com/linux/centos/8/$basearch/stable enabled1 gpgcheck1 gpgkeyhttps://download.docker.com/linux/centos/gpg EOF这里的$basearch是 yum 的变量在 aarch64 机器上自动解析成aarch64在 x86_64 机器上解析成x86_64仓库 URL 不需要写成死。如果前面检查发现服务器连不上 docker.com就把域名换成内网镜像或阿里云镜像目录例如https://mirrors.aliyun.com/docker-ce/linux/centos/8/$basearch/stable。写好 repo 后先刷新缓存sudo yum makecache --disablerepo* --enablerepodocker-ce-stable--disablerepo*是防止系统仓库里残留的坏 metadata 在 makecache 时报错。如果这里报 HTTPS 证书错误优先检查系统时间而不是急着把gpgcheck改成 0。3.2 安装 docker-ce 全家桶并锁定版本sudo rpm --import https://download.docker.com/linux/centos/gpg sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin命令里docker-ce是核心守护进程containerd.io是底层容器运行时docker-buildx-plugin和docker-compose-plugin不是 docker 必须的但后面用 compose 部署应用时避免再补装。GPG 导入失败时yum 会出现 “Public key for ... is not installed” 的提示。先用rpm -qa gpg-pubkey --qf %{NAME}-%{VERSION} %{SUMMARY}\n | grep docker看是否已有密钥不要盲目跳过校验。如果需要指定版本先用yum list docker-ce --showduplicates看仓库里有哪几个 release 序列然后固定安装sudo yum install -y docker-ce-20.10.17-3.el8 docker-ce-cli-20.10.17-3.el8 containerd.io版本字符串要和本机架构匹配x86_64 与 aarch64 的 rpm 版本大体一致但依赖解决结果会不同。3.3 先写 daemon.json 再启动避免改两次配置docker-ce 安装后不会自动启动。直接systemctl start docker也能跑但>{ exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } }其中native.cgroupdriversystemd把容器 cgroup 驱动从默认的 cgroupfs 切到 systemd。银河麒麟 server 用 systemd 管理进程和 docker 的 cgroup 驱动保持一致后后续再上 Kubernetes 时不会出现kubelet cgroup driver mismatched的经典错误。max-size 和 max-file 限制单个容器日志文件避免/var/lib/docker/containers被错误日志打满。配置完成后启动sudo systemctl enable --now docker sudo docker version如果docker version的 Server 端没有输出用journalctl -u docker -n 100看 dockerd 日志。最常见的错误是/etc/docker/daemon.json写成了非 JSON 格式systemd 会直接拒绝加载。启动后跑一次最小验证sudo docker run --rm hello-world--rm让容器退出后删除容器层如果 hello-world 镜像下不下来说明镜像拉取链路有问题需要走离线导入镜像或配置镜像加速器。4. 银河麒麟离线安装 docker准备 rpm 依赖包并本地安装不少银河麒麟 V10 SP1 server 部署在只能访问内网 yum 源的分区里docker-ce 在线仓库无法到达。这时常用做法是找一台同样架构、同样发行版的联网机器把 docker 的 rpm 包和依赖一次性拉下来再拷贝过去安装。4.1 用 yumdownloader 拉取完整依赖包先确保源机器装有yum-utilssudo yum install -y yum-utils mkdir -p /data/kylin-docker-rpm cd /data/kylin-docker-rpm然后按需下载sudo yumdownloader --resolve --destdir/data/kylin-docker-rpm docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin--resolve是必须的它会把 glibc 之外的运行时依赖也一起拉下来。如果源机器的软件源版本和目标机不完全一致下载时把--releasever8加上强制按 CentOS 8 系列解析sudo yumdownloader --releasever8 --resolve --destdir/data/kylin-docker-rpm docker-ce下载完成后把目录打包并拷贝tar czf /data/kylin-docker-rpm.tar.gz /data/kylin-docker-rpm scp /data/kylin-docker-rpm.tar.gz kylin-server:/data/这里假设目标机的 root 能通过 SSH 登录如果生产环境禁用了 root就改成scp -i key或者先把 tar 放到运维跳板机再转存。4.2 在目标机用 yum install 本地 rpm 文件在目标机上先检查基础依赖ldd /usr/bin/docker 2/dev/null | grep not found若有 “not found”需要用目标机自带的 base 仓库先补基础库。解包之后安装cd /data tar xzf kylin-docker-rpm.tar.gz sudo yum install -y ./kylin-docker-rpm/docker-ce-*.rpm ./kylin-docker-rpm/docker-ce-cli-*.rpm ./kylin-docker-rpm/containerd.io-*.rpm用./xxx.rpm而不是裸文件名是告诉 yum 从本地文件解析这样 yum 会自动按依赖顺序处理避免rpm -ivh --nodeps那种“装进去但起不来”的假安装。内核没有升级的前提下docker version的 Client 和 Server 版本不要求完全一致但containerd.io版本太旧会导致镜像层挂载失败。4.3 离线安装时容易翻车的老旧包检查组件检查命令翻车现象libseccomprpm -q libseccomprunc 启动时提示 seccomp 相关错误容器直接退出systemd 版本systemctl --versiontoo old 时容器 cgroup 资源限制不生效iptables 后端iptables -V旧 docker 在 nft 后端下无法建立 NAT 规则离线环境最容易忽略的是 libseccomp 版本。runc 对 seccomp 支持需要较新的版本老机器自带包如果太旧containerd 启动容器时会直接退出。这时不要把 rpm --nodeps 硬装上去而要从系统 ISO 中找到同版本 libseccomp 的升级包或者换用兼容旧架构的 containerd 版本。另一种离线做法是把所有 rpm 导入本地 yum 仓库sudo createrepo /data/local-docker-repo sudo yum-config-manager --add-repo file:///data/local-docker-repo sudo yum install -y docker-ce这里的前提是目标机的 glibc、systemd 这些基础包仍在系统源里可用本地仓库只负责 docker 相关包。这样后续yum update时就不会因为 repo 冲突把 docker 升级到意外版本。5. 把 Docker 数据目录挂到独立磁盘不挤占系统盘镜像和容器都写在 Docker Root Dir 下默认是/var/lib/docker。银河麒麟服务器一般给系统盘 40GB跑几个 mysql 容器后很快就满。先把独立数据盘挂上去是对 dockerd 最有长期价值的安装后调整。5.1 格式化新磁盘并写入 fstabsudo lsblk sudo mkfs.xfs /dev/sdb sudo mkdir -p /data/docker sudo mount /dev/sdb /data/docker echo /dev/sdb /data/docker xfs defaults,noatime 0 0 | sudo tee -a /etc/fstablsblk用于确认磁盘编号有些虚拟化环境分配的是/dev/vdb不要硬套/dev/sdb。noatime减少容器频繁读文件时的时间戳写入对这个负载场景有帮助。5.2 把>{ data-root: /data/docker, exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } }修改后重启 dockersudo systemctl restart docker sudo docker info | grep Docker Root Dir如果输出不是/data/docker说明 daemon.json 没被加载或 dockerd 起在了旧目录。先systemctl cat docker看有没有 override 文件覆盖了--data-root参数再journalctl -u docker -n 50查启动参数。5.3 用一个 mysql 容器验证挂载链路sudo docker run -d --name kylin-mysql-test \ -e MYSQL_ROOT_PASSWORDTest123 \ -p 3306:3306 \ -v /data/docker/mysql:/var/lib/mysql \ mysql:8.0-v的左边是宿主机目录右边是容器内 mysql 的数据目录。等待几秒后查看sudo docker inspect kylin-mysql-test --format{{range .Mounts}}{{.Source}} - {{.Destination}}{{end}}输出/data/docker/mysql - /var/lib/mysql就表示容器写到了独立磁盘数据目录接管成功。本文还有配套的精品资源点击获取