news 2026/10/6 13:34:50

CentOS 7 安装 Docker 全攻略:核心概念与排坑实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CentOS 7 安装 Docker 全攻略:核心概念与排坑实战

最近有个朋友学 Docker,折腾了一个周末,最后卡在 CentOS 上怎么装都装不对,不是 yum 源 404,就是服务起不来。他感慨:"网上教程怎么没说这些前置条件?"其实不是教程没说,而是很多文章默认你对 Linux 生态、软件源、权限体系已经有一定了解,但新手恰恰缺的就是这部分。这篇作为 Docker 入门到实战系列的第一篇,我就把 Docker 的核心概念和 CentOS 安装配置一次性讲透,不跳步、不留坑,适合完全没接触过容器、想从零开始搭起一套能用 Docker 环境的人。

1. 先把环境选对:为什么这篇教程用 CentOS 7 而不是 8 或 Stream

1.1 版本那么多,选 CentOS 7.9 的理由很现实

现在你搜 CentOS,能看到一堆版本:CentOS 7、CentOS 8、CentOS Stream、Rocky Linux、AlmaLinux。对入门者来说,我建议直接把焦点放在 CentOS 7.9 上。

原因很朴素:教程资源最多,踩坑的人最多,你遇到问题时搜到的解决方案也最完整。CentOS 8 在 2021 年就已经停止维护了,官方仓库很多东西已经失效;CentOS Stream 是滚动发布版本,适合想要尝鲜或者做上游开发的人,不适合求稳的学习环境。虽然 CentOS 7 的常规维护也在 2024 年 6 月到期,但它存量极大,各云厂商和镜像站都保留了完整的软件包,而且 Docker 官方对 CentOS 7 的支持文档非常详细。对一个学习环境来说,稳定、资料多、别人趟过坑,比"版本够新"重要得多。

提示:如果你的公司环境已经全面转向 Rocky Linux 或 AlmaLinux,那也可以按本文思路操作,命令几乎一致。但个人学习,我不建议一上来就追新版本,把精力浪费在"这个软件源为什么变了"上。

1.2 虚拟机里的基础配置和系统版本确认

学习 Docker 最推荐的方式是装一台 Linux 虚拟机。VMware Workstation 或 VirtualBox 都行,我用的是 VMware,配置如下:

  • CPU:2 核
  • 内存:4 GB(Docker 跑几个小容器完全够用)
  • 磁盘:默认 20 GB,建议后面需要再扩容
  • 网络:NAT 模式
  • 系统镜像:CentOS-7-x86_64-Minimal-2009.iso

安装时选最小化安装(Minimal),不需要图形界面,Docker 本身就是一个命令行工具,图形界面只会增加无意义的负担。

如果手头已经有一台 CentOS 机器,先确认一下版本和架构:

cat /etc/redhat-release uname -m

正常情况下你应该看到CentOS Linux release 7.9.2009 (Core)和x86_64。这里的架构信息很关键,后面配置 Docker 软件源的时候,仓库地址里会有x86_64或aarch64的区分,搞错了排查半天都找不出毛病。

另外提醒一句:如果你打算在虚拟机上长期学习,装完系统后第一时间做好快照。安装 Docker 过程中万一搞坏了系统,恢复起来也就是一分钟的事。

2. Docker 到底解决了什么问题:镜像、容器、仓库一次讲透

2.1 镜像:不是"安装包",而是"只读模板 + 分层图纸"

很多人第一次接触 Docker,会把镜像理解成"安装程序"。这样理解不算错,但不准确。一个镜像更像是一套完整的只读模板,里面包含了操作系统的基础文件、运行环境、应用代码和启动命令。比如mysql:8.0这个镜像,底层是精简版 Linux,上面叠了 MySQL 的整个运行环境,你不需要再单独装一遍依赖。

Docker 镜像还有一个核心设计:分层存储。一个镜像由很多只读层叠加而成,每一层代表 Dockerfile 里的一条指令。拉取新镜像时,如果某些层已经在本地存在,就不会重复下载。这就像盖楼,地基和框架都在,你只是想换个户型,就不用把整栋楼推倒重建。后面你写 Dockerfile 时会深刻体会到分层带来的好处——稍微改一点配置,重新构建时只需重新下载变化的层,速度会快很多。

