麒麟 Kylin V10 服务器离线/半离线部署 Docker Engine 与 Docker Compose 完整实战
前言
最近在一台麒麟 Kylin Linux Advanced Server V10 服务器上部署 Docker 环境时,遇到了一些比较典型的问题:
- 系统是 Kylin V10,不是标准 Ubuntu/CentOS 环境。
- 服务器
/etc/resolv.conf为空,导致 DNS 无法解析。 - Kylin 官方 yum/dnf 源返回的不是正常 RPM 仓库元数据,而是认证/跳转页面。
- 服务器访问 Docker Hub 超时,无法直接
docker run hello-world拉取镜像。 /etc/group被设置 immutable 属性,不能直接新增docker用户组。
最终采用了 Docker 官方静态二进制包的方式完成部署,并配置了 systemd 开机自启、Docker Compose 插件以及普通用户访问 Docker socket。
本文记录完整部署过程。
一、环境信息
服务器信息如下:
主机 IP:10.100.12.101
SSH 端口:33532
登录用户:robot
系统:Kylin Linux Advanced Server V10
架构:x86_64
登录服务器:
ssh -p 33532 robot@10.100.12.101
查看系统版本:
cat /etc/os-release
uname -m
实际输出类似:
NAME="Kylin Linux Advanced Server"
VERSION="V10 (Lance)"
ID="kylin"
VERSION_ID="V10"
PRETTY_NAME="Kylin Linux Advanced Server V10 (Lance)"
x86_64
二、为什么没有直接用 dnf 安装 Docker
标准 CentOS/RHEL 系统通常可以直接配置 Docker 官方 yum 源:
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
但这台 Kylin V10 服务器遇到了几个问题。
首先,/etc/resolv.conf 是空的,导致域名无法解析:
cat /etc/resolv.conf
可以临时写入 DNS:
sudo cp -a /etc/resolv.conf /etc/resolv.conf.bak.$(date +%Y%m%d%H%M%S) 2>/dev/null || true
sudo tee /etc/resolv.conf >/dev/null <<'EOF'
nameserver 223.5.5.5
nameserver 119.29.29.29
nameserver 8.8.8.8
EOF
验证解析:
getent hosts update.cs2c.com.cn
getent hosts download.docker.com
DNS 修复后,Kylin 系统源仍然有问题。访问系统源的 repomd.xml 时,返回的是 HTML 页面,而不是 RPM 仓库元数据:
curl -kL https://update.cs2c.com.cn/NS/V10/V10SP3/os/adv/lic/base/x86_64/repodata/repomd.xml
这会导致:
repomd.xml parser error
因此,本次没有继续依赖系统 dnf 源,而是改用 Docker 官方静态二进制包部署。
三、下载 Docker 静态二进制包
本文使用版本:
Docker Engine:29.5.3
Docker Compose:v5.1.4
可以先在本机或任意能正常访问外网的机器下载:
mkdir -p downloads
curl -L --fail -o downloads/docker-29.5.3.tgz \
https://download.docker.com/linux/static/stable/x86_64/docker-29.5.3.tgz
curl -L --fail -o downloads/docker-compose-linux-x86_64 \
https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64
如果 GitHub 下载不稳定,可以多试几次,或使用支持断点续传的下载工具。
检查文件:
ls -lh downloads/
大致大小如下:
docker-29.5.3.tgz 83M
docker-compose-linux-x86_64 31M
四、上传安装包到服务器
上传到服务器用户目录:
scp -P 33532 downloads/docker-29.5.3.tgz robot@10.100.12.101:/home/robot/
scp -P 33532 downloads/docker-compose-linux-x86_64 robot@10.100.12.101:/home/robot/
登录服务器:
ssh -p 33532 robot@10.100.12.101
创建临时安装目录:
mkdir -p /home/robot/codex-docker-install
mv /home/robot/docker-29.5.3.tgz /home/robot/codex-docker-install/docker.tgz
mv /home/robot/docker-compose-linux-x86_64 /home/robot/codex-docker-install/docker-compose
五、安装 Docker Engine 和 Compose
解压 Docker 静态包:
cd /home/robot/codex-docker-install
mkdir -p extract
tar -xzf docker.tgz -C extract
安装 Docker 二进制:
sudo install -m 0755 extract/docker/* /usr/local/bin/
安装 Docker Compose 插件:
sudo install -D -m 0755 docker-compose /usr/local/lib/docker/cli-plugins/docker-compose
sudo ln -sf /usr/local/lib/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose
验证二进制是否可用:
docker version
docker compose version
docker-compose version
此时如果 Docker daemon 还没有启动,docker version 可能只能显示 Client 信息,这是正常的。
六、配置 Docker daemon
创建 Docker 配置目录:
sudo mkdir -p /etc/docker
写入日志限制配置,避免容器日志无限增长:
sudo tee /etc/docker/daemon.json >/dev/null <<'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
七、配置 systemd 服务和开机自启
由于静态二进制安装不会自动生成 systemd 服务文件,需要手动创建:
sudo tee /etc/systemd/system/docker.service >/dev/null <<'EOF'
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/dockerd -H unix:///var/run/docker.sock --group robot
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
Restart=always
RestartSec=2
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
OOMScoreAdjust=-500
[Install]
WantedBy=multi-user.target
EOF
这里有一个细节:
--group robot
它表示 /var/run/docker.sock 的所属组使用 robot,这样 robot 用户可以直接执行 docker ps,不用每次都加 sudo。
加载并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable --now docker
确认 Docker 已启动并设置开机自启:
systemctl is-active docker
systemctl is-enabled docker
systemctl status docker --no-pager
正常输出:
active
enabled
八、解决普通用户 docker permission denied
如果普通用户执行:
docker ps
报错:
permission denied while trying to connect to the docker API at unix:///var/run/docker.sock
说明当前用户没有权限访问 Docker socket。
查看 socket 权限:
ls -l /var/run/docker.sock
本次最终修复后的状态:
srw-rw---- 1 root robot 0 /var/run/docker.sock
如果你的服务文件里还是 --group root,可以改成 --group robot:
sudo sed -i 's#--group root#--group robot#g' /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker
再次验证:
docker ps
docker version
docker compose version
正常情况下,robot 用户可以直接使用 Docker。
安全提醒:能访问 Docker socket 的用户,基本等同于拥有较高系统权限。生产环境中不要随意把 Docker socket 权限开放给不可信用户。
九、验证 Docker 和 Compose
查看版本:
docker version
docker compose version
本次部署结果:
Docker Engine: 29.5.3
Docker Compose: v5.1.4
查看服务:
docker ps
输出类似:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
由于当前服务器访问 Docker Hub 超时,直接执行下面命令可能失败:
docker run --rm hello-world
错误类似:
failed to resolve reference "docker.io/library/hello-world:latest"
i/o timeout
这不是 Docker daemon 没装好,而是服务器访问 Docker Hub 的网络问题。
十、Docker Hub 访问超时的处理建议
如果服务器拉取 Docker Hub 镜像超时,可以考虑:
- 配置企业内部私有镜像仓库。
- 使用可用的镜像加速服务。
- 在其他机器拉取镜像后,通过
docker save/docker load离线导入。
例如离线导入镜像:
在能联网的机器上:
docker pull nginx:latest
docker save -o nginx-latest.tar nginx:latest
上传到服务器后:
docker load -i nginx-latest.tar
docker run -d --name nginx-test -p 8080:80 nginx:latest
访问:
curl http://127.0.0.1:8080
十一、常用维护命令
查看 Docker 服务:
systemctl status docker --no-pager
启动 Docker:
sudo systemctl start docker
停止 Docker:
sudo systemctl stop docker
重启 Docker:
sudo systemctl restart docker
查看 Docker 信息:
docker info
查看容器:
docker ps
docker ps -a
查看镜像:
docker images
查看 Compose 版本:
docker compose version
十二、安装路径汇总
本次静态部署涉及的关键路径如下:
Docker 二进制:
/usr/local/bin/docker
/usr/local/bin/dockerd
/usr/local/bin/containerd
/usr/local/bin/runc
Docker Compose 插件:
/usr/local/lib/docker/cli-plugins/docker-compose
Compose 兼容命令:
/usr/local/bin/docker-compose
Docker daemon 配置:
/etc/docker/daemon.json
systemd 服务:
/etc/systemd/system/docker.service
Docker socket:
/var/run/docker.sock
十三、最终部署结果
最终确认结果:
systemctl is-enabled docker
# enabled
systemctl is-active docker
# active
docker version --format 'Client={{.Client.Version}} Server={{.Server.Version}}'
# Client=29.5.3 Server=29.5.3
docker compose version
# Docker Compose version v5.1.4
docker ps
# 正常返回容器列表
至此,Kylin Linux Advanced Server V10 上的 Docker Engine 与 Docker Compose 部署完成,并已配置开机自启。
总结
在标准 Linux 发行版上,推荐优先使用 Docker 官方软件源安装 Docker Engine。但在 Kylin V10 这类企业发行版环境中,如果系统源受授权、DNS、证书或网络策略影响,静态二进制部署是一种更可控的方案。
本次部署的核心思路是:
- 修复服务器 DNS。
- 避开不可用的 Kylin dnf 源。
- 使用 Docker 官方静态二进制包安装 Engine。
- 手动安装 Docker Compose 插件。
- 手动编写 systemd 服务文件。
- 配置 Docker 开机自启。
- 调整 Docker socket 组权限,让
robot用户可以直接使用 Docker。
如果后续还需要稳定拉取公网镜像,建议继续配置私有镜像仓库或可用的镜像加速方案。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)