☰
CentOS 7 安装 Docker CE 完整指南:五步流程与核心原理
2026/10/22 13:49:24 网站建设 项目流程

1. 安装前的准备与系统自检

1.1 先确认版本、内核和架构,别在第一步就翻车

我第一次给服务器装 Docker CE 的时候,上来就敲 yum install,结果一堆依赖报错,折腾半小时才发现系统架构和内核都有讲究。现在我会先花两分钟做一次自检,真的能省下后面大量排错时间。

先看系统版本:

cat /etc/redhat-release

正常情况下你会看到CentOS Linux release 7.x这样的输出。如果这里显示的是 CentOS 6 或者其他版本,那后续步骤就不要照抄了,Docker 官方只对 CentOS 7 提供这套 yum 仓库的完整支持,6 的用法完全不同。

再看内核版本:

uname -r

CentOS 7 的标准内核是3.10.0-xxx.el7.x86_64这个系列。Docker 官方要求 CentOS 7 的内核版本必须大于等于 3.10,因为容器的隔离、资源限制、文件系统挂载这些底层能力都依赖内核特性:namespace、cgroup、overlay 文件系统。3.10 内核虽然看起来老,但 CentOS 7 的后续维护一直在给这个内核线打补丁,所以官方才放心支持。

然后是架构:

uname -m

必须是x86_64。原因不复杂,Docker CE 的 rpm 安装包官方只提供 64 位版本,你拿一台 32 位的老机器来折腾,仓库里根本找不到可用的包。

最后确认当前用户权限。安装过程需要写系统目录、管理系统服务,最省事的做法是直接使用 root。如果你是用普通用户登录,那就通过sudo -i切换到 root,或者保证你能对每条命令都加 sudo。我见过有人用普通用户装到一半,因为一个写权限报错卡半天,后来发现就是没切 root。

1.2 卸载旧 Docker 包,避免文件冲突

这是整个安装流程里最容易被忽略的一步,也是新手最容易踩的坑。很多 CentOS 7 机器自带或者之前被人装过老版本的 Docker 相关软件包,比如docker、docker-io、docker-engine这些名字的产品。它们和 Docker CE 在文件层面是会冲突的,直接装新版本,yum 大概率会给你弹出一堆 "file conflicts" 错误。

用下面这条命令先检查系统里已有的容器软件包:

yum list installed | grep -E "docker|container"

只要看到输出里有 docker 相关的包,不管版本多旧,建议先清理掉:

yum remove docker docker-client docker-common docker-engine

这里有一个注意事项:卸载老包不会自动删除/var/lib/docker目录下的容器和镜像数据。如果你是做全新部署,这个目录清不清都无所谓;如果只是想在老机器上升级替换,那卸载完别急着删数据,后面装好新版 Docker,旧数据通常还能接着用。但如果你在跑着生产容器,卸载前一定先确认业务可中断、数据有备份,别图省事直接梭哈。

1.3 检查网络和系统时间

这一步很多人完全没意识到。yum 安装要访问远程软件仓库,如果你的服务器 DNS 配置有问题,或者到仓库的网络不通,后面每一步都会卡住。建议安装前先跑一次:

yum repolist

这条命令能输出当前配置的软件源列表,如果卡住不动或者报错,优先排查网络。另外,系统时间也很容易出问题,如果时间偏差太大,yum 在下载和校验 GPG 签名时会报证书相关错误,因为 SSL 证书有效期的判断依赖系统时间。检查一下:

date

如果时间不对,用 ntp 服务同步一下再继续。这些事情虽然看起来和 Docker 安装没什么直接关系,但踩一次坑你就知道有多难受了。

2. 五步安装 Docker CE 完整命令流程

2.1 第一步:安装 yum-utils 工具包

五步里的第一步,是给 yum 补充一个管理软件源的扩展工具集。

yum install -y yum-utils

为什么先装它?因为后面添加 Docker 仓库时要用到一个名为yum-config-manager的命令,这个命令就来自 yum-utils 工具集。没有它,添加软件源就只能手动去编辑/etc/yum.repos.d/目录下的 repo 文件,操作起来麻烦且容易写错格式。装了 yum-utils,后面一句命令就能把仓库配置得明明白白。

安装过程会拉取几个基础依赖包,比如 python 相关的库。这些都是正常的,看到Complete!字样就说明装好了。装完后可以顺手验证一下:

which yum-config-manager

如果有路径输出,说明工具已经就位。

2.2 第二步:添加 Docker CE 官方软件仓库

这是整套流程里的关键动作。执行下面的命令,把 Docker 官方的仓库地址加入系统配置:

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

这条命令做了什么?简单说,它把 Docker 官方提供的仓库配置文件下载下来,放到了系统软件源目录里。你可以查看一下实际生成的配置:

cat /etc/yum.repos.d/docker-ce.repo

文件里配置了仓库地址、GPG 校验密钥等信息。Docker 官方源里的包会随着版本迭代不断更新,后续你升级 Docker 时,yum 也是从这个源里拉取。

这里有一个网络环境的现实问题:官方域名在部分国内网络环境下访问速度不理想。如果后续安装或拉取镜像时明显感觉卡顿,可以换成国内大厂维护的同步源,具体做法是修改仓库文件里的 baseurl 字段,把域名替换成你选定的镜像站地址。很多云平台都提供这种基础软件的镜像同步服务,在你用得最顺手的平台文档里一般都能找到地址。

添加完仓库后,建议刷新一次 yum 缓存:

yum makecache

这相当于把新仓库的软件列表拉到本地,之后安装时 yum 才能知道有哪些版本的 Docker CE 可选。

2.3 第三步:安装 docker-ce、docker-ce-cli 和 containerd.io

仓库就绪后,就可以正式安装 Docker CE 本体了。这一步我推荐的命令是:

yum install -y docker-ce docker-ce-cli containerd.io

很多人会问,为什么不像装普通软件一样只写docker-ce一个包?从依赖关系上来说,你只输入docker-ce,yum 也会自动帮你在仓库里找依赖,最终一样会拉入另外两个包。但显式把三个核心组件写出来,有几个好处:一是安装时你能清楚看到装了什么;二是 Docker 从某个版本开始把客户端和服务端拆成了独立包,哪怕将来客户端和服务端需要不同版本,也能分开管理;三是当 yum 因为某些依赖解析问题找不到包时,显式声明能更快定位问题。

三个组件的分工回头在原理部分详细展开,简单说就是:docker-ce是 Docker 守护进程主体,docker-ce-cli是你敲docker命令时用到的命令行客户端,containerd.io是底层的容器运行时管理组件。三者共同构成一套可用的 Docker CE 环境。

如果你对版本有特定要求,安装前可以查看仓库里有哪些版本可选:

yum list docker-ce --showduplicates

然后指定版本号安装:

yum install -y docker-ce-24.0.9 docker-ce-cli-24.0.9 containerd.io

安装过程会下载不少依赖,总体积可能有几百 MB,视网络情况等待一到几分钟都算正常。看到Complete!后,用下面这条命令检查包是否装齐:

rpm -qa | grep -E "docker-ce|containerd"

三个包都在列表里,这步才算完成。

2.4 第四步:启动 Docker 服务并设置开机自启

安装完成不代表 Docker 就能用了,你必须手动把守护进程拉起来。这一步我见过太多人漏掉,装完直接敲 docker 命令,结果报错说连接不上,还以为是安装出了问题。

启动命令:

systemctl start docker

CentOS 7 的初始系统是 systemd,所有服务都通过systemctl管理。start是启动,enable是设置开机自启。记住一句话:光 start 不 enable,服务器一重启,Docker 服务就回不来了。

所以紧接着执行:

systemctl enable docker

这条命令会在系统启动项里创建一个符号链接,以后开机时 systemd 会自动拉起 Docker。查看运行状态:

systemctl status docker

看到Active: active (running)就说明服务已经正常运行。这里Active字段是当前服务的活动状态,active后面括号里的 running 是真正运行的意思,两者同时满足才算启动成功。

2.5 第五步:验证安装并运行第一个容器

装完、启动完,还不算结束,验证这一步很多人同样容易跳过。我会用两条命令确认整套环境真的可用。

先看版本:

docker version

这条命令会输出两段信息:Client 段对应你敲命令的客户端,Server 段对应后台的 Docker 守护进程。特别要注意 Server 段有没有正常输出。如果只有 Client 段、没有 Server 段,说明守护进程没起来或者当前用户连不上守护进程,后面排查章节我会专门讲这个问题的处理方式。

再看能不能真的跑一个容器:

docker run hello-world

hello-world是一个极小的测试镜像,专门用来验证 Docker 安装是否成功。执行时如果本地没有该镜像,它会自动从 Docker Hub 拉取,然后运行一段欢迎提示。当你看到终端里出现 "Hello from Docker!" 字样,说明从客户端、守护进程、容器运行时到镜像拉取的全链路都已经通了。