2.2 容器:镜像的"运行状态",同一个模板可以跑出无数个实例

镜像是静态的,跑起来之后就叫容器。你可以把镜像理解成一张菜谱,容器是照着菜谱做出来的菜;也可以把镜像理解成一条生产线,容器是这条生产线上下来的产品。

每次docker run都会基于镜像创建出一个新的容器,容器之间相互隔离,拥有独立的文件系统、进程空间和网络环境。容器内部可以读写文件、启动进程,但写操作都发生在容器最上层的可写层,不会污染镜像本身。

有一点必须强调:容器是可写但非持久的。当你删除一个容器,里面修改的文件、写入的数据就全没了。这是新手第一个容易栽跟头的地方——过几天你会发现 MySQL 容器删了重建,数据全丢了。解决办法是数据卷(Volume)或绑定挂载,后面系列专门讲,但你现在就要有这个意识。

常用的容器操作命令可以先了解一下:

docker run -it --name test-centos centos:7 /bin/bash docker ps -a docker start test-centos docker exec -it test-centos /bin/bash docker rm test-centos

run是创建并启动,ps是查看运行中的容器,ps -a是把已经停止的一起列出来。你只需要记住:run相当于"创建 + 启动",exec是"进入一个正在跑的容器内部"。

2.3 仓库:镜像的"应用商店"

镜像从哪里来?从仓库来。Docker 仓库就是集中存放镜像的地方,最常用的是 Docker Hub,你可以把它想象成 GitHub 的应用商店版。

拉取一个镜像的命令是:

docker pull centos:7

这里centos是镜像名,7是标签(tag),表示版本。默认情况下会从 Docker Hub 拉取。

你自己写好的镜像也可以推到仓库里,供别人使用,或者搭一个私有仓库供团队内部共享。国内各云厂商也提供了镜像仓库服务,比如阿里云容器镜像服务、华为云 SWR,后面讲部署和加速时会用到。

仓库是 Docker 生态的"流通环节",镜像通过仓库分发,容器通过镜像创建,三者关系可以总结成一句话:从仓库拉镜像,用镜像跑容器。

2.4 打断一下认知:容器不是"轻量级虚拟机"

这个概念必须掰开揉碎说清楚,因为绝大多数入门者都会按虚拟机那套逻辑理解容器。

虚拟机里有完整的客户操作系统(Guest OS),虚拟化层模拟了 CPU、内存、硬盘,每个虚拟机背后都有一个独立的操作系统内核。而容器共享宿主机内核,它只是把进程、文件系统、网络做了隔离。

这意味着什么?意味着你在 CentOS 宿主上跑一个 Ubuntu 容器,容器里的用户态工具是 Ubuntu 的,但底层内核还是 CentOS 宿主机的内核。所以你不能在一个 Linux 容器里跑 Windows,也不能指望容器解决"换内核"的需求。容器能做的是:让不同的应用环境互不干扰地跑在同一台机器上,把运行环境的差异通通封装起来,从而实现"一次构建,到处运行"。

这个区别带来两个直接结果:容器启动是秒级的,虚拟机是分钟级的;容器对资源的消耗远小于虚拟机。这也是为什么一台 4 GB 内存的机器可以跑十几个容器,但撑不起三四个虚拟机。

对比维度虚拟机容器
隔离级别硬件级虚拟化操作系统进程级隔离
内核每个 VM 独立内核共享宿主机内核
启动时间通常几十秒到几分钟秒级
资源占用GB 级MB 级
表现形式完整操作系统隔离进程环境

3. CentOS 7 上安装 Docker 的完整实操记录

3.1 先清理旧版本,避免命令冲突

CentOS 系统本身可能会带一个名为docker或docker-client的包,那是老版本的 Docker(也叫 docker-engine)。如果你之前还装过一些乱七八糟的源,最好先做一次清理:

yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine

