最近帮一个客户那边整理服务器,一水儿的 CentOS 7 机器,Docker 环境全得手工搭。说实话,关于 CentOS 7 安装 Docker 的教程网上一抓一大把,但真到自己动手的时候,版本兼容、镜像源慢、存储驱动、内核补丁这些问题一个接一个冒出来。这篇文章就把我从零开始,在一台干净的 CentOS 7 上完整装好 Docker 的整个过程写透,包括安装方式怎么选、每一步命令为什么这么敲、踩过的坑和排查套路,给正在折腾的兄弟一个能直接照着抄作业的完整参考。
这篇内容适合谁看?第一类是生产环境还在用 CentOS 7 的运维,第二类是刚接触容器、想在 7 系机器上搭环境的开发,第三类纯粹想把老服务器盘活自己捣鼓着玩的人。不管你属于哪种,看完应该能避开我当年踩过的那一堆暗坑。
1. 安装前必读:CentOS 7 与 Docker 的兼容性真相
1.1 为什么要选 Docker CE 而不是 Docker EE
Docker 本身分两个大版本:EE 是面向企业的付费商业版,CE 是社区版,完全免费,功能上对绝大多数场景来说都够用。咱们在 CentOS 7 上装的都是 Docker CE,别一上来就纠结要不要付费版,没必要。
更关键的是版本线的问题。Docker 官方从 23.0 版本开始就移除了对 CentOS 7 和 RHEL 7 的官方支持。也就是说,不管你怎么折腾,CentOS 7 的软件源里能拉到的 docker-ce 最新版,也就停留在 20.10.x 这一代系列。这其实不是坏事,别再一门心思想着去装什么 Docker 26、27 的新版本,哪怕你手动把 rpm 包装上去了,底层依赖和内核接口也未必跟得上。20.10 这一代在 CentOS 7 上已经打磨得足够成熟,跑生产环境完全够用。
还有兄弟想用新版本容器运行时,那其实是往 containerd 或者 Podman 方向走,那是另一个话题。假设你现阶段就是要用 Docker,那 CentOS 7 上老老实实装 20.10 就是最优解。
1.2 安装前必须做的检查项
在动手敲命令之前,先把环境摸清楚,不然装到一半发现内核太低或者磁盘空间不够,那才叫尴尬。
第一件事看系统版本:
cat /etc/centos-releaseCentOS 7.6 以下的老版本,建议先用yum update -y把系统补丁打全再动 Docker。我之前在一台 7.2 的老机器上直接装 Docker,启动容器时各种内核相关的诡异报错,后来把系统基础包升级完就自然好了。
第二件事看内核版本:
uname -rDocker 官方要求内核 3.10 及以上,CentOS 7 默认就是 3.10,所以基本都满足。但注意,3.10 之后的小版本差别很大,比如 3.10.0-327 这种老内核跑 overlay2 存储驱动可能会有文件系统层的坑。个人建议内核至少是 3.10.0-1160 这个补丁级别,低于这个的先更新系统。
第三件事看磁盘和分区:
df -hDocker 默认把镜像和容器数据都存在 /var/lib/docker 下。如果你的根分区只有 20G,跑几个镜像就满了。生产环境建议给 /var 单独挂一块至少 50G 的分区,或者装完 Docker 后直接把>docker --version
如果输出旧版本信息,先记录一下,后面卸载流程里要用到。
2. 五种安装方式对比与选型
Docker 在 CentOS 7 上的装法不止一种,我把它归成四类主流方案:官方 yum 源在线装、国内镜像源在线装、离线 rpm 包装、官方脚本一把梭。选哪个取决于你的网络环境和上线要求。
2.1 官方 yum 源在线安装
官方 yum 源是最稳的一条路。通过 yum-config-manager 把 Docker 官方仓库加到 yum 源里,之后安装、升级、卸载全部走 yum 体系,跟系统包管理完美融合。你后续执行yum update时,docker-ce 也会跟着系统一起滚动更新,运维起来非常省心。
为什么我把它排第一?因为可控性最好。装了哪个版本、什么时候升级、依赖怎么处理,全部透明。出了问题,解决路径也最短,网上的排查案例也基本都是基于官方 yum 安装流程的。
2.2 阿里云镜像源加速安装
如果你的服务器在国内,访问官方源 download.docker.com 经常慢、超时甚至连接重置,那可以换成阿里云提供的 Docker 官方仓库镜像。它的配置方式和官方源一模一样,只是把 add-repo 的 URL 换掉而已。这里要先说清楚,镜像源不改变安装逻辑,它只是把软件仓库做了国内加速分发。对服务器在国内的同学来说,这是最实际的提速办法,后面全流程里我也会把这个作为主流程来讲。
2.3 离线安装(rpm 包方案)
有些内网机器完全不连外网,这种环境就得上离线安装。思路很朴素:在一台能联网的同版本 CentOS 7 机器上,把 docker-ce 以及所有关联的 rpm 包全部下载下来,拷到内网机器上,再用yum localinstall或者rpm -ivh安装。
离线安装的难点在于依赖收集。docker-ce、docker-ce-cli、containerd.io 三个主包,还要带上 yum-utils、device-mapper-persistent-data、lvm2、policycoreutils-python 一堆依赖包。直接用yumdownloader是不够的,它不会自动把依赖一起拉下来,我一般用repotrack来把依赖链整个拉完。
2.4 官方安装脚本(get.docker.com)
官方还提供了一个一键脚本:
curl -fsSL https://get.docker.com | bash它实际上干了配置源、装依赖、装 docker-ce 的一整套事,好处是快,适合临时测试的机器。坏处是不透明,脚本内容是在线执行的,你没法提前控制具体版本,而且它默认拉最新可用版本——对 CentOS 7 来说就是 20.10 的最新补丁,倒也没问题。
但生产环境我一般不推荐直接管道执行远程脚本。万一脚本内容被篡改,或者你压根不知道它在系统里动了哪些文件,出了问题很难排查。如果非要用脚本装,至少先把脚本 curl 下来人工过一遍再执行。
2.5 安装方式选型小结
| 安装方式 | 稳定性 | 可控性 | 网速要求 | 适合场景 |
|---|---|---|---|---|
| 官方 yum 源 | 高 | 高 | 海外网络较好 | 生产环境 |
| 阿里云镜像源 | 高 | 高 | 国内友好 | 国内生产/普通开发机 |
| 离线 rpm 包 | 高 | 高 | 无网络但需预下载 | 内网隔离环境 |
| 官方脚本 | 中 | 低 | 看源站 | 测试机、临时环境 |
如果你拿不准选哪个,就直接用我下面要讲的阿里云镜像源 yum 流程,这是国内场景下最平衡的选择。
3. 手把手实操:yum 源安装 Docker CE 全流程
这一节是整个教程的核心,我按照在干净机器上从零操作的顺序来写。所有命令都基于 root 用户执行,如果你用的是普通用户,记得每条命令前加 sudo。
3.1 先把旧版本清理干净
如果机器上之前装过 Docker 相关的包,先卸载再装新的,避免残留配置干扰:
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine这条命令里列出的包名是历代 Docker 版本遗留的命名,多敲一遍没坏处。如果机器上没有旧包,yum 会提示没有匹配的包,直接忽略继续往下走就行。
这里要特别提醒一点,卸载包并不会删除 /var/lib/docker 目录里的镜像和容器数据。如果你确定旧容器数据都不需要了,建议手动清一下,给新环境腾空间:
rm -rf /var/lib/docker但如果里面有你想留的数据卷,这条命令千万别执行,先备份再说。
注意:卸载不会动你的容器数据卷目录,别以为 yum remove 完就全干净了。要清 /var/lib/docker 需要自己手动操作,而且操作前一定要确认数据真的没用了。
3.2 安装依赖工具
接下来安装 yum 扩展工具链:
yum install -y yum-utils device-mapper-persistent-data lvm2这三个包各司其职。yum-utils 提供后面的 yum-config-manager 命令,负责把 Docker 仓库写进 yum 配置。device-mapper-persistent-data 和 lvm2 是当年 devicemapper 存储驱动要用的。现在 Docker 默认存储驱动已经是 overlay2,这两个依赖主要是兼容历史配置,但官方安装文档仍然要求装,那就装,没坏处。
3.3 配置 Docker 仓库
用 yum-config-manager 把 Docker 官方仓库加进来:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo如果你的服务器访问 download.docker.com 很慢,直接换成阿里云镜像仓库:
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo两条命令的效果都一样,都是往 /etc/yum.repos.d/ 下写一个 docker-ce.repo 文件。加完仓库后执行:
yum makecache fast刷新一下软件源缓存,让 yum 识别到新仓库里的包列表。
3.4 安装 Docker CE 及配套组件
现在正式安装:
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这几个包分别是什么作用?docker-ce 是 Docker 引擎主体,docker-ce-cli 是 docker 命令行工具,containerd.io 是容器运行时层,这三个是必须的。docker-buildx-plugin 和 docker-compose-plugin 是官方插件,前者提供多架构镜像构建能力,后者让 Docker Compose 可以直接通过docker compose子命令来用。建议一起装上,省得后面要用再补。
如果你的软件源里没有 docker-compose-plugin 这个包,安装时报 package not found,可以先跳过它,主流程不受任何影响,以后要用 Compose 了再手动装单独的 docker-compose 二进制文件。
装完验证一下命令行工具:
docker --version能看到Docker version 20.10.x说明引擎工具已经就位了。但注意,这还只是第一步,服务没启动。
3.5 配置镜像加速器
这里说的镜像加速器,是指配置在 Docker 客户端里的 registry mirror,作用是让 docker pull 时从国内节点拉取镜像。这一步对国内服务器来说几乎是必须的。不配置也能拉,但速度会让你怀疑人生,几十 G 的大镜像等半天是常事。
先创建配置目录:
mkdir -p /etc/docker vim /etc/docker/daemon.json写入如下内容:
{ "registry-mirrors": ["https://<你的专属加速地址>.mirror.aliyuncs.com"] }这个专属加速地址需要你在阿里云控制台的容器镜像服务页面里找,每个账号分配的地址不同,注册阿里云账号后就能看到。如果你没有阿里云账号,也可以找其他公共 Docker 镜像加速站,但稳定性和速度我就不敢保证了。
写完保存,重启 Docker 让配置生效:
systemctl daemon-reload systemctl restart docker顺便说一下,daemon.json 是 Docker 守护进程的总配置文件,除了 registry-mirrors,还有>systemctl start docker systemctl enable docker
检查服务状态:
systemctl status docker看到 active (running) 就说明引擎已经起来了。再用最经典的方式做一次端到端验证:
docker run hello-world这个命令会先从配置的镜像源拉取 hello-world 测试镜像,然后在容器里输出一段欢迎信息。看到Hello from Docker!就说明整套环境真的通了。如果你配置了加速器,拉取过程应该几秒钟内就完成,完全感受不到卡顿。
4. 配置 Docker 开机自启与常用命令
装完能用只是第一步,真要投入日常使用,还得把服务管理、常用命令和权限问题搞明白。
4.1 systemd 管理 Docker 服务
Docker 装好后就自动注册成了系统服务,CentOS 7 里服务管理全靠 systemd。几个高频操作用法如下:
systemctl start docker # 启动 systemctl stop docker # 停止 systemctl restart docker # 重启 systemctl enable docker # 开机自启 systemctl status docker # 查看状态注意,改完 daemon.json 之后,比较稳妥的做法是执行systemctl daemon-reload再 restart。虽然严格说 daemon.json 是 Docker 守护进程自己读的,和 systemd 无关,但多执行一步不会出问题,还能避免某些特殊情况下的配置不生效。
排查故障时,Docker 的日志要看两处。一处是 systemd 层面的:
journalctl -u docker -n 200另一处是 Docker 引擎自身的运行日志,默认打到 /var/log/messages 里:
grep docker /var/log/messages | tail -100实际定位问题的时候,这两条命令能覆盖绝大多数场景。遇到 Docker 起不来,先翻这两种日志,比乱试命令管用得多。
4.2 Docker 常用命令速查
日常使用频率最高的命令,给你整理个清单:
- 镜像相关:
docker pull 镜像名:标签拉取镜像docker image ls查看本地镜像列表docker rmi 镜像ID删除指定镜像docker build -t 名称:标签 .构建镜像
- 容器相关:
docker ps -a查看所有容器,包括已停止的docker run -d -p 8080:80 --name 容器名 镜像名后台运行容器并映射端口docker logs -f 容器名持续跟进容器日志docker exec -it 容器名 bash进入容器终端docker rm 容器名删除容器
- 资源清理:
docker system df查看磁盘占用概览docker system prune -a清理所有无用的镜像、容器、网络和构建缓存
这些命令不用刻意背,用到再查都行。但docker ps和docker logs两个一定要熟练,排查问题全靠它们。
4.3 将普通用户加入 docker 组
默认情况下,执行 docker 命令需要 root 权限。如果想让某个普通用户直接用 docker,把它加进 docker 用户组即可:
usermod -aG docker 用户名改完之后,让该用户退出当前登录状态,重新登录,组权限才会生效。验证一下:
id 用户名看到组列表里包含 Docker 组,说明成功了。
这里必须提醒一句:docker 组内的用户等同于拥有 root 权限。原因很简单,docker 用户可以通过挂载宿主根目录的方式,直接读写宿主机任意文件。所以不要随随便便把所有账号都加进 docker 组,生产环境尤其要注意这个组的成员边界。
5. 常见问题与排查技巧实录
这部分是我实打实踩坑踩出来的经验。我把 CentOS 7 上装 Docker 最容易出的问题一个个列出来,每个都附上排查思路和解决办法。
5.1 内核版本过低导致的兼容性问题
现象:Docker 装好了,服务也启动了,但一运行容器就直接报错,比如container init failed、operation not permitted、overlayfs: not supported之类的。
原因很直接:内核太老。CentOS 7 早期版本自带的内核是 3.10.0-327 甚至更低,而 Docker 20.10 虽然要求内核 3.10 起步,但在老内核上跑容器,overlay2 存储驱动需要的文件系统特性不一定齐全,容器的网络和权限隔离也容易出问题。
解决办法就是先升级系统内核:
yum -y update这个命令会把内核更新到当前镜像源的补丁版本,比如 3.10.0-1160。升级完重启机器,确认uname -r已经是新版本,再跑 Docker 容器就正常了。
这里必须强调,升级内核意味着重启机器,生产环境请在业务低峰期操作,并且提前确认系统有回滚手段措施,万一重启起不来,别把自己坑了。
5.2 yum 源超时或 GPG 校验失败
现象:执行yum install时一直卡在下载界面动弹不得,或者直接报 GPG 校验失败,提示 public key not available。
先看网络。如果你的 docker-ce.repo 用的是官方源,国内机器超时太正常了,直接回到第 3.3 节把源换成阿里云镜像,绝大多数情况都能解决。如果已经用了镜像源还是慢,清一下缓存再试:
yum clean all yum makecache fastGPG 校验失败通常是首次安装时没有导入仓库的 GPG 公钥。手动导入一下:
rpm --import https://mirrors.aliyun.com/docker-ce/linux/centos/gpg然后重新安装即可。这里我不建议为了省事去把 docker-ce.repo 里的 gpgcheck 改为 0,那等于放弃了软件包完整性校验,相当于把发行版的软件安全机制亲手关掉,万一拉下来的包被篡改过,后果很严重。
5.3 存储驱动与磁盘空间问题
先看存储驱动是否正常:
docker info | grep "Storage Driver"正常情况下输出是 overlay2。如果显示 devicemapper,或者干脆报文件系统不支持 overlay2,多半是分区格式太老。xfs 分区需要开启 ftp 参数才能支持 overlay2,ext4 反而兼容性更好。老机器上如果遇到这问题,最省心的办法是把 Docker 数据目录迁移到一块格式化的 ext4 分区上。
磁盘空间是另一个高频坑。Docker 镜像、容器日志、数据卷都会持续占用空间,跑着跑着docker system df一看占用率直接上 100%,容器就开始报no space left on device。建议日常加个定时清理任务,或者至少每周手动跑一次:
docker system prune -f注意,这个命令不会删除正在运行的容器和它们依赖的镜像,只清理悬空镜像、已停止容器和构建缓存,正常业务不受影响。
日志增长快的容器,建议在 daemon.json 里加上日志上限:
{ "log-driver": "json-file", "log-opts": { "max-size": "50m", "max-file": "3" } }这个配置能让单个容器日志文件最大 50MB,最多保留 3 个滚动文件,防止日志把磁盘彻底撑爆。改完记得执行 daemon-reload 加 restart docker。
5.4 容器启动失败的常见原因
容器动不动就启动失败,一般就这几种情况。
端口冲突最常见。执行docker run -p 8080:80时,如果宿主机 8080 端口已经被别的进程占用,容器会直接退出,报bind: address already in use。排查用:
netstat -tlnp | grep 8080找到占用进程,要么关掉,要么换一个宿主端口映射。
镜像拉不下来是第二类高频问题。表现为docker pull一直卡着最终超时。先检查加速器配置是否生效:
docker info | grep -A 2 "Registry Mirrors"能看到加速地址说明配置成功。看不到就回第 3.5 节重新配置 daemon.json。
第三类问题是容器启动后立即退出,日志里看不到有效信息。这种要用docker logs 容器名看输出,很多时候是容器镜像本身要求的环境变量或者挂载目录没有给足,日志里会有明确提示。如果日志也没内容,就用docker inspect 容器ID看退出码和 LastState 字段,信息量很大。
5.5 与 iptables/firewalld 的冲突
Docker 在宿主机上会自己操作 iptables 规则来转发容器流量,这是它能正常工作的基础。如果你系统里启用了 firewalld,并且先重启了防火墙再去启动 Docker,经常会出现容器间网络不通、端口映射失效的问题。
原因可以这样理解:Docker 会在 iptables 的 FORWARD 链里写入自己的转发规则,firewalld 一旦重启,会把整张 iptables 规则表重置,Docker 之前写进去的规则全没了,而 Docker 守护进程自己并不知道这件事。
遇到这种场景,最省事的补救方法就是重启 Docker:
systemctl restart dockerDocker 会把 iptables 规则重新刷一遍。如果业务上对防火墙有严格要求,我的建议是生产环境不要同时启用 firewalld 和 Docker 的默认桥接网络模式。要么关掉 firewalld,靠安全组或者前置防火墙来控制流量;要么用 host 网络模式跑容器,再加应用层防护,避免两边在底层规则上互相打架。
CentOS 7 上 Docker 装过几十台之后,我最大的体会是:安装命令本身不值钱,值钱的是你在装之前对系统环境、网络环境、磁盘和内核的判断。每台机器的实际情况都不一样,先查版本再看内核,先确认网络再选源,这个顺序千万别搞反。
最后再分享一个我一直在用的小习惯:装完 Docker 后,我会第一时间把 daemon.json 里的>
ZEMAX非序列建模设计LED准直镜的硬核实战指南
/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …
汽车雷达干扰预期评估怎么做:仿真架构、信干噪比与蒙特卡洛实战解析
搞了这些年汽车雷达的测试和仿真,我越来越觉得,很多时候我们费劲做完一轮台架测试,结果一上量产的复杂场景就栽跟头。问题出在哪?十有八九不是雷达本身不行,而是我们压根没搞清楚“雷达在真实道路上会被别人干扰成什么…
TeslaMate 如何安全保存令牌与位置数据:加密密钥和数据库备份的新手完整指南
TeslaMate 如何安全保存令牌与位置数据:加密密钥和数据库备份的新手完整指南 【免费下载链接】teslamate A self-hosted data logger for your Tesla 🚘 [main maintainerJakobLichterfeld] 项目地址: https://gitcode.com/GitHub_Trending/te/teslama…
三菱Q系列PLC在智能制造中的模块化设计与多轴控制实践
1. 项目概述:三菱Q系列PLC在复杂自动化系统中的应用这套基于三菱QCPU(Q系列PLC)和QD77MS16运动控制模块的自动化控制系统,是我近年来接触过的工业自动化项目中架构设计最为精良的案例之一。系统整合了超过30台三菱伺服驱动器、多台…
PHP7扩展开发:核心数据结构与性能优化实践
1. PHP扩展开发核心概念解析PHP扩展开发是深入理解PHP运行机制的重要途径,也是提升PHP性能的关键手段。在PHP7中,Zend引擎经过全面重构,扩展开发的方式也随之发生了显著变化。本章将重点探讨PHP7扩展开发中的核心数据结构和内存管理机制。1.1…
GEO优化实战指南:AI搜索时代的出海全域增长
/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …