资讯动态

CentOS 7 安装 Docker CE 完整实战指南:从源配置到问题排查

发布时间:2026/9/19 9:56:28 来源:尧图企业网站定制
1. 安装前必知CentOS 7 的现状与准备最近又有人来问我 CentOS 7 上装 Docker 的事其实这个流程网上一搜一大堆但很多教程要么太久远、要么不合时宜照着做反而踩坑。我这几年在 CentOS 7 上部署过好几轮 Docker 环境从最开始什么都不懂瞎折腾到现在闭着眼都能装完中间没少被各种细节坑过。这篇就把我实际验证过的流程完整写下来。先说个背景CentOS 7 虽然已经进入维护周期的尾声但存量服务器数量依然庞大很多公司内部系统、个人服务器还是跑着 CentOS 7。Docker 官方虽然对老版本系统的支持在逐步收紧但 CentOS 7 上用 Docker 完全没问题只是安装方式和配置细节上要注意一些点尤其是官方源和国内镜像的差异、内核版本的要求、以及一些诡异的依赖问题。在动手之前你需要确认三件事。第一服务器能不能访问外网。如果你的机器在内网隔离环境那安装 Docker 就需要离线安装包流程完全不一样这篇文章先以能访问外网为准。第二确认你的登录用户有 root 权限。Docker 安装过程涉及大量系统级操作没权限的话寸步难行建议直接 root 操作或者使用 sudo。第三确认磁盘空间充足。Docker 本身占的空间不大但镜像和容器会迅速吃满磁盘建议系统盘至少留出 20-30GB 空闲否则后面拉几个镜像就报警。这里还要说一个重要的事情CentOS 7 官方源已经停止维护了。以前我们习惯用 mirror.centos.org 的源现在这个地址的内容已经冻结很多老的 yum 操作会报 404。我刚踩过这个坑安装之前最好先把 yum 源切换到国内可用的镜像比如阿里云、清华源不然你会遇到一连串的依赖解析失败。1.1 检查系统版本与内核打开终端先执行cat /etc/redhat-release正常情况下会输出CentOS Linux release 7.9.2009 (Core)这里建议至少是 7.6 以上的版本太老的版本在一些依赖库上会比较蛋疼。然后看内核版本uname -rDocker 在 CentOS 7 上要求内核版本不低于 3.10。这个要求其实很宽松CentOS 7 的默认内核通常都能满足。但我要说的是不要只看版本号关键是内核是否支持 overlay2 存储驱动和 iptables 的相关模块这在后面启动容器时会直接影响网络和存储行为。如果你想验证内核能力可以执行cat /proc/filesystems | grep overlay如果有输出 overlay 相关的内容说明内核已经支持放心装。1.2 更换 yum 源不换源后面全是坑CentOS 7 的默认 yum 源在 2024 年 6 月 30 日后进入了维护冻结期直接使用包管理器安装软件经常会遇到http://mirror.centos.org/centos/7/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found这就是源失效了。我们需要把源换到国内镜像站。我习惯用阿里云的源执行以下命令备份并替换mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo注意这里下载下来的 repo 文件里的地址是 mirrors.aliyun.com有时候会临时抽风实测下来基本稳定。换完后清理缓存并重新生成yum clean all yum makecache同时建议把 epel 源也装上后边有些依赖包可能在 base 源里没有yum install -y epel-release安装完成后顺手升级一下系统包可选但推荐yum update -y这一步耗时较长如果你机器配置一般可能等个十几分钟建议放在最后做或者干脆跳过因为 Docker 本身不一定依赖最新内核。2. 安装方式选择推荐 yum 安装 Docker CE目前 CentOS 7 上安装 Docker 有几种路线yum 直接装、官方脚本安装、二进制包安装。我全部试过这里直接给出最适合生产环境的选择。先说结论强烈推荐通过配置 Docker 官方仓库后用 yum 安装 Docker CE社区版。原因就一个后续升级维护最方便。yum 安装的 Docker 会注册成系统服务可以通过 systemctl 统一管理升级时一条命令搞定卸载也干净。官方脚本安装curl -fsSL https://get.docker.com | sh虽然快但脚本内容很黑盒你不知道它动了什么而且在国内直接执行大概率会卡在下载环节需要改镜像源才能继续很麻烦。不过脚本自动配置的源经常会是官方源下载速度堪忧。二进制包安装适合离线环境装上后一切手动服务本身可以用 systemd 管理但升级、依赖管理全靠自己非必要不选。所以从可维护性和易用性平衡来看yum 装 CE 版本是最适合大多数人的选项。2.1 配置 Docker 官方 yum 源阿里云镜像版Docker 官方文档给的源是 download.docker.com/linux/centos这个源在国外国内服务器拉取速度非常不稳定经常超时。解决办法是把源替换成阿里云镜像站的 Docker 源。执行以下命令创建 repo 文件cat /etc/yum.repos.d/docker-ce.repo -EOF [docker-ce-stable] nameDocker CE Stable - $basearch baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable enabled1 gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/docker-ce/linux/centos/gpg EOF这里有个细节阿里云镜像站保留的 docker-ce repo 结构里目录层级是linux/centos/7/x86_64/stable所以在 baseurl 里写$basearch/stable就能正确命中。有些教程会带你写官方源的路径那在国内基本没法用就别去踩了。配置好之后验证仓库是否生效yum list docker-ce --showduplicates如果能列出多个 docker-ce 版本说明仓库配置成功。2.2 安装 Docker CE 及关键组件直接安装最新版yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin如果你想装指定版本比如因为某些兼容性问题锁定版本可以先查看可用版本再选择具体版本号安装yum list docker-ce --showduplicates yum install -y docker-ce-24.0.9 docker-ce-cli-24.0.9 containerd.io这里有三个组件要说明一下。docker-ce 是主程序负责守护进程、命令行客户端、镜像管理等核心功能。containerd.io 是容器运行时Docker 的底层核心其实由 containerd 提供负责容器的创建、启动、销毁等生命周期管理。如果缺了这个Docker 启动时会报找不到 runc 之类的错误。docker-compose-plugin 这个包是 Docker Compose v2 的插件通过docker compose子命令使用。我在下面专门写一节讲 Compose因为它的安装方式经常被搞混。安装过程中如果遇到依赖冲突或者找不到包的报错一般是前面的源没配好。回去检查一下 /etc/yum.repos.d/ 下是否有多个冲突的 docker repo 文件最好只保留一个。3. 启动 Docker 与配置镜像加速安装完成后不要急着拉镜像先启动服务并验证基本功能然后顺手配置镜像加速器。这两步新手经常忽略等到拉镜像时才发现慢得离谱其实都是加速器没配。3.1 启动 Docker 服务并设置开机自启执行systemctl start docker systemctl enable docker第一条命令启动 Docker 守护进程第二条命令设置开机启动这样服务器重启后 Docker 会自动拉起省得每次手动启动。查看状态systemctl status docker如果你看到 active (running) 的状态说明已经启动成功。此时执行docker version可以看到 Client 和 Server 两块信息。如果 Server 部分正常显示版本号说明 Docker 守护进程工作正常。如果在 Server 部分看到 Cannot connect to the Docker daemon 的报错大概率是守护进程没起来。先看服务日志journalctl -u docker -n 50常见的报错有 iptables 版本不兼容、overlay2 模块加载失败、磁盘空间不足等对应处理就好。3.2 配置国内镜像加速器Docker 默认从 Docker Hub 拉取镜像在国内访问速度真的是随缘有时候一个几百 MB 的镜像能拉半天。配置镜像加速器后效果立竿见影。修改 Docker 的 daemon 配置文件vim /etc/docker/daemon.json如果文件不存在就新建一个内容如下{ registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com, https://docker.mirrors.ustc.edu.cn ] }这几个加速地址是我最近实测还算可用的注意镜像加速器地址经常变化如果发现某个地址失效多换几个试试。配置好后重启 Docker 生效systemctl daemon-reload systemctl restart docker验证是否生效docker info | grep -A 5 Registry Mirrors如果能看到你配置的地址列表说明配置成功。这时拉个测试镜像看一下速度docker pull hello-world如果几秒内拉完说明加速器生效了。这里多说一句就算配了加速器某些大镜像拉取时仍然可能超时建议设置一下 Docker 的超时参数在 daemon.json 里加max-concurrent-downloads: 5这个参数控制同时下载的层数数值越大下载越快但也会占用更多带宽和磁盘 IO。4. 安装 Docker Compose别再装错了很多人会用到 Docker Compose 来编排多容器应用。在 CentOS 7 上安装 Compose 有一个常见误区官方文档推荐用二进制文件安装但很多人跑去用 pip 安装或者下载老版本导致后面执行docker-compose命令时报各种兼容性错误。Docker Compose 现在有两个版本体系v1 用docker-compose命令带横杠v2 用docker compose命令docker 子命令。CentOS 7 上我推荐使用 v2 插件方式原因很简单它跟 docker 主程序一起由 yum 管理升级方便也不会出现 Python 依赖冲突的问题。前面安装时我们已经装了 docker-compose-plugin 这个包所以这里直接验证一下docker compose version如果能输出版本号比如Docker Compose version v2.24.2说明已经装好了可以直接使用docker compose up这种方式。注意是空格不是横杠。如果你确实需要旧版的docker-compose命令可以通过 pip 安装yum install -y python3-pip pip3 install docker-compose但我不建议这么做因为 CentOS 7 系统默认 Python 是 2.7即使装了 python3pip 安装的 docker-compose 也可能会出现依赖版本冲突而且 v1 已经停止维护了。这里再补充一个常见场景很多人会问 Compose 到底有什么用。简单说如果你只需要启动一个容器直接 docker run 就行但如果你需要同时启动数据库、后端服务、前端服务还要配置网络、挂载卷、设置环境变量那用 Compose 就省心很多 —— 一个 yml 文件搞定所有配置一条命令启动全部服务。5. 常用命令与问题排查实录装完 Docker 只是开始实际用起来会发现有很多隐藏的坑。我整理了自己在 CentOS 7 上使用 Docker 的高频命令和踩坑记录。5.1 Docker 常用命令速查镜像相关docker search nginx # 搜索镜像 docker pull nginx # 拉取镜像 docker images # 查看本地镜像列表 docker rmi nginx # 删除镜像 docker build -t myapp:1.0 . # 构建镜像容器相关docker ps # 查看运行中的容器 docker ps -a # 查看所有容器含已停止 docker run -d --name my-nginx -p 8080:80 nginx docker start my-nginx docker stop my-nginx docker rm my-nginx docker exec -it my-nginx bash docker logs -f my-nginx这里重点说一下 docker run 的常用参数我几乎每天都在用参数含义使用频率-d后台运行容器不占用当前终端经常--name给容器起名后面管理方便必用-p 8080:80端口映射宿主机 8080 映射到容器 80必用-v /host/path:/container/path目录挂载持久化数据的关键经常--network指定网络模式偶尔--restartalways容器退出后自动重启适合服务型容器推荐-e 环境变量值传递环境变量给容器经常5.2 常见问题与坑点集合问题一docker pull 镜像时报 x509 证书错误或者 timeout。我之前遇到过一种情况配置了加速器后仍然报 unknown authority排查下来发现是/etc/docker/certs.d目录下有残留的证书文件。解决办法是把该目录下无关的证书清理掉再重启 Docker。问题二容器创建后无法访问外部网络。这种情况多半是 iptables 或 firewalld 策略拦截。CentOS 7 自带的 firewalld 有时会干扰 Docker 的网络规则。我的处理办法是systemctl stop firewalld systemctl disable firewalld然后重启 Docker 服务。生产环境如果必须保留 firewalld可以手动放行需要的端口但这里不展开。说实话我在服务器上通常直接关掉 firewalld用 Docker 自身的网络模式管理端口暴露。问题三磁盘空间被大量占满df -h 显示 Use% 很高。Docker 长时间运转后悬空镜像、日志文件、构建缓存都会积攒成病。我习惯定期清理docker system prune -a # 清理所有未使用的镜像、容器、网络、构建缓存 docker ps -aq | xargs docker rm # 删除所有已停止的容器 journalctl --vacuum-size200M # 限制 systemd 日志大小另外需要注意 Docker 数据默认存放在 /var/lib/docker如果系统盘空间紧张建议把这个目录迁移到大容量磁盘可以用软链接方式也可以改 daemon.json 里的>docker run -d --name my-app -e TZAsia/Shanghai --restartalways myimage或者修改 daemon.json 设置默认时区env: [TZAsia/Shanghai]问题五启动容器报错标准_init_linux.go:228: exec user process caused exec format error。这个报错一般是架构不匹配。比如在 x86 服务器上拉了 ARM 架构的镜像就会出这个错误。出现后先用docker inspect 镜像名查看 Arch 字段确认镜像架构再重新拉取正确架构的版本。问题六写 Dockerfile 构建镜像时yum 安装速度极慢。构建镜像时如果在容器内执行 yum install走的是容器内的源配置如果基础镜像没有配国内源速度会非常感人尤其 base image 是 CentOS 官方镜像的时候。我的做法是在 Dockerfile 里先替换 yum 源再安装依赖FROM centos:7 RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo \ yum install -y nginx同样的思路也适用于其他基础镜像。国内做开发的朋友凡是遇到容器内下载慢的问题优先想到换源。5.3 配置内网 HTTP 代理在隔离内网或受限网络的环境中Docker 拉取镜像可能还需要走 HTTP 代理。这时候光配置加速器没用要给 Docker 守护进程配置代理。创建 Docker 服务配置目录mkdir -p /etc/systemd/system/docker.service.d写入代理配置cat /etc/systemd/system/docker.service.d/http-proxy.conf EOF [Service] EnvironmentHTTP_PROXYhttp://proxy.example.com:3128 EnvironmentHTTPS_PROXYhttp://proxy.example.com:3128 EnvironmentNO_PROXYlocalhost,127.0.0.1 EOF然后重新加载并重启 Dockersystemctl daemon-reload systemctl restart docker注意这个配置是给 docker daemon 用的容器内部的网络请求不走这个代理。如果容器内部需要代理需要在构建或运行时单独设置环境变量。6. 离线安装方案没有外网也能装 Docker很多企业内部服务器是纯内网环境上文介绍的所有 yum 方式都无法使用。这种情况下需要提前在有外网的机器上准备好 Docker 的 RPM 安装包再拷贝到内网安装。我常用的离线安装思路是在一台可以联网的 CentOS 7 机器上用 yumdownloader 工具把所有需要的 RPM 包下载下来然后拷贝到目标机器上用 yum localinstall 安装。联网机器上执行yum install -y yum-utils mkdir -p /opt/docker-packages cd /opt/docker-packages yumdownloader --resolve docker-ce docker-ce-cli containerd.io docker-compose-plugin注意 --resolve 参数会自动把依赖的 RPM 包一并下载下来这个参数特别关键不然装的时候缺依赖会折腾死人。把生成的 RPM 文件夹打包拷贝到内网机器tar czf docker-packages.tar.gz /opt/docker-packages内网机器上解压并安装tar xzf docker-packages.tar.gz -C /opt/ cd /opt/docker-packages yum localinstall -y *.rpm之后启动服务、配置镜像加速的流程就跟在线安装完全一样了。离线安装没法享受镜像加速如果加速器也不通的话所以拉取镜像这一步是最痛苦的。在有外网的机器上先用 docker pull 拉好镜像再用 docker save 导出成 tar 包拷贝到内网后用 docker load 导入。这是我目前用过最靠谱的离线镜像迁移方式。7. 最后再分享一些实际使用中的心得Docker 这东西装了只是万里长征第一步。我在 CentOS 7 上用 Docker 跑了几年服务总结几点感受比较深的。第一别追新版本。CentOS 7 本身是老系统Docker 版本只要稳定就行不必每次新版本发布都急着升。我遇到过升级 Docker 后容器全部停止的情况虽然理论上有不停机的升级方式但没必要冒这个险。生产环境没有特殊需求锁定稳定版本就好我一般用 24.x 系列的版本。第二数据持久化一定要用好卷挂载。我一开始用 Docker 跑数据库没挂载数据卷后来容器一删数据全没了整个人是懵的。以后凡是跑有状态的服务启动时一定要把数据目录挂载到宿主机这是血的教训。写个简单的备份脚本定期把 /var/lib/docker/volumes 下的数据备份到别的机器。第三日志别放到默认位置。Docker 默认把容器日志写到宿主机 /var/lib/docker/containers 目录日志多了会很占空间而且跟业务日志混在一起很难排查。建议启动容器时用 json-file 日志驱动并设置日志轮转上限docker run -d --name my-app \ --log-driver json-file \ --log-opt max-size10m \ --log-opt max-file3 \ myimage或者在 daemon.json 里统一配置日志参数。这样日志文件不会无限膨胀省得后期手动清理。第四学 Docker 不需要一开始就把所有知识点都背下来。先把镜像、容器、端口映射、卷挂载、日志这几个核心概念搞清楚能跑起来业务就是胜利。后面遇到问题再查文档、问搜索引擎积累多了自然就熟了。国内网上关于 Docker 的中文资料已经非常丰富我很多问题都是在实战中搜出来的没有捷径。CentOS 7 装 Docker 的整体流程到这里就全部走完了。不管你是刚入门的运维新手还是要把已有服务容器化的开发这套流程你直接照着做按我踩过的坑提前规避基本上一次就能装好。后面真正花时间的是理解 Docker 的运行机制、掌握怎么用 Dockerfile 描述好你的应用、怎么设计好容器的网络和存储那是另一个话题了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价