执行之后如果提示No Match for argument之类的东西,说明本来就没装过,直接忽略,不影响后续流程。这一步的意义在于:避免旧的可执行文件和新的 docker-ce 冲突,也避免系统中残留旧版的启动脚本干扰 systemd 服务。

3.2 配置 Docker 软件源:为什么不用官方源

安装 Docker 最正规的方式是通过 yum 软件源安装。方式有两种:官方源和镜像源。官方源的地址是download.docker.com,对不少网络环境来说连接不稳定,yum makecache时经常卡死。我建议直接用阿里云镜像源,速度快且稳定,完全符合官方仓库的结构。

先安装 yum 的配置工具:

yum install -y yum-utils

然后添加 Docker 官方仓库(但把地址换成镜像站):

yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

这里有一个隐藏的坑:阿里云镜像源的 repo 文件里,下载路径默认指向download.docker.com,如果直接yum install,仍然会走慢速的官方地址。所以加完仓库后要顺手做一个路径替换:

sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

然后再刷新缓存:

yum makecache fast

为什么要做sed替换?因为源文件里写的是官方域名,我们加交互式安装时 docker-ce 软件包实际下载地址会去官方域名拉,你不替换的话速度依然上不去。这一步看似不起眼,却是很多人配置完源之后安装仍然巨慢的根本原因。

提示:如果你的 CentOS 7 版本比较老,或者已经过了维护周期,基础 yum 源可能失效。这时候需要把CentOS-Base.repo里的mirrorlist和baseurl切到镜像站的 vault 目录,否则后续连yum-utils都可能装不上。

3.3 安装 docker-ce 并启动

依赖清理完、源配置好之后,安装就很简单了:

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

加上docker-buildx-plugin和docker-compose-plugin会更好,尤其是 compose 插件,后面编排多容器时几乎必用:

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

装完后启动服务并设置开机自启:

systemctl enable --now docker

注意:enable --now是"设置开机自启 + 立即启动"的合体写法,不用分两步。启动完成后查看状态:

systemctl status docker

如果看到Active: active (running),说明服务起来了。接下来用版本信息验证一下核心组件:

docker version

这个命令会显示 Client 和 Server 两部分信息。如果 Server 部分报错或者没显示,说明 daemon 有问题,后面第 5 节专门说。

3.4 第一个容器:跑一个 hello-world

验证 Docker 能不能正常拉取和运行镜像,经典做法是跑 hello-world 镜像:

docker run hello-world

正常情况下第一次会从 Docker Hub 拉取镜像,然后输出一段欢迎文字。这个镜像本身是一个极小的程序,拉下来之后运行、打印提示、然后退出。

如果你发现执行后在Pulling from library/hello-world这一步无限卡住,或者报net/http: TLS handshake timeout,那就是网络拉不到 Docker Hub。解决办法我在第 4.2 节详细说,现在先记住:拉不下来不代表 Docker 没装好,只代表网络不顺畅。

4. 安装成功后的三个关键配置,不做后面寸步难行

4.1 让当前用户免 sudo 直接运行 docker

刚装完 Docker,你执行docker ps大概率会看到:

Got permission denied while trying to connect to the Docker daemon socket

原因很简单:/var/run/docker.sock这个 socket 文件默认 root 所有,而你的普通用户没有访问权限。解决方案是把当前用户加入docker组:

sudo usermod -aG docker $USER

执行完之后需要重新登录会话才生效。如果你不想退出系统,可以用newgrp docker临时切换到新的组上下文,然后再执行docker ps验证。

newgrp docker docker ps

从安全角度多说一句:把用户加入docker组,基本等同于授予该用户 root 级别的能力,因为 Docker 可以挂载任意目录到容器里,从而以 root 权限读写宿主机文件。在自己的学习机器上没问题,但在多人共用的生产服务器上一定要慎重。

4.2 配置镜像加速:国内环境使用 Docker 的必修课

Docker Hub 的默认下载速度在国内经常让人怀疑人生。解决办法是给 Docker daemon 配置registry-mirrors,让它从镜像加速站拉取镜像。

编辑 daemon 配置文件:

vim /etc/docker/daemon.json

写入如下内容:

{ "registry-mirrors": [ "https://docker.m.daocloud.io" ] }

