海光 + 麒麟 V10 SP3 离线部署 Docker / Mopheus 总结
一、环境确认
服务器环境最终确认:
硬件: 曙光服务器 / 海光 Hygon C86
CPU架构: x86_64
操作系统: 银河麒麟 Server V10 SP3 2403
ISO: Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso
glibc: 2.28
Kernel: 4.19.90
systemd: 243-67
检查命令:
cat /etc/os-release
uname -m
uname -r
rpm -q glibc
rpm -q systemd
lscpu
架构判断
海光 CPU 兼容 x86-64 指令体系。
因此:
C86 / Hygon
↓
x86_64
↓
软件包通常标记为 amd64 / x86_64
所以 Mopheus 应选择:
mopheus-install-v2.2.2-linux-amd64.tar.gz √
mopheus-install-v2.2.2-linux-arm64.tar.gz ×
从基础组件来看,麒麟 V10 SP3 与 RHEL/CentOS 8 这一代更接近:
| 组件 | 麒麟 V10 | CentOS 7 | RHEL 8 |
|---|---|---|---|
| glibc | 2.28 | 2.17 | 2.28 |
| Kernel | 4.19.90 | 3.10 | 4.18 |
| systemd | 243 | 219 | 239 |
因此遇到第三方软件只有 RHEL/CentOS 分类时,通常优先参考 RHEL 8 / CentOS 8,但不能认为二进制/RPM 100%兼容。
二、使用麒麟 ISO 建立离线 YUM 源
由于服务器属于离线环境,需要使用安装 ISO 解决系统 RPM 依赖。
假设 ISO:
/root/Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso
创建挂载目录:
mkdir -p /mnt/kylin
挂载:
mount -o loop \
/root/Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso \
/mnt/kylin
检查:
ls /mnt/kylin
确认 ISO 中存在:
repodata/
三、配置 ISO YUM Repository
备份原来的 repo:
mkdir -p /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
创建:
vi /etc/yum.repos.d/kylin-iso.repo
内容:
[kylin-iso]
name=Kylin V10 SP3 2403 ISO
baseurl=file:///mnt/kylin
enabled=1
gpgcheck=0
重新生成缓存:
yum clean all
yum makecache
yum repolist
测试:
yum list available | head
至此:
Kylin ISO
↓
/mnt/kylin
↓
file:///mnt/kylin
↓
yum
离线 YUM 源建立完成。
四、发现 ISO 自带 Docker 版本过低
Mopheus 要求:
Docker Engine >= 20.10
通过 ISO YUM 源查询:
yum list available | grep -i docker
发现:
docker-engine.x86_64
1:18.09.0-261.p02.ky10
即:
ISO Docker Engine = 18.09
Mopheus 要求 >= 20.10
18.09 < 20.10
结论
不能直接使用麒麟 ISO 自带 Docker。
但是 ISO YUM 源继续保留,用于解决其他系统依赖。
五、第一次尝试:Docker CE 26 RPM
mopheus 自带的离线docker 不合适:
containerd.io-1.6.33-3.1.el7.x86_64.rpm
docker-buildx-plugin-0.14.1-1.el7.x86_64.rpm
docker-ce-26.1.4-1.el7.x86_64.rpm
docker-ce-cli-26.1.4-1.el7.x86_64.rpm
docker-ce-rootless-extras-26.1.4-1.el7.x86_64.rpm
docker-compose-plugin-2.27.1-1.el7.x86_64.rpm
这里存在一个潜在问题:
*.el7.x86_64.rpm
属于 EL7 RPM,而麒麟 V10 更接近 RHEL8 技术栈。
六、问题一:containerd.io 与麒麟 docker-runc 冲突
安装:
yum install ./containerd.io*.rpm
出现冲突:
docker-runc-1.0.0.rc3-222.ky10.x86_64
与
containerd.io-1.6.33-3.1.el7.x86_64
冲突。
原因是:
麒麟已经安装 docker-runc
↓
containerd.io 自己也提供 runc
↓
RPM package conflict
因此不能让两套 runc 共存。
处理时需要检查:
rpm -qa | grep -Ei 'docker|containerd|runc'
确认旧组件关系后移除冲突的旧 docker-runc,再安装 containerd.io。
最终:
containerd.io 1.6.33 √ 安装成功
七、问题二:Docker CE 26 缺少 rootless 依赖
随后执行类似:
yum install ./docker-*
结果部分组件安装成功:
docker-ce-cli 26.1.4 √
docker-buildx-plugin 0.14.1 √
docker-compose-plugin 2.27.1 √
containerd.io 1.6.33 √
但真正的:
docker-ce ×
没有成功。
原因是依赖:
docker-ce
↓
docker-ce-rootless-extras
↓
fuse-overlayfs >= 0.7
slirp4netns >= 0.4
尝试:
yum install fuse-overlayfs slirp4netns
但麒麟 V10 SP3 ISO 本地源提示:
No match / 找不到软件包
说明 ISO 中没有这两个依赖。
八、为什么 docker --version 显示 26,却不能用
此时执行:
docker --version
能够看到:
Docker version 26.1.4
一开始容易误认为 Docker 已经安装成功。
实际上这只能说明:
Docker CLI 26.1.4 √
不能证明:
Docker Engine √
继续执行:
docker info
出现:
Cannot connect to the Docker daemon at
unix:///var/run/docker.sock.
Is the docker daemon running?
并检查:
rpm -q docker-ce
which dockerd
确认:
docker-ce 未安装
dockerd 不存在
结论
当时的实际状态:
docker CLI 26.1.4 √
Buildx 0.14.1 √
Compose 2.27.1 √
containerd.io 1.6.33 √
Docker Engine/dockerd ×
docker.service ×
因此 不满足 Mopheus 的 Docker Engine ≥20.10 要求。
以后判断 Docker 是否安装成功,不要只运行:
docker --version
应该运行:
docker version
必须同时看到:
Client:
Version: ...
Server:
Engine:
Version: ...
九、最终方案:放弃 EL7 RPM,使用 Docker 静态版
由于:
麒麟 ISO Docker = 18.09 太旧
Docker CE 26 EL7 RPM 发行版不匹配
+
rootless 依赖缺失
因此最终决定:
使用 Docker 官方 x86_64 静态二进制版本。
选择:
Docker Engine 20.10.24
满足:
20.10.24 >= Mopheus 要求的 20.10
下载:
docker-20.10.24.tgz
十、清理 Docker 26 半成品
先检查:
rpm -qa | grep -E 'docker|containerd'
卸载之前通过 RPM 装进去的 Docker CLI 等组件:
yum remove \
docker-ce-cli \
docker-buildx-plugin \
docker-compose-plugin
不要盲目删除系统组件。
然后:
which docker
which dockerd
十一、安装 Docker 20.10.24 静态版
假设:
/root/docker/docker-20.10.24.tgz
进入:
cd /root/docker
解压:
tar -xzf docker-20.10.24.tgz
检查:
ls docker/
应该包含类似:
docker
dockerd
containerd
containerd-shim
ctr
runc
docker-proxy
复制:
cp docker/* /usr/local/bin/
验证:
/usr/local/bin/docker --version
/usr/local/bin/dockerd --version
应该看到:
Docker version 20.10.24
十二、解决 /usr/bin/docker 找不到的问题
安装静态版以后遇到:
/usr/bin/docker 找不到
但是:
/usr/local/bin/docker
实际存在。
这是因为之前 RPM 版本的 Docker 位于:
/usr/bin/docker
卸载 RPM 后该文件消失,而 shell/程序仍可能引用旧路径。
首先:
hash -r
检查:
which docker
type -a docker
echo $PATH
正常应该优先找到:
/usr/local/bin/docker
可以直接测试:
/usr/local/bin/docker --version
如果某些程序硬编码要求 /usr/bin/docker,可以建立链接:
ln -sf /usr/local/bin/docker /usr/bin/docker
然后:
hash -r
docker --version
十三、为静态 Docker 创建 systemd 服务
静态安装不会自动生成 docker.service,因此需要自己创建。
vi /etc/systemd/system/docker.service
内容:
[Unit]
Description=Docker Application Container Engine
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
加载:
systemctl daemon-reload
设置开机启动并立即启动:
systemctl enable --now docker
检查:
systemctl status docker
应该:
Active: active (running)
十四、最终验证 Docker
不要只运行:
docker --version
而是:
docker version
必须同时存在:
Client:
Version: 20.10.24
Server:
Engine:
Version: 20.10.24
再:
docker info
不能出现:
Cannot connect to the Docker daemon
检查进程:
ps -ef | grep -E 'dockerd|containerd'
最终:
Docker Client √
dockerd √
containerd √
docker.service √
开机启动 √
Docker Engine 20.10.24
满足:
Mopheus 要求:
Docker Engine >= 20.10 √
十五、安装 Mopheus 时选择 amd64
海光 C86:
uname -m
→ x86_64
因此选择:
mopheus-install-v2.2.2-linux-amd64.tar.gz
而不是:
linux-arm64
十六、Mopheus 前台运行正常,但退出 SSH 后停止
开发调试可以:
mopheus daemon start
但 SSH 退出后不能依赖前台进程。
因此使用:
mopheus daemon install --enable --start
由于命令是普通用户执行的,生成的是:
~/.config/systemd/user/mopheus.service
而不是:
/etc/systemd/system/mopheus.service
因此管理命令也应该是:
systemctl --user status mopheus
systemctl --user start mopheus
systemctl --user stop mopheus
systemctl --user restart mopheus
十七、为什么退出 SSH 后 Mopheus 仍然停止
普通用户的:
systemd --user
默认可能跟用户登录 session 生命周期相关。
SSH:
登录
↓
systemd --user
↓
mopheus
↓
SSH退出
↓
用户session结束
↓
systemd --user 被回收
↓
Mopheus停止
解决方法是开启:
linger
十八、普通用户没有 sudo 权限怎么办
当前普通用户没有 sudo 权限,因此自己无法完成 linger 的系统级配置。
不需要给普通用户 sudo 权限。
只需要让管理员/root 执行一次:
loginctl enable-linger 用户名
例如用户名:
mopheus
root 执行:
loginctl enable-linger mopheus
检查:
loginctl show-user mopheus -p Linger
应该:
Linger=yes
这一步只需要管理员操作一次。
十九、普通用户重新启动 Mopheus
开启 linger 后,普通用户自己执行:
systemctl --user daemon-reload
systemctl --user enable --now mopheus
检查:
systemctl --user status mopheus
应该:
Active: active (running)
测试退出 SSH:
exit
重新 SSH 登录:
systemctl --user status mopheus
如果依然:
Active: active (running)
说明持久化成功。
最终机制变成:
服务器启动
│
├── systemd
│
└── systemd --user
│
│ Linger=yes
│
└── mopheus.service
│
└── Mopheus daemon
SSH 登录与否
│
└── 不再影响 Mopheus
二十、最终部署架构
整个环境最终可以归纳为:
曙光服务器
│
├── 海光 Hygon C86
│ └── x86_64 / amd64
│
├── 银河麒麟 V10 SP3 2403
│ ├── Kernel 4.19.90
│ ├── glibc 2.28
│ └── systemd 243
│
├── Kylin ISO
│ └── 本地 YUM Repository
│ └── 解决系统 RPM 依赖
│
├── Docker
│ ├── ISO Docker 18.09 × 不使用
│ ├── Docker CE 26 EL7 RPM × 放弃
│ └── Docker 20.10.24 Static √
│ ├── docker
│ ├── dockerd
│ ├── containerd
│ └── systemd
│
└── Mopheus 2.2.2 amd64
│
└── 普通用户 systemd service
│
├── enable
├── start
└── Linger=yes
↓
SSH退出继续运行
这次排障最关键的几个结论
-
海光 C86 = x86_64 软件架构,下载
amd64。 -
麒麟 V10 SP3 更接近 RHEL 8 技术栈,不要因为有 RPM/YUM 就简单当 CentOS 7。
-
麒麟 V10 SP3 2403 ISO 自带 Docker Engine 18.09,不满足 Docker ≥20.10。
-
docker --version有输出不代表 Docker Engine 安装成功。 -
判断 Docker 是否真正可用应该使用:
docker version docker info -
Docker CE 26 的 EL7 RPM 在麒麟上遇到了
docker-runc冲突和fuse-overlayfs/slirp4netns缺失,因此停止继续补依赖。 -
最终采用 Docker 20.10.24 x86_64 静态版 + systemd,绕开 RPM 依赖问题。
-
Mopheus 普通用户安装后属于 systemd user service。
-
enable≠ 退出 SSH 后一定继续运行;普通用户长期运行需要Linger=yes。 -
普通用户没有 sudo 没关系,只需要管理员一次性执行:
loginctl enable-linger 用户名后续 Mopheus 的启动、停止、重启都由普通用户自己通过
systemctl --user来 管理。




