前言

最近在一台麒麟 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 镜像超时,可以考虑:

  1. 配置企业内部私有镜像仓库。
  2. 使用可用的镜像加速服务。
  3. 在其他机器拉取镜像后,通过 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、证书或网络策略影响,静态二进制部署是一种更可控的方案。

本次部署的核心思路是:

  1. 修复服务器 DNS。
  2. 避开不可用的 Kylin dnf 源。
  3. 使用 Docker 官方静态二进制包安装 Engine。
  4. 手动安装 Docker Compose 插件。
  5. 手动编写 systemd 服务文件。
  6. 配置 Docker 开机自启。
  7. 调整 Docker socket 组权限,让 robot 用户可以直接使用 Docker。

如果后续还需要稳定拉取公网镜像,建议继续配置私有镜像仓库或可用的镜像加速方案。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