在不同云厂商的机器上,建议使用对应控制台提供的加速地址,比如阿里云容器镜像服务的专属地址,格式通常是https://xxxx.mirror.aliyuncs.com。这类专属地址需要登录控制台获取,好处是对网络环境适配更好。

写完配置文件后重启 Docker:

systemctl daemon-reload systemctl restart docker

可以用下面命令确认加速是否生效:

docker info | grep -A 1 "Registry Mirrors"

如果你看到列出的镜像地址,说明已经生效。这时候再跑docker run hello-world,拉取速度会有质的提升。

注意:daemon.json不是只能写registry-mirrors一个键,后面配置数据卷存储、日志大小限制、网络模式时都会往文件里加内容。一定要保证 JSON 格式正确,一个多余逗号都会导致 Docker 服务起不来。

4.3 确认开机自启和防火墙策略

虽然前面用了systemctl enable --now docker,但安装完最好再确认一次自启状态:

systemctl list-unit-files | grep docker

看到docker.service enabled就说明没问题。

防火墙这块,如果你的 CentOS 开了 firewalld 并且打算从外部访问容器端口,需要提前放行端口。比如后面我们用 Docker 跑一个 Nginx,访问宿主机 80 端口:

firewall-cmd --permanent --add-port=80/tcp firewall-cmd --reload

不过在你本机虚拟机的学习环境里,如果只是 SSH 登录操作,一般不用特意开端口。这一点遇到具体场景再处理,不用焦虑,先知道有这个概念就行。

5. 新手排坑实录:安装阶段最常见的五个问题

5.1 yum 找不到 docker-ce 软件包,或安装时报 404

这个坑的典型表现是:

No package docker-ce available. Error: Nothing to do

排查顺序有三步。第一,确认你用的仓库文件是 docker-ce.repo 而不是旧的 docker.repo,如果之前手动建过 docker.repo,先删掉。第二,执行yum clean all && yum makecache fast,把缓存清掉再试,很多新增的软件包信息会因为缓存没刷新而看不到。第三,确认内核架构和仓库地址匹配。

还有一种特殊情况:CentOS 7 EOL 后,yum 基础源如果还指向官方 mirrorlist,会报一堆 404 或超时。解决办法是把/etc/yum.repos.d/下的CentOS-Base.repo改指向镜像站的 vault 路径。如果你是 aarch64 架构(比如飞腾、鲲鹏服务器),务必要确认baseurl里的架构是aarch64,网络上的教程很多只讲 x86_64,生搬硬套必然出错。

5.2 服务起不来:Cannot connect to the Docker daemon

执行任何 docker 命令,报Cannot connect to the Docker daemon at unix:///var/run/docker.sock,第一反应不要重新安装,先把服务状态拉出来看:

systemctl status docker journalctl -xe

最常见的两个原因,一个是服务没启动,另一个是daemon.json写坏了。尤其是你刚配置了镜像加速就重启失败,大概率是 JSON 语法错误——多写了一个逗号、引号没闭合,这类低级错误经常发生。

验证方法也简单:先临时移走 daemon.json:

mv /etc/docker/daemon.json /etc/docker/daemon.json.bak systemctl start docker

如果能启动,就说明问题出在配置文件里,仔细检查 JSON 再放回去。用python -m json.tool /etc/docker/daemon.json可以快速校验格式正确性。

5.3 权限不足:Got permission denied

这个问题我在 4.1 已经解决过。真正容易忽略的点是:用户加入docker组之后,已经打开的终端不会自动刷新组权限,你需要重新登录或者用newgrp docker切一下。很多新手在 usermod 之后发现还是报权限错误,就以为是命令没生效,实际上只是没有重新加载会话。

5.4 Windows 上提示 Virtualization support not detected

这个报错通常出现在 Windows 环境安装 Docker Desktop 时,提示Docker Desktop failed to start because virtualisation support wasn't detected。虽然我们这次是在 CentOS 里安装,但如果你是用 Windows 主机跑虚拟机,遇到这个提示时不要慌,顺序排查:

  1. 重启进 BIOS,开启 CPU 虚拟化(Intel VT-x 或 AMD-V)
  2. 在 VMware 或 VirtualBox 中,确认虚拟机设置里勾选了虚拟化引擎选项
  3. Windows 的 Hyper-V、WSL2 功能是否启用