到这一步,五步安装才真正意义上的完成。看到 hello-world 打印出来,比看再多教程都让人踏实。我自己的习惯是,每装好一台机器,至少跑一遍这个验证,确认没问题了才敢交付给后续使用。

2.6 可选优化:配置镜像加速器

五步已经结束,但实际使用中还有一个高频问题需要提前解决:从 Docker Hub 拉取镜像时,经常会出现超时或速度极慢的情况。尤其是第一次拉取那些动辄几百 MB 的镜像,慢到让人怀疑机器是不是坏了。

缓解方法很简单,找一个国内可用的镜像加速地址,写进 Docker 的配置文件/etc/docker/daemon.json:

vim /etc/docker/daemon.json

在里面写入:

{ "registry-mirrors": ["https://你选择的加速地址"] }

然后重启 Docker 让配置生效:

systemctl daemon-reload systemctl restart docker

验证配置是否生效:

docker info | grep -A 1 "Registry Mirrors"

配置了加速后,再拉取公共镜像的速度通常会有肉眼可见的提升。这里要提醒一句,daemon.json是严格的 JSON 格式,多一个逗号、少一个引号都可能让 Docker 守护进程直接起不来。每次改完这个文件,第一件事就是重启服务并马上检查状态。

3. 核心原理拆解:为什么要这样装

3.1 为什么不用 CentOS 自带仓库的 docker

很多刚接触的人会问,yum 仓库里不是本来就有 docker 包吗,为什么还要大费周章单独添加 Docker 官方源?这个问题我也曾经困惑过,后来对比过就明白了。

CentOS 7 自带仓库里的 docker 版本停留在 1.13 左右的远古版本,这个版本缺少大量现代容器特性,比如更完善的容器编排支持、更安全的镜像拉取机制、更新的存储驱动支持。而且这个版本已经停止功能迭代,用它做新项目,迟早要踩到不兼容的坑。

Docker CE 官方源则跟着上游版本持续更新,当前稳定版本线已经远超自带仓库里的旧版本。你用官方源装的 Docker CE,后续只需要一条yum update命令就能升级到新版本,不需要重新手动折腾。从运维角度看,软件源统一、升级路径清晰这两点就已经值回那一步额外操作了。

3.2 三个核心组件的依赖关系

装 Docker CE 时会一次性拉入三个核心包,很多人并不清楚它们各自到底负责什么。我用一个通俗的类比来解释。

把 Docker 的系统想象成一家餐厅。docker-ce是前台,负责接待你的命令请求,比如你喊一声"给我开一个容器",前台就照单处理。containerd.io是后厨,负责把前台的订单变成实际操作,比如准备食材、安排灶台、控制烹饪流程。而更底层的组件则像灶台本身,真正执行进程调度、资源隔离这些粗活。

这个类比能解释清楚为什么三个组件缺一不可,也解释了为什么 Docker 从早年的单体架构演化成现在这种分层结构。组件拆分后,每一层都可以独立演进,比如 Kubernetes 这类容器编排系统可以不经过 Docker 的前台,直接跟 containerd 后厨打交道,整个体系灵活度大幅提升。

安装时让三者保持同一版本线的做法是最稳妥的,踩坑概率最低。

3.3 yum 仓库机制与 GPG 签名校验

yum 真正的安装能力不只是找到包、下载包、解压包,它还会处理依赖关系、检查软件包来源可信度。这里的关键就是仓库配置里的 GPG 校验。

当你打开/etc/yum.repos.d/docker-ce.repo这个文件,能看到gpgcheck=1这样的配置,它表示要求校验 rpm 包的签名。Docker 官方在发布包时会对包做数字签名,yum 安装时用仓库里配置的公钥去验证签名,只要签名对上,才能确认这个包确实来自官方且没有被篡改。

这也是为什么安装时间不正确会导致安装失败的原因:GPG 密钥本身有过期时间,而证书有效性判断依赖系统时间,时间错了验证就过不去。遇到这种报错,把系统时间用 ntp 同步准确,再yum clean all清掉缓存,重新安装通常就好了。

理解这套机制后,就不容易在安装报错时瞎猜了。

3.4 存储驱动 overlay2

安装完成后,可以用docker info查看当前 Docker 使用的存储驱动,CentOS 7 下正常情况下会显示overlay2。存储驱动决定了镜像层数据在磁盘上怎么组织、容器读写文件时性能表现如何。

