银河麒麟V10 SP1安装Docker:环境检查、在线/离线及数据目录迁移
2026/9/23 21:40:33 网站建设 项目流程

简介:针对银河麒麟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 firewalld

yum 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 后端下启动报 “can't initialize iptables table”
nft --version有输出即可无输出说明 nftables 不在 PATH,需要检查是否装了 nftables 包
getenforceEnforcing / PermissiveEnforcing 下 docker 挂载 volume 会出现 SELinux 拒绝,日志在/var/log/audit/audit.log

我一般会把这些结果写进资产清单,而不是用记忆判断。iptablesnftables的差异尤其影响离线安装:如果目标机上只有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

如果没有安装semodulesemanage,说明 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] name=Docker CE Stable - $basearch baseurl=https://download.docker.com/linux/centos/8/$basearch/stable enabled=1 gpgcheck=1 gpgkey=https://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='*' --enablerepo='docker-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-plugindocker-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.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } }

其中native.cgroupdriver=systemd把容器 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-utils

sudo 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 之外的运行时依赖也一起拉下来。如果源机器的软件源版本和目标机不完全一致,下载时把--releasever=8加上,强制按 CentOS 8 系列解析:

sudo yumdownloader --releasever=8 --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 格式化新磁盘并写入 fstab

sudo 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/fstab

lsblk用于确认磁盘编号,有些虚拟化环境分配的是/dev/vdb,不要硬套/dev/sdbnoatime减少容器频繁读文件时的时间戳写入,对这个负载场景有帮助。

5.2 把>{ "data-root": "/data/docker", "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } }

修改后重启 docker:

sudo 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_PASSWORD='Test@123' \ -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就表示容器写到了独立磁盘,数据目录接管成功。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询