想在 openEuler 上使用 Docker Engine 和 docker compose,并让软件包交给 DNF 更新,可以使用 Docker 发布的 CentOS 9 RPM。本教程先完成新安装,再介绍已有 Moby 环境的迁移及常见问题。
这里的关键是固定仓库路径中的 centos/9:openEuler 的 $releasever 不能直接代入 Docker 的 CentOS 仓库目录。这是经过实际安装验证的兼容用法,上游平台范围可查阅 Docker 安装文档。
1. 先确认是否已有 Docker
type -a docker dockerd
rpm -q docker-ce moby docker-engine podman-docker
新系统提示命令或软件包不存在是正常的。若已经装过,先确认使用的是哪一套:Docker CE 可以沿用原仓库更新;Moby 用户看后面的迁移小节;静态安装的 /usr/local/bin/docker、dockerd 和自建服务文件,需要先处理,不能直接叠加另一套安装。
下面以有 sudo 权限的普通用户操作。全文先用 sudo docker,不要求为了安装而把当前用户加入 docker 组。
2. 配置 Docker CE 仓库
下面为尚未配置此仓库的系统创建文件。如果已经有 /etc/yum.repos.d/docker-ce.repo 或相同的仓库 ID,先检查并备份原文件,再调整,避免重复定义或覆盖现有配置。
先写入国内镜像列表:
sudo install -d -m 0755 /etc/dnf/mirrorlists.d
sudo tee /etc/dnf/mirrorlists.d/docker-ce-stable >/dev/null <<'EOF'
https://mirrors.cernet.edu.cn/docker-ce/linux/centos/9/$basearch/stable/
https://mirrors.aliyun.com/docker-ce/linux/centos/9/$basearch/stable/
https://mirrors.tencent.com/docker-ce/linux/centos/9/$basearch/stable/
https://mirrors.huaweicloud.com/docker-ce/linux/centos/9/$basearch/stable/
EOF
再创建仓库配置,保留 Docker 官方地址作为 baseurl:
sudo tee /etc/yum.repos.d/docker-ce.repo >/dev/null <<'EOF'
[docker-ce-stable]
name=Docker CE Stable - $basearch
mirrorlist=file:///etc/dnf/mirrorlists.d/docker-ce-stable
baseurl=https://download.docker.com/linux/centos/9/$basearch/stable/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF
sudo dnf makecache --repo docker-ce-stable
$basearch 会由 DNF 选择为 x86_64 或 aarch64;上面的单引号 <<'EOF' 用来保留它,不让 shell 提前替换。需要从官方上游下载软件包时,可注释 mirrorlist 一行;签名密钥也可以改用官方地址 https://download.docker.com/linux/centos/gpg。
3. 安装并启动
sudo dnf install docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin curl
DNF 首次导入 Docker 仓库的签名密钥时,核对指纹应为:
060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35
这个指纹可从 Docker 官方 CentOS 安装说明独立核对。下载镜像可以变化,RPM 仍由 Docker 的密钥验签,不需要关闭 gpgcheck。
安装后启动服务,并设置开机启动:
sudo systemctl enable --now docker
sudo docker version
sudo docker compose version
sudo docker buildx version
docker version 应同时显示 Client 和 Server。仓库包已经提供服务文件,Compose 和 Buildx 也随上述 RPM 安装,无需另写 docker.service 或再下载插件。
4. 运行一个 Compose 项目
已有项目时,进入包含 compose.yaml 的目录,按项目说明运行即可。下面用一个 Nginx 服务作简短示例:
mkdir -p "$HOME/docker-ce-demo"
cd "$HOME/docker-ce-demo"
cat >compose.yaml <<'EOF'
services:
web:
image: nginx:stable
ports:
- "127.0.0.1:8080:80"
restart: unless-stopped
EOF
sudo docker compose up -d
sudo docker compose ps
curl -f http://127.0.0.1:8080/
看到容器运行并返回 Nginx 页面,说明基本安装完成。若拉取镜像超时,先按后面的镜像或 daemon 代理说明处理,再重试 docker compose up -d。
8080 仅绑定运行 Docker 的机器的回环地址;通过 SSH 操作时,curl 也在服务器上执行。Compose 自动为项目建立网络。restart: unless-stopped 让未被手动停止的容器随 Docker 恢复,Compose 命令本身不需要常驻。
不再需要示例时,在该目录执行 sudo docker compose down。不必为了确认安装立即重启整台主机;维护窗口重启后可以用 sudo docker compose ps 检查项目恢复情况。
常见需求与问题
容器显示 Up,但访问不到服务
先在项目目录执行 sudo docker compose logs --tail=50 web,查看应用是否已经启动。Up 只表示容器进程仍在运行,不代表应用已就绪。比如一些 Alpine 版 Nginx 镜像会在入口脚本中访问 Alpine 软件仓库;这个访问既不经过 DNF,也不受 Docker Hub 镜像设置影响。本文使用 Debian 基础的 nginx:stable 作示例。
Docker Hub 镜像拉取慢或失败
下载 RPM 的软件镜像站与 docker pull 使用的容器镜像仓库是两回事。前面的 DNF 仓库配置不会加速 Docker Hub。
可以选择自己信任的 Docker Hub 镜像服务。以下以毫秒镜像为例,在 /etc/docker/daemon.json 中增加:
{
"registry-mirrors": ["https://docker.1ms.run"]
}
文件不存在时先用 sudo install -d -m 0755 /etc/docker 创建目录,再用 sudoedit /etc/docker/daemon.json 编辑;已有文件时合并字段,不要覆盖其他选项。然后验证并重启服务:
sudo dockerd --validate --config-file=/etc/docker/daemon.json
sudo systemctl restart docker
sudo docker info --format '{{json .RegistryConfig.Mirrors}}'
重启前确认现有业务能接受中断。公共镜像服务的可用性会变化;如果所选服务持续缓慢,也可以按 DaoCloud 的说明换用 https://docker.m.daocloud.io。这类设置主要处理 Docker Hub,不会自动代理所有 registry。Docker Registry mirror 说明
终端设置了代理,为什么 Docker 仍然拉不到镜像
镜像由后台的 dockerd 下载,不是当前终端中的 docker 客户端。shell 的代理变量通常不会传给 systemd 已启动的服务。
已有可用 HTTP 代理时,执行 sudo systemctl edit docker,加入:
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,::1"
地址应替换为 Docker 主机可达的代理;这里的 127.0.0.1 指 Docker 主机自己。之后执行:
sudo systemctl daemon-reload
sudo systemctl restart docker
再重试拉取。内网 registry 可加入 NO_PROXY;可用 sudo systemctl show --property=Environment docker 检查服务是否读到了设置。若 daemon.json 已配置 proxies,其优先级高于这里的环境变量,应在原配置中调整。这是服务的 HTTP 代理,与 registry-mirrors 不是同一种配置。daemon 代理说明
希望不加 sudo 运行 Docker
sudo usermod -aG docker "$USER"
退出当前会话并重新登录后生效。docker 组具有相当于主机 root 的能力,只加入可信用户;这与 rootless Docker 不是一回事。安装后权限说明
DNF 下载慢、找不到软件包
先看错误对应哪个仓库:openEuler 的 OS / update 等源负责系统依赖,docker-ce-stable 负责 Docker RPM。前者出错时,修改 Docker 镜像地址没有作用。
如果 Docker 仓库某个镜像无法连接或尚未同步新版本,可以调整本地 mirrorlist,随后刷新该仓库元数据:
sudo dnf --refresh makecache --repo docker-ce-stable
dnf list --showduplicates docker-ce
不要把 openEuler 的版本号填进 centos/9,也不需要把整套 CentOS 系统仓库加进来。
从发行版 Moby 切换到 Docker CE
这是运行时及软件包替换,应安排业务停机和可恢复的备份,再进行操作。先完成上面的 Docker CE 仓库配置,但暂不执行全新安装命令。
先记录容器、volume、网络及数据目录,备份 Compose 文件、bind mount 数据和应用自身的数据:
sudo docker ps -a
sudo docker volume ls
sudo docker network ls
DOCKER_ROOT=$(sudo docker info --format '{{.DockerRootDir}}')
Moby 默认可能启用 live restore,因此要先停止容器,再停止 daemon。以下备份示例适合容量充足的测试机;业务主机应选择合适的备份文件系统或存储快照:
sudo docker ps -q | xargs -r sudo docker stop
sudo systemctl stop docker.service docker.socket containerd.service
BACKUP_DIR="$HOME/docker-before-ce-$(date +%Y%m%d-%H%M%S)"
sudo install -d -m 0700 "$BACKUP_DIR"
sudo cp -a --reflink=auto "$DOCKER_ROOT" "$BACKUP_DIR/docker-data"
for path in /var/lib/containerd /etc/docker /etc/sysconfig/docker; do
if sudo test -e "$path"; then
sudo cp -a --parents --reflink=auto "$path" "$BACKUP_DIR/"
fi
done
如果曾手动安装 Compose,先将该插件移到备份目录,避免覆盖 RPM 插件的查找优先级:
if [ -e /usr/local/lib/docker/cli-plugins/docker-compose ]; then
sudo mv /usr/local/lib/docker/cli-plugins/docker-compose \
"$BACKUP_DIR/docker-compose.manual"
fi
然后在一个事务中替换软件包:
sudo dnf swap moby docker-ce
sudo dnf install docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
提交前检查 DNF 的移除与安装列表。Moby、发行版的 containerd / runc 被对应组件替换属于预期;如果还要移除无关业务软件,先取消并查清依赖。
/etc/docker/daemon.json 中的配置可以继续使用,但原来通过 /etc/sysconfig/docker 和服务参数设置的 journald、live restore 等不会自动迁移到 Docker CE。启动前按实际需要合并配置,并检查是否存在旧的 systemd 覆盖文件。
保持原来的存储后端,先确认既有数据可见,不要把迁移与切换 containerd image store 合在一起。之后启动服务,在原项目目录恢复容器:
sudo systemctl enable --now docker
sudo docker info
sudo docker compose up -d
sudo docker compose ps
此前手动停止、使用 unless-stopped 的容器需要显式恢复。备份应保留到应用检查完成;卸载 RPM 不会自动清空数据目录,但这不等于任意版本跨度都可以直接回退。Docker 存储后端说明
日志与日常更新
sudo journalctl -b -u docker --no-pager -n 100
sudo docker info
sudo dnf upgrade docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
更新前查看 DNF 事务与 Docker 发布说明。如果希望新建容器使用自带轮转的 local 日志驱动,可在 daemon.json 合并 "log-driver": "local";已有容器保留创建时的日志配置,需要按项目计划重建才采用新默认值。日志驱动说明
遇到安装时的 SELinux 警告,应根据具体规则和服务日志定位,不要直接关闭 SELinux。本次安装 Docker CE 29.8.1 时,出现了 docker-af-alg-deny.cil 和 docker-af-vsock-deny.cil 加载警告。引擎及示例容器能运行,但这两项附加拒绝规则未成功加载,应单独评估其安全影响;运行成功不等于这些保护已生效,也不等于整个容器策略都未安装。
验证说明:安装方法此前在 openEuler 22.03 LTS SP4、24.03 LTS SP3 的 x86_64 / aarch64 上通过安装、Compose 与重启验证;本次在 24.03 LTS SP3 x86_64 上补验 Docker CE 29.8.1、Compose 5.5.1 及 Moby 迁移。修订日期:2026-09-20