尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
CentOS7 Docker安装配置实操:构筑轻量CI/CD底座
前阵子帮一个朋友搭他团队内部用的自动化发布流程他给的硬性前提是服务器就一台 4 核 8G 的 CentOS7 老机器不想上 K8s也不想装太重的运维平台。聊到最后方案落在了一套轻量 CI/CD 组合上而整个方案的第一步就是在这台 CentOS7 上把 Docker 装好、配好。这篇就是那个“轻量 CI/CD 系统实施方案”系列的第一篇专门讲 CentOS7 环境里的 Docker 安装与基础配置。我会从方案选型思路讲起把系统准备、安装、调优、验证、后续衔接这些环节一次说透顺便把我在实际部署中踩过的坑和排错记录都放出来。如果你正准备用一台存量 CentOS7 机器跑自动化构建和发布照着这份文档操作基本能少走一半弯路。1. 轻量 CI/CD 方案里为什么第一步是 Docker1.1 先想清楚你要的是“轻量”不是“功能吞天”很多人一提 CI/CD第一反应就是整套生态全家桶但实际业务往往只需要“代码提交后自动跑测试、自动构建镜像、自动部署到测试机”这三板斧。轻量方案的核心思路是把工具链拆细每个组件只做一件事组件之间通过 API 或命令行衔接资源占用控制在单台机器可承受的范围内。常见的搭配是轻量 Git 仓库比如 Gitea / Gogs 这类加轻量 Runner比如 Drone、Woodpecker或者 Jenkins 的轻量部署模式再做一层构建缓存跑完就释放资源。这套组合里Docker 承担的角色非常关键所有构建任务和测试任务都跑在容器里而不是直接裸奔在宿主机上。这样设计的好处有三个环境隔离项目 A 用的 JDK 版本和项目 B 用的 Node 版本互不干扰。构建环境一次固化避免“在我机器上能跑到你机器上就挂”的经典矛盾。容器用完即弃不会在宿主机上积累一堆编译残留和临时依赖。1.2 Docker 在这套方案里的角色定位在这套轻量方案里Docker 不只是“跑应用的容器运行时”它更重要的作用是作为 CI 任务的执行沙箱。举个例子你的 Runner 收到构建任务后会从镜像仓库拉取一个带构建工具链的镜像比如 maven:3.8-jdk-11在容器里执行编译和打包。编译产物再直接打进应用镜像推到仓库。整个过程对宿主机环境是零依赖的只要 Docker 本身健康构建结果就是可复现的。这就意味着Docker 的安装质量直接影响后续整个 CI/CD 链路是否稳定。如果你在安装阶段就埋了隐患比如存储驱动不对、日志无限增长、镜像拉不动后面跑构建的时候问题会成倍放大。1.3 为什么选择 CentOS7以及它的局限性选 CentOS7 不是因为它新而是因为存量机器多、团队熟悉、资料密集。但这台系统有一个绕不开的现实CentOS 7 已经进入生命周期末尾阶段不再有免费的长期安全更新。如果你是在生产环境用我给你的建议很直接——要么近期规划迁移到其他还在维护的 Linux 发行版要么至少把它放在内网隔离环境只跑 CI/CD 这类内部工具不要直接暴露公网核心业务。技术选型要务实明知道系统已经“退休”还要硬扛核心线上服务那是给自己埋雷。明白了这些背景再往下走就是具体的环境准备和安装了。2. 动手之前的准备工作2.1 确认系统版本与内核先别急着敲安装命令把下面几条跑一遍确认机器的基本情况cat /etc/centos-release uname -r getconf LONG_BITCentOS7 的内核默认是 3.10.xDocker 20.10 及后续版本在上面跑是没有问题的但有一个前提内核要支持 overlay2 存储驱动。一般 CentOS7 的内核都带这个模块只是需要验证一下ls /sys/module/overlay如果这条命令没有报错说明 overlay 模块可用安装后 Docker 能自动选择 overlay2性能会比老的 devicemapper 好很多。如果内核版本特别老比如 3.10.0-327 之前我建议先yum update -y把内核升上去再继续装 Docker。否则后面可能会遇到容器网络不通、挂载异常等一堆奇怪问题。2.2 网络、时间同步与磁盘规划安装 Docker 本身不复杂但底子没打好后面全是坑。重点检查三项磁盘空间。Docker 默认把所有数据放在/var/lib/docker镜像、容器层、日志全在里面。用df -h /var/lib/docker如果目录不存在就是根分区/确认至少预留 20G 以上如果要做 CI/CD50G 以上更稳妥。时间同步。容器日志和 CI 任务的时间戳必须和宿主机一致否则排查问题的时候日志时间线是乱的。确认chronyd或ntpd在运行用date看一眼时间是否准确。网络连通性。安装需要访问 Docker 官方源后续拉镜像需要访问镜像仓库。如果你所在环境有内网限制提前准备好代理或内网镜像源配置。2.3 防火墙策略先想再动CentOS7 默认开着 firewalld。很多教程会让你直接systemctl stop firewalld一关了之我不建议这么做。正确做法是先想清楚这台机器后面要跑哪些服务哪些端口需要对外。比如 Docker 自身需要 2375/2376 用于远程 API一般不建议开后续 CI 组件的 Web 端口比如 80、8080、3000需要被访问。如果你是在内网测试环境图省事可以临时关掉 firewalld 排障但生产环境至少要精开端口# 只放行 SSH 和后续 CI 的 Web 端口按需替换端口号 firewall-cmd --permanent --add-servicessh firewall-cmd --permanent --add-port8080/tcp firewall-cmd --reload还有一点容易被忽略Docker 会自己维护一套 iptables 规则如果 firewalld 和 Docker 的规则冲突容器端口映射可能不通。这种情况一般重启 Docker 服务就能恢复不用慌我后面在常见问题里细说。3. Docker 安装的完整实操3.1 清理旧版本与依赖如果你这台机器以前装过 Docker旧版本 docker 或 docker-engine先清理干净否则 yum 很容易报包冲突。yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine执行完确认一下没有残留ls /var/lib/docker如果有重要数据这个目录别直接删先备份。但绝大多数情况下老机器的/var/lib/docker可以放心清空。3.2 配置 Docker 官方仓库CentOS7 上安装 Docker 最稳的路径是用 yum 仓库不要手动下载 rpm 包后续升级维护都方便。先装工具包yum install -y yum-utils然后添加仓库yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo这个仓库地址是 Docker 官方提供的 CentOS 仓库如果你的网络访问不到可以考虑用镜像源方式同步千万别用网上随便找的第三方源安全性和完整性都没保障。3.3 安装 docker-ce 并启动仓库配好之后直接安装yum install -y docker-ce docker-ce-cli containerd.io这里默认装的是当前最新稳定版。但如果你和我一样是在存量 CentOS7 上部署我建议你锁定一个经过验证的版本不要盲目追新。查看可用版本yum list docker-ce --showduplicates | sort -r锁版本的目的是控制升级节奏。CI/CD 系统本来就是跑构建用的没必要因为 Docker 小版本升级引入不稳定因素等确认新版本在你的环境里没问题再手动升级也不迟。安装完启动服务systemctl start docker systemctl enable dockerenable这步很重要否则机器重启后 Docker 不会自动拉起CI 任务全挂。3.4 验证基础安装启动后用两个命令做基础验证docker version docker info看到 Client 和 Server 版本信息都正常说明 Docker 引擎已经起来了。如果docker info里出现Cannot connect to the Docker daemon大概率是服务没起来先systemctl status docker看日志。到这里一个最小可用的 Docker 就装好了。但离“可以作为 CI/CD 底座”还差几步关键配置。4. 配置 Docker 运行环境4.1 daemon.json 关键配置项Docker 的运行时配置放在/etc/docker/daemon.json这个文件默认不存在需要自己创建。它是整个 Docker 安装过程中最重要的一个配置文件我强烈建议你启动服务之前就先把它写好。以下是我在 CI/CD 场景下使用的推荐配置{ data-root: /var/lib/docker, log-driver: json-file, log-opts: { max-size: 20m, max-file: 5 }, storage-driver: overlay2, registry-mirrors: [ https://docker.mirrors.example.com ], exec-opts: [native.cgroupdriversystemd] }逐项说明log-driver和log-opts控制容器日志的大小。如果不设置Docker 默认会把每个容器的日志无限增长CI 跑的时间一长磁盘就会被日志塞满。限制单份日志 20M、保留 5 份够排查问题用又不会爆盘。storage-driver指定 overlay2。CentOS7 上这是性能和稳定性最均衡的选择。registry-mirrors镜像加速地址国内环境拉镜像必备。把地址换成你实际可用的加速服务地址就行。exec-opts让 Docker 使用 systemd 作为 cgroup 驱动避免和宿主机 systemd 管理冲突。这条在 CentOS7 上尤其重要。写完配置后生效systemctl daemon-reload systemctl restart docker4.2 数据目录迁移如果根分区不够很多人装 Docker 的时候没注意跑了一个月发现根分区满了原因是/var/lib/docker在根分区上而日志和镜像已经把空间吃光了。如果/var/lib/docker所在分区空间紧张就把数据目录迁到独立数据盘。操作步骤很简单停掉 Dockersystemctl stop docker迁移数据rsync -avx /var/lib/docker/ /data/docker/修改daemon.json中>groupadd docker # 如果不存在 usermod -aG docker 你的用户名然后重新登录或者执行newgrp docker让组权限生效。之后这台机器上的普通用户就可以直接敲docker ps了。这里有一个安全上的提醒能操作 Docker 就等于能操作宿主机通过挂载卷可以访问宿主机任意文件所以千万别把用户随便加进 docker 组只给真正有运维权限的人。4.4 用 hello-world 和 Nginx 做首次验证配置做完了跑两个容器验证一下整个链路是否健康。第一个是官方测试镜像docker run --rm hello-world能够正常输出 Hello from Docker! 说明拉取、创建、运行容器的基本链路没问题。第二个验证端口映射docker run -d --name test-nginx -p 8080:80 nginx:alpine curl http://127.0.0.1:8080curl 能返回 Nginx 默认页面说明容器网络和端口映射都正常。验证完删掉测试容器docker rm -f test-nginx到这里Docker 本身已经可以承担 CI/CD 底座的职责了。5. 与后续 CI/CD 组件的衔接思路5.1 端口规划别装到一半才发现冲突Docker 只是底座接下来你要在自己的服务器上装 Git 仓库、Runner 等组件。装组件之前先把端口规划好否则后面改配置会非常痛苦。我常用的规划思路如下表按轻量方案常见组件组件默认端口说明Gitea3000 / 22Web 管理界面 / SSH 推送Drone Server80Runner 连接和 Webhook 入口Jenkins8080如果走 Jenkins 方案Registry5000内网镜像仓库一个容易踩的坑是某电商项目组曾同时装了一个 Java 应用和一个 Git 仓库两个 Web 端口都写 8080结果改了一下午防火墙规则。所以我的习惯是在装第一个组件前先画一张端口分配表贴在服务器配置文件里后续每个新服务都对照这张表来。5.2 用 Docker network 把组件串起来后续轻量 CI/CD 各组件之间需要互相通信比如 Web 服务要访问 Git 仓库的 API、Runner 要连接消息队列。组件之间不要各自用宿主网络端口互相访问那样配置繁琐且容易乱。建议创建一个自定义网络docker network create cicd-net之后所有 CI/CD 相关容器启动时都加--network cicd-net组件之间直接用容器名作为主机名互相访问。比如 Runner 容器里访问 Gitea 就直接用http://gitea:3000不用关心宿主机 IP 是多少。这种做法的好处是容器重启 IP 变了也不影响内部通信而且默认走 bridge 隔离网络安全性也更好。5.3 数据卷与备份别把容器当“宠物”后续你在 Docker 里跑各种 CI 组件时一定要记住一个原则容器是可丢弃的数据必须在卷里。启动组件时用命名卷而不是直接写容器内路径docker run -d \ --name gitea \ --network cicd-net \ -v gitea-data:/data \ -p 3000:3000 \ gitea/gitea:latest这样数据保存在命名卷里容器删了重建数据还在。日常备份只需要备份卷目录或执行docker run --rm -v ...的备份命令不会因为容器迁移导致数据丢失。5.4 给后续组件定资源上限单机跑多个 CI 组件最怕的是某个容器吃光内存导致整机 OOM。给容器设置资源上限是轻量方案里非常必要的防御手段。启动后续组件时建议明确加资源限制docker run -d \ --name runner \ --cpus 1.5 \ --memory 2g \ --memory-swap 2g \ ...--cpus 1.5限制最多用 1.5 个核心--memory 2g限制最多用 2G 内存且不启用 swap防止内存被占满后持续使用交换分区拖垮整机。运行中的容器可以用docker stats实时观察资源占用定位是哪个容器在吃资源。6. 常见问题与排查技巧实录6.1 安装时报依赖冲突或找不到包安装 docker-ce 时如果 yum 报Nothing provides ... needed by docker-ce或者Package does not match intended download最常见的原因是系统里残留了旧版本的 docker 相关包或仓库缓存过期。处理步骤yum remove docker* docker-ce* 2/dev/null yum clean all yum makecache yum install -y docker-ce docker-ce-cli containerd.io如果还不行检查系统是否注册了多个 Docker 相关仓库把重复仓库源的配置删除后再试。6.2 内核与存储驱动不匹配docker info里如果看到Storage Driver: vfs说明 overlay2 不可用或内核模块没加载容器性能会非常差。处理方式确认内核版本3.10 以上一般没问题然后加载模块并重启 Dockermodprobe overlay systemctl restart docker如果宿主机内核实在过老只能先升级内核或者换发行版这是情感上不愿意接受、但技术上必须接受的现实。6.3 Docker 重启后容器端口不通这是我在生产环境遇到最多的一类问题Docker 启动正常docker ps看到容器都是 Up但外部就是访问不了映射的端口。查错顺序# 1. 看容器端口映射 docker port 容器名 # 2. 看 iptables 规则 iptables -t nat -L -n | grep 端口号 # 3. 重启 Docker 让动态规则重建 systemctl restart docker这一步有 80% 的概率能解决原因是 Docker 启动时如果与 firewalld 的规则互相覆盖容器端口映射会丢失重启 Docker 会让它重建自己的链。如果重启后仍然不通就要检查防火墙里是否显式拒绝了该端口。6.4 容器内时间与宿主机不一致容器时间默认是 UTC和国内环境差 8 小时CI 日志里的时间戳会让人怀疑人生。启动容器时挂载宿主机时区docker run -d \ -v /etc/localtime:/etc/localtime:ro \ ...或者在daemon.json里设置默认环境变量但最可靠的方式还是在 compose 文件或者启动命令里显式指定TZAsia/Shanghai。6.5 镜像拉取超时和“永久转圈”国内网络环境下从 Docker Hub 拉取镜像经常遇到超时或无响应。除了配置镜像加速之外还有一个我在实践中很管用的技巧明确指定平台架构有时候 Docker 会在解析 manifest 时卡住加上--platform linux/amd64能跳过无谓协商docker pull --platform linux/amd64 nginx:alpine注意加速器只能加速公共镜像拉取。如果你的内网有私有镜像仓库优先使用私有仓库这才是最稳定、最合规的方案。6.6 常用排查命令速查场景命令看 Docker 引擎健康度docker info看系统日志journalctl -u docker -f看容器资源占用docker stats --no-stream看容器日志docker logs -f --tail 100 容器名进入容器排查docker exec -it 容器名 bash清理无用镜像和构建缓存docker system prune -af最后一条命令要谨慎它会删掉所有未被容器使用的镜像先确定这些镜像真的不需要再执行。写在最后在我的实际操作中Docker 装好只是这套轻量 CI/CD 方案的第一步但也是最值得花时间打磨的一步。很多团队一开始图省事装完 Docker 不配日志、不设数据目录、不锁版本跑一段时间后才来找我帮忙收拾残局往往都是磁盘满了或者端口冲突这类低级问题。这里分享一个我个人的习惯装完 Docker 之后把这次做的所有配置固化成一个初始化脚本包括仓库源配置、daemon.json、系统参数调优放到一个独立目录用 Git 管理。以后在新机器上部署一条脚本全部搞定不用每次对着文档手敲。还有一个很实用的小技巧平时排查容器镜像问题时多用--rm参数启动测试容器容器退出后自动清理不会在系统里堆积垃圾容器能让你的docker ps -a长时间保持干净。这套方案后续要做的是在 Docker 之上搭建轻量 Git 仓库和 Runner把“提交代码 → 自动构建 → 自动部署”这条链路真正跑起来。等我把那部分内容整理完再继续更新这个系列。
RELATED

