本文介绍如何在一台 CentOS Stream 9 服务器上安装 Docker CE(社区版),并完成卸载旧版本、添加软件源(含国内源替换)、安装引擎、设置开机自启、验证安装,以及最常用的两类”国内源”配置:软件仓库镜像与镜像拉取加速器。文章还会汇总 Docker 的关键配置文件位置,方便日常排查和维护。
示例命令面向 CentOS Stream 9 的 x86_64 主机。如果
uname -m输出不是x86_64,请把示例中的路径替换为对应架构。安装需要 root 或具有 sudo 权限的账号;下文统一使用sudo前缀,直接以 root 登录时可省略。
一、确认系统信息
先确认发行版、内核和 CPU 架构:
cat /etc/centos-release
uname -r
uname -m
cat /etc/centos-release 显示发行版名称与版本,用于确认系统确实是 CentOS Stream 9;uname -r 显示内核版本,Docker 依赖较新的内核特性(CentOS Stream 9 默认使用 5.14 内核,已经满足要求);uname -m 显示 CPU 架构,x86_64 表示 64 位 x86,可以直接使用本文命令。
二、卸载旧版本 Docker(可选但建议)
如果系统里装过旧版 Docker(CentOS 源里的 docker、docker-engine 等),先卸载,避免和新版 docker-ce 冲突:
sudo dnf remove -y \
docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
dnf remove 是卸载命令,-y 表示自动确认,行尾的 \ 是续行符,把多行合并成一条命令。上面列出的都是旧版包名;如果从未安装过,dnf 会提示 No match for argument,这属于正常现象,可以忽略,不影响后续安装。
这一步删除的只是软件包,不会删除已有的镜像、容器和 /var/lib/docker 数据目录。
三、安装 dnf-plugins-core
sudo dnf install -y dnf-plugins-core
dnf 是 CentOS 8/9 的包管理器(yum 的继任者)。dnf-plugins-core 提供 dnf config-manager 等插件命令,后面添加 Docker 软件源要用的 dnf config-manager --add-repo 正是由这个包提供的,因此要先安装。
四、添加 Docker 软件源
4.1 软件源是什么
软件源(repository,简称 repo)是一台存放 rpm 软件包及其元数据(包名、版本、依赖关系、校验和等)的服务器。dnf 安装软件时,会先从源里下载元数据,再根据元数据找到并下载需要的安装包。CentOS Stream 9 自带的源里没有 Docker CE,所以需要额外添加 Docker 官方源。
4.2 添加 Docker 官方源
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf config-manager --add-repo <URL> 会下载指定地址的 .repo 文件并保存到 /etc/yum.repos.d/ 目录,生成 /etc/yum.repos.d/docker-ce.repo。这个目录是 dnf 读取软件源配置的地方,每个 .repo 文件定义一个或多个源。
4.3 软件源配置文件位置
- 源配置目录:
/etc/yum.repos.d/ - Docker 源文件:
/etc/yum.repos.d/docker-ce.repo
查看文件内容:
cat /etc/yum.repos.d/docker-ce.repo
文件里以 [docker-ce-stable] 这样的方括号段落定义源,常见字段含义:
| 字段 | 含义 |
|---|---|
name |
源的显示名称 |
baseurl |
软件包下载地址 |
gpgcheck=1 |
是否校验软件包 GPG 签名(1 表示校验,建议保持开启) |
gpgkey |
GPG 公钥地址,用于校验签名 |
enabled=1 |
是否启用该源(1 启用,0 禁用) |
4.4 换成国内源
访问 Docker 官方源在国内可能较慢,可以把仓库地址换成国内镜像。两种做法任选其一,推荐第一种:
方式一:直接添加国内镜像的 .repo 文件(阿里云):
sudo dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
其他可选镜像:
# 中科大 USTC
sudo dnf config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 清华大学 TUNA
sudo dnf config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
方式二:先添加官方源,再把下载域名替换为国内镜像域名:
sudo sed -i 's#https://download.docker.com#https://mirrors.aliyun.com/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
sed -i 表示原地编辑文件,s#旧内容#新内容#g 表示全局替换,这里用 # 作分隔符是为了避免 URL 里的 / 干扰。命令把官方域名整体替换成阿里云镜像域名。
注意:如果官方源和国内源都添加过,会生成多个 .repo 文件且可能重复定义同一个源,建议只保留一个。用 ls /etc/yum.repos.d/ 查看当前有哪些源文件,多余的用 sudo rm /etc/yum.repos.d/docker-ce.repo(仅删除源文件本身)移除,或把不用的源设为 enabled=0。
五、刷新源缓存并确认
sudo dnf makecache
sudo dnf repolist
dnf makecache 根据当前源配置下载软件包元数据并生成缓存,相当于”刷新源列表”;dnf repolist 列出当前启用的源,正常情况下应能看到 docker-ce-stable 等条目,说明源配置成功。
六、安装 Docker
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
各软件包的作用:
| 软件包 | 作用 |
|---|---|
docker-ce |
Docker 引擎本体,即守护进程 dockerd |
docker-ce-cli |
命令行客户端 docker |
containerd.io |
容器运行时 containerd,真正负责创建和管理容器 |
docker-buildx-plugin |
Buildx 插件,用于构建镜像,支持多平台构建 |
docker-compose-plugin |
Compose 插件,用 docker compose 编排多容器应用 |
安装过程中如果提示导入 GPG 密钥,输入 y 确认即可(源配置正确且已缓存密钥时可能不再提示)。
七、启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable --now docker
systemctl start docker 立即启动 Docker 守护进程 dockerd;systemctl enable docker 让 Docker 在开机时自动启动(它在 systemd 的多用户目标下创建启动链接);--now 表示”启用后立即启动”,所以第二条命令等价于 enable + start 的组合。日常只需保留 enable --now 一条即可。
检查运行状态:
sudo systemctl status docker --no-pager
看到 active (running) 表示守护进程正常运行。
八、验证安装
sudo docker version
sudo docker run hello-world
docker version 分别显示客户端(Client)和服务端(Server)的版本信息,两边都能显示说明客户端与守护进程通信正常。docker run hello-world 会从镜像仓库拉取一个极小的测试镜像并运行,输出 Hello from Docker! 说明”拉取镜像 → 创建容器 → 运行”整条链路都正常。如果这一步拉取镜像很慢或超时,可以先完成后面的国内镜像加速配置再验证。
九、让普通用户也能使用 docker(可选)
Docker 守护进程通过本机的 unix socket(/var/run/docker.sock)与客户端通信,默认只有 root 和 docker 组的用户可以访问。把普通用户加入 docker 组后,就能免 sudo 运行 docker:
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
groupadd docker 创建 docker 组(已存在会报错,可忽略);usermod -aG docker $USER 把当前用户追加到 docker 组(-a 表示追加而非覆盖原有组);newgrp docker 让当前 shell 立即生效,或者注销后重新登录。
安全提示:能操作 docker 的用户几乎等同于拥有 root 权限,请只把可信用户加入 docker 组。
十、Docker 关键配置文件位置汇总
| 内容 | 位置 | 说明 |
|---|---|---|
| 软件源配置 | /etc/yum.repos.d/docker-ce.repo |
dnf 使用的仓库定义 |
| 守护进程主配置 | /etc/docker/daemon.json |
dockerd 配置:镜像加速、存储、日志等 |
| 数据目录 | /var/lib/docker |
镜像、容器、数据卷、网络等实际数据 |
| systemd 服务单元 | /usr/lib/systemd/system/docker.service |
官方默认服务文件,一般不要直接改 |
| systemd 覆盖配置 | /etc/systemd/system/docker.service.d/*.conf |
systemctl edit docker 生成的覆盖配置,优先级更高 |
| 客户端配置 | ~/.docker/config.json |
当前用户的 docker CLI 配置(认证、上下文等) |
补充说明:
daemon.json默认不存在,需要时手动创建;修改后必须重启 Docker 才生效。- 要改服务启动参数,推荐用
sudo systemctl edit docker,它会生成 drop-in 覆盖文件,而不是直接修改官方单元文件,升级时更不容易被覆盖。
十一、配置国内镜像加速器(registry mirror)
11.1 原理
docker pull / docker run 默认从 Docker Hub(registry-1.docker.io)拉取镜像,国内直接访问经常很慢甚至超时。”镜像加速器”是 registry 的镜像/缓存服务,配置后 dockerd 会优先从加速地址拉取镜像。
11.2 时效性提示
2024 年起,很多免费公共加速器(如 USTC、网易 163、DaoCloud 等)陆续关停或限制访问。目前相对稳定的是阿里云”容器镜像服务”提供的个人专属加速地址(每个账号一个地址)。配置前建议先确认所用加速地址当前仍可用。
获取阿里云加速地址:登录阿里云控制台 → 容器镜像服务 ACR → 镜像工具 → 镜像加速器,页面会显示类似 https://xxxx.mirror.aliyuncs.com 的专属地址。
11.3 配置方法
创建或编辑 /etc/docker/daemon.json:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://xxxx.mirror.aliyuncs.com"
]
}
EOF
mkdir -p 确保 /etc/docker 目录存在;tee 把标准输入写入文件;<<-'EOF' 到 EOF 之间是 here-doc,表示把中间这段内容作为标准输入传给 tee。registry-mirrors 是数组,可以填多个地址,dockerd 会按顺序尝试。把 xxxx 替换成自己的专属地址。
修改后重启 Docker 使其生效:
sudo systemctl daemon-reload
sudo systemctl restart docker
验证配置是否生效:
docker info | grep -A5 "Registry Mirrors"
看到列出的加速地址即表示配置成功。
11.4 配置多个镜像地址(示例)
也可以一次配置多个镜像地址,例如:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://dockerproxy.net",
"https://proxy.vvvv.ee",
"https://dockerproxy.link"
]
}
EOF
registry-mirrors 是数组,dockerd 会按顺序尝试:先请求第一个地址,失败或超时后再尝试下一个。一次配置多个地址的意义在于”互为备份”,当其中某个公共镜像代理停服或限流时,还能自动回退到下一个可用地址。
需要强调的是,上面这些都属于第三方公共镜像代理,而不是官方服务:
- 可用性不稳定。这类公共服务可能随时变更域名、停止维护或限流,无法保证长期可用,实际使用前建议逐个测试连通性。
- 存在信任风险。镜像代理位于你和 Docker Hub 之间,理论上能记录你拉取了哪些镜像,甚至返回被篡改的镜像;Docker 的内容信任(DCT)默认关闭,按标签
docker pull 镜像:tag不会校验内容哈希。生产或敏感环境应优先使用官方仓库、自建私有镜像,或按摘要docker pull 镜像@sha256:...拉取以保证内容一致。
修改后同样需要重启并验证:
sudo systemctl daemon-reload
sudo systemctl restart docker
docker info | grep -A6 "Registry Mirrors"
11.5 daemon.json 其他常用配置
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"],
"data-root": "/var/lib/docker",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"insecure-registries": ["192.168.1.100:5000"]
}
data-root 修改数据目录(磁盘迁移时使用);log-driver 与 log-opts 设置容器日志驱动和轮转,防止日志无限增长撑爆磁盘;insecure-registries 允许访问未启用 HTTPS 的私有仓库,仅建议测试环境使用。
注意:daemon.json 与命令行参数、环境变量同时配置同一项时,dockerd 启动会报冲突,所以能写进 daemon.json 的配置尽量统一放在这里管理。每次修改 daemon.json 后都要 systemctl restart docker 才会生效。
十二、常用命令速查
| 操作 | 命令 |
|---|---|
| 启动 / 停止 / 重启 / 状态 | sudo systemctl start/stop/restart/status docker |
| 查看镜像 | docker images |
| 查看容器 | docker ps(加 -a 包含已停止) |
| 拉取镜像 | docker pull 镜像名:tag |
| 运行容器 | docker run [选项] 镜像名 |
| 查看容器日志 | docker logs 容器ID |
| 进入运行中的容器 | docker exec -it 容器ID bash |
| 启用 / 禁用开机自启 | sudo systemctl enable/disable docker |
十三、卸载 Docker
sudo systemctl stop docker
sudo dnf remove -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
sudo rm -f /etc/yum.repos.d/docker-ce.repo
先停止服务,再卸载软件包;rm -rf /var/lib/docker 和 /var/lib/containerd 会删除所有镜像、容器和数据卷,不可恢复,执行前请确认已经备份;最后删除源配置文件。rm -rf 是高危命令,请核对路径后再执行。
十四、常见问题
提示 No match for argument: docker-ce
通常是软件源没有配置好或缓存没有刷新。检查 /etc/yum.repos.d/docker-ce.repo 是否存在,再执行 sudo dnf makecache 后重试。
拉取镜像一直超时
优先检查镜像加速器是否配置并重启了 Docker;若使用的是已停服的公共加速地址,请更换为可用的专属加速地址或代理。
GPG 或 repomd 校验失败
系统时间偏差会导致签名校验失败。用 timedatectl 查看并校正系统时间,再执行 sudo dnf makecache。
普通用户执行 docker 报 permission denied
通常是当前用户不在 docker 组。执行 sudo usermod -aG docker $USER 后注销重新登录,或使用 newgrp docker 让当前 shell 生效。
与 podman / 已有 containerd 冲突
CentOS Stream 9 默认提供 podman。docker 与 podman 一般可以共存,但如果 dnf 提示 containerd.io 与系统已装的 containerd 或 runc 冲突,按提示先移除冲突包再继续安装即可。
容器端口映射后外部仍无法访问
先确认容器确实监听在目标端口(docker ps 查看端口映射),再检查 firewalld 和云平台安全组。Docker 通常会自行管理 iptables/nftables 规则,正常情况下无需手动放行,但被主机防火墙策略覆盖时可按需放行对应端口。
docker compose 与旧版 docker-compose 的区别
本文安装的是 Compose v2 插件,用法是 docker compose(中间是空格)。旧的独立二进制是 docker-compose(中间是连字符),两者命令基本兼容,但新版本统一使用 docker compose。
官方文档
- Docker 官方文档:在 CentOS 上安装 Docker Engine
- Docker 官方文档:Linux 安装后配置
- Docker 官方文档:daemon.json 配置参考
- Docker 官方文档:镜像加速 registry-mirrors
- 阿里云容器镜像服务
命令和配置依据 Docker 官方文档整理,核对日期:2026 年 10 月 12 日。软件源、镜像加速地址和客户端界面可能更新,具体以当前官方页面为准。