overlay2 是 Docker 官方从很多存储方案里选出来的通用方案,它的优势在于支持层叠文件系统,镜像的每个层都可以共享底层数据,拉取新镜像时复用已有层,能省下不少磁盘空间。容器写入时只在最上层做修改,底层镜像不会被动到,所以多个容器用同一个镜像启动时,磁盘消耗远小于各复制一份,这个特性在生产环境很有价值。

CentOS 7 的默认文件系统通常是 XFS,而 XFS 必须开启ftype=1的花生元数据特性才能被 overlay2 正常使用。如果你用的是 CentOS 7 标准安装,格式化时一般都会带这个参数,报错概率很小;但如果你用的是某些特殊定制的系统镜像,格式化分区的时候没带这个特性,后面挂载容器层就可能会报类似 "filesystem on /var/lib/docker" 的错误,定位到这种问题时,最干净的处理是备份数据后重新格式化/var分区。

4. 高频报错与排障实录

以下内容是我在多次安装 Docker CE 过程中真实遇到过的典型问题,每一条基本都有对应的解析和解决路径。

4.1 yum 报错找不到 docker-ce 包

报错特征:执行安装命令后提示No package docker-ce available。

原因分析:最常见的情况是 Docker 仓库没有实际添加成功,或者添加之后没有刷新缓存。yum 还没有把这个新仓库的软件列表读入本地缓存,它当然不知道 docker-ce 的存在。

解决办法:重新执行yum-config-manager --add-repo命令,然后立刻执行:

yum clean all yum makecache

清掉缓存并重建后,再安装一次。如果仍然提示找不到包,检查 repo 文件里的 baseurl 地址是否能访问,用 curl 试一下仓库目录返回值。有时候你从教程里复制了别人自定义的加速源地址,而那个源本身已经失效,也会导致这个问题。

4.2 docker run 报错 Cannot connect to the Docker daemon

报错特征:docker run hello-world时报类似Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?的错误。

原因分析:绝大多数情况是 Docker 守护进程还没启动。安装步骤一过、服务一跳,就急着敲 docker 命令,自然连不上。另一种情况是当前用户不在 docker 用户组里,导致没有权限访问 Docker 的 socket 文件。

解决办法:依次排查几步。首先是服务状态:

systemctl status docker

如果服务没起来,先systemctl start docker再重试。如果服务已经在 running 状态但你仍然报连接错误,那就检查当前用户权限:先看是不是 root,再看 socket 文件归属:

ls -l /var/run/docker.sock

如果这台机器上已有多用户要用 Docker,把当前用户加进 docker 组即可:

gpasswd -a 你的用户名 docker newgrp docker

加入用户组后,需要重新登录一次才会生效。最后一个排查方向是看守护进程是否异常崩溃了,用日志找线索:

journalctl -u docker -n 50

4.3 拉取镜像超时或一直 Retrying

报错特征:执行docker run hello-world或docker pull 某个镜像时,长时间卡在拉取阶段,最终报net/http: request canceled或context deadline exceeded。

原因分析:本质是到 Docker Hub 的网络链路不通畅或者速度太慢。Docker Hub 的服务部署在海外,国内环境访问经常不稳定。

解决办法:优先配置镜像加速器,具体的操作方法在前面 2.6 小节已经写过,这里不再重复。要强调一点,配置完加速后必须重启 Docker 服务,同时确认docker info里确实能看到 Registry Mirrors 地址。如果配置了还没生效,大概率是 daemon.json 写错了,先用docker info观察报错信息,再回头检查文件格式。

4.4 启动容器时报 overlay 挂载失败

报错特征:容器状态异常,日志里有类似failed to mount overlay ... operation not permitted的信息。

原因分析:系统的 overlay 内核模块没有正常加载,或者 Surgeon 存储驱动所需要的特性不被当前文件系统支持。

解决办法:先检查模块是否加载:

lsmod | grep overlay

没有输出就手动加载:

modprobe overlay

如果希望重启后自动加载,可以写进模块配置文件中,在/etc/modules-load.d/目录下新建一个配置文件,写入overlay字样。如果你确认模块已经加载但依然报错,那就回到 3.4 小节提到的 XFS ftype 问题,这个场景下优先检查/var/lib/docker所在分区的挂载参数。

4.5 容器内挂载文件权限受限或被拦截

报错特征:容器启动后,访问挂载目录时出现Permission denied或类似Operation not permitted。

原因分析:这种情况在 CentOS 7 上很多和 SELinux 有关。SELinux 默认会限制节点进程对宿主目录的访问,而 Docker 的挂载卷在有些策略下没有自动放行。