相关推荐

Physical AI 模型低门槛部署指南:从硬件准备到微调训练

Physical AI 模型低门槛部署指南:从硬件准备到微调训练

Physical AI 这个词,最近在机器人圈子出现的频率实在太高了。它说的不是那种只会识别图片、输出文本的通用视觉模型,而是能理解物理世界规律、直接生成动作指令的模型。过去大家总觉得这类东西只存在于顶尖实验室,部署门槛高得离谱&#xff1…

📅 2026/10/19 5:35:42
Podman 在 Windows 上的基础使用:安装、初始化与容器编排

Podman 在 Windows 上的基础使用:安装、初始化与容器编排

如果你常年在 Windows 上做容器开发,估计跟我一样,第一反应是在系统里装一个 Docker Desktop。我也是这么一路用过来的,直到某次要给团队搭一套不依赖图形界面、尽量可控、最好还能省点内存的容器环境,才认真把 Podman 拉到 Windo…

📅 2026/10/19 5:35:42
基于高斯过程与贝叶斯优化的自适应心理物理实验:aepsych 入门与视觉阈值估计实战

基于高斯过程与贝叶斯优化的自适应心理物理实验:aepsych 入门与视觉阈值估计实战

真正让我决定认真研究 aepsych 的,是一次被传统心理物理实验折磨到崩溃的经历。当时为了测一组视觉对比度阈值,按恒定刺激法设计了 8 个强度水平、每个水平重复 40 次,一个被试要连续测 320 个试次。测到一半,被试明显开始疲劳&am…