回到我们的场景:在 CentOS 虚拟机里跑 Docker 容器,本身不需要额外的硬件虚拟化支持,因为容器共享宿主内核。但如果宿主机的 VT-x 被关闭,虚拟机的 Linux 内核在运行部分功能时会受限。看到这个提示,先别怀疑 CentOS 出了问题,去宿主机 BIOS 里看一眼。

5.5 docker run hello-world 卡住半天,怎么判断是网络还是服务问题

很多人第一次跑 hello-world 卡住,会误以为 Docker 没装好。判断方法很简单:卡住时另开一个终端,执行docker pull hello-world,如果能走进度条说明网络在正常拉取,只是慢;如果一直转圈或者报 TLS 超时,说明是网络问题,去配置镜像加速。

拉下来之后再次执行docker run hello-world,你就能看到完整的输出了。这一步跑通,说明从仓库到镜像再到容器的链路全部打通,你的 Docker 环境才算真正可用了。

最后分享一个实际运维中积累的经验:装完之后别急着跑业务容器,先花两分钟执行docker info,把 Storage Driver、Registry Mirrors、Docker Root Dir 这三项看明白。这三个信息能帮你在未来排查集群问题、磁盘占用问题时快速定位方向。本系列后续篇幅会继续讲镜像管理、数据卷和容器网络,到时候你会发现,概念和安装这关过了,后面的内容上手会快得多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 13:34:28

MySQL多表查询实战:JOIN、子查询与性能优化全解析

做后端开发的兄弟基本都绕不开MySQL,业务一复杂,单表查询根本撑不住场面。订单要关联用户,商品要关联分类,报表要从三四张表里捞数据,这时候多表查询就是基本功中的基本功。网上关于多表查询的教程一搜一大把&#xff…

作者头像 李华
网站建设 2026/10/6 13:34:00

SF授权系统源码V3.7全开源无加密:授权码生成校验与安全加固实战

简介:这是一套面向授权站搭建者与程序开发者的SF授权系统源码,版本为V3.7,全开源无加密,适合希望自建授权平台、开展副站长或合作商分站运营的技术人员。源码基于layuiadmin框架开发,集成盗版入库、快捷登录、易支付认…

作者头像 李华
网站建设 2026/10/6 13:33:25

基于HTML5的响应式网站设计与实现:从布局到避坑的完整指南

简介:这是一份基于HTML5的响应式网站设计与实现方向的完整毕业论文正文,面向计算机相关专业的毕业生以及需要了解响应式建站流程的前端开发者。文档以企业官网为应用场景,系统梳理了HTML5、CSS3、JavaScript技术组合,配合Eclipse开…

作者头像 李华
网站建设 2026/10/6 13:33:16

Agent-Reach:量化智能体触达能力的评估框架与实践

1. 为什么需要“Agent-Reach”:从“能做”到“够得着”做智能体(Agent)开发这大半年,我最大的感受是:模型能力早就不是瓶颈了,真正卡脖子的是“触达”。你可能已经有一套基于大模型的Agent框架,…

作者头像 李华
网站建设 2026/10/6 13:33:08

信道与频率到底是什么关系?从电磁波传播到频谱规划全解析

搞无线通信的,不管你是做系统设计、射频前端还是网优,迟早都要面对同一个问题:信道和频率到底是什么关系。我入行头几年一直觉得这就是个“查表”的活儿——频段定好了、信道参数照着填就行。后来开始自己拉链路预算、跑现场测试、在城中村楼…

作者头像 李华
网站建设 2026/10/6 13:33:07

C语言读取文件指定内容:API选型、定位策略与实战解析

开头部分我要用场景切入:日志里有大量数据,但要的是每个"ERROR"后面的第一行内容;配置文件里一堆参数,但程序启动只关心某一个key。我相信干过C语言文件处理的,都遇到过这种问题。文件的打开、读取本身不难&…

作者头像 李华