解决办法:如果只是测试环境,临时放行可以跑:

setenforce 0

但这只是临时关闭,重启后又恢复。生产环境不建议直接关 SELinux,更好的思路是使用容器挂载时加入标签参数,或者在容器启动命令里显式声明--security-opt label=disable,让个别容器跳过安全策略限制。整体上还是建议查阅文献理解 label 规则,比一刀切更稳妥。

4.6 磁盘空间不足导致镜像层写入失败

报错特征:拉取镜像或启动容器时报no space left on device。

原因分析:Docker 的数据目录默认在/var/lib/docker,如果/var所在分区空间被占满,镜像层就写不进去。

解决办法:先查空间占用:

df -h /var docker system df

确认是空间不足后,可以清理不再使用的镜像和容器:

docker system prune -a

这里要提醒:这条命令会把所有未被使用的镜像、容器、网络、构建缓存一并清理掉,属于高危操作。执行前务必确认没有需要保留的东西。如果空间长期紧张,更治本的方案是把 Docker 数据目录迁移到数据盘,修改/etc/docker/daemon.json增加"data-root": "/data/docker"项,重启 Docker 完成迁移。

4.7 排障速查表

问题现象可能原因快速排查处理方向
找不到 docker-ce 包仓库未添加或缓存未刷新yum repolist | grep docker重新 add-repo,清理缓存
连接不到 docker daemon服务未启动或权限不足systemctl status docker启动服务或加入 docker 组
拉镜像超时源站网络不通docker info查看加速配置配置镜像加速并重启
overlay 挂载报错内核模块未加载lsmod | grep overlaymodprobe overlay
容器读写卷无权限SELinux 拦截getenforce配置标签或临时放行
no space left数据目录所在分区满df -h /var清理或迁移数据目录

5. 安装完成后的验证与日常维护

5.1 三层验证清单

装完之后,我不建议直接就把服务器拿去用,哪怕安装过程一切顺利。我会习惯性地按三层来做确认。

第一层,服务层。执行systemctl status docker,确认服务状态是 active running。这一步确认守护进程活着。

第二层,配置层。执行docker info,重点看几个字段:Server Version 是否是你期望的版本,Storage Driver 是否为 overlay2,Registry Mirrors 是否已经配置好。这一步确认运行参数是符合预期的。

第三层,功能层。执行docker run --rm hello-world,确认从客户端到守护进程到运行时到镜像拉取整条链路是通的。--rm参数让这个测试容器运行后自动删除,不会留垃圾。

这层验证做完,机器才算真正可用。强烈建议把这三条验证命令写成一个脚本,以后批量装完机器就统一执行一遍,省时省力。

5.2 升级与指定版本安装

日常版本升级只需要一条命令:

yum update docker-ce docker-ce-cli containerd.io

yum 会从仓库里找到当前可用的最新版本并进行升级。升级前需要注意,Docker 大版本升级往往伴随着配置格式和运行时的变化,比如存储驱动的默认值、网络管理的实现方式都可能调整。升级前最好看一眼发行说明,确认兼容性。

如果只是想给某台机器安装一个特定旧版本,用这个格式:

yum install docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io

版本号要能在这个仓库的历史列表中找到,太旧的版本如果仓库已经清理,是装不上的。

5.3 安全卸载与数据清理

最终有一天你需要从机器上移除 Docker,卸载命令是:

yum remove docker-ce docker-ce-cli containerd.io

但这里要特别提醒:卸载软件包不会自动删除镜像、容器、卷和网络配置,它们还静静躺在/var/lib/docker目录下。如果你要彻底清理,需要手动删目录:

rm -rf /var/lib/docker

这是一个绝对不可逆的操作,所有本地镜像和容器数据都会消失。如果你不确定机器上有没有正在使用的数据,先用docker ps -a和docker images看一遍。在有业务运行的机器上执行这操作之前,务必确认是否有备份。这条经验我想单独强调一下,因为我在某次测试环境里手一快删过整个目录,才知道什么叫追悔莫及。

安装、验证、维护、卸载,这一整套流程跑顺之后,CentOS 7 上装 Docker CE 就真的只是五步的事。我后来给公司新机器配装机脚本时,把这五步直接写成了一个自动化脚本,新机器开机自动执行,跑完自动发一份验证结果出来。如果你也在批量维护 CentOS 7 机器,强烈建议把这个流程沉淀下来,毕竟手动敲命令敲十次以上,谁都会想省点事。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询