📅 2026/10/19 5:35:42
MORE NEWS

更多资讯

📰

MATLAB随机森林分类器实战:从数据预处理到调参避坑

简介:基于随机森林的分类算法MATLAB简单实现,面向机器学习入门者与MATLAB开发者,定位于解决分类建模实践入门的一站式参考。资源包共8个文件,包含3个M脚本(分别承担随机森林训练与预测、ID3基础决策树算法及统计评估&a…

📰

Python量化投资避坑指南:数据清洗、回测与样本外验证实战

简介:Python股票量化投资课程配套课件包,面向希望用编程方式构建量化交易体系的初学与进阶学员,覆盖Python语法、数据分析、行情获取、技术指标、策略回测、自动交易与资金管理等模块。压缩包共收录142个文件,其中以85个Python源码…

📰

20+常用算法模型代码实现:分类、回归、聚类与集成工程手册

简介:这份模型算法大全面向数据分析、机器学习入门与进阶学习者,以及需要快速查阅经典算法实现的高校师生和算法工程师,系统整理了20余种常用算法模型及其代码实现,覆盖从统计建模到神经网络等典型场景,帮助读者在理论…

📰

diagram-design:复杂系统可视化设计规范,让架构图、流程图与时序图真正易懂

diagram-design 这个项目名字,听起来像是个画图工具,其实我把它做成了一整套“如何把复杂系统讲清楚”的设计规范。起因是我自己带团队时经常遇到一种尴尬:评审会上投出来的架构图非常漂亮,各种颜色、圆角、图标都齐全&#xff0c…

📰

内容创作遇信息缺失?三步补齐标题正文关键词与摘要

我注意到当前输入信息不完整。在制定写作方案之前,我需要先解决这个问题。当前输入存在的问题根据你的要求,正常的投稿格式应该包含四项关键内容:项目标题:当前仅有"rea"这一个词,无法判断具体指向项目正文&…

📰

R语言机器学习算法实现合集:从工程化结构到二次开发实战

简介:这份资源面向希望用R语言落地机器学习算法的数据分析初学者与进阶者,围绕监督学习与非监督学习两条主线,覆盖线性回归、逻辑回归、支持向量机、决策树、随机森林、梯度提升机、朴素贝叶斯、神经网络以及K-means聚类、关联规则等常见算法…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