在中小型团队的实际开发中,我们经常遇到这样的困境:Jenkins这类传统CI/CD工具对服务器资源消耗大,GitLab Runner配置复杂,而商业化的云服务又存在成本问题。经过多次技术选型验证,我们最终确定了一套基于Docker的轻量化CI/CD实施方案,其核心优势在于:
这个方案特别适合10人以下的敏捷团队、个人开发者以及需要快速搭建演示环境的技术人员。下面我就以CentOS7系统为例,详细拆解整个实施过程。
在开始安装前,建议先执行以下基础检查(以下所有命令均需root权限执行):
bash复制# 检查系统版本
cat /etc/redhat-release
# 确认内核版本(需3.10以上)
uname -r
# 关闭SELinux(避免权限问题)
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 清空防火墙规则(测试环境建议)
iptables -F && iptables -X
systemctl stop firewalld
systemctl disable firewalld
注意:生产环境如需保留防火墙,需额外开放2375(Docker守护进程端口)、9000(Portainer管理端口)等关键端口
针对CI/CD场景的特殊需求,建议进行以下优化:
bash复制# 创建专用存储目录(避免系统盘写满)
mkdir -p /data/docker
# 配置阿里云yum源(国内加速)
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
# 安装基础工具包
yum install -y yum-utils device-mapper-persistent-data lvm2 git
不同于官方推荐方案,我们采用更稳定的指定版本安装:
bash复制# 添加Docker官方源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 查看可用版本
yum list docker-ce --showduplicates | sort -r
# 安装指定版本(这里选择19.03.15)
yum install -y docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io
版本选择考量:
修改/etc/docker/daemon.json配置文件:
json复制{
"data-root": "/data/docker",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn"
],
"live-restore": true
}
配置说明:
bash复制systemctl start docker
systemctl enable docker
# 验证安装
docker version
docker run hello-world
# 查看存储配置是否生效
docker info | grep "Docker Root Dir"
虽然Docker CLI强大,但对于团队协作更推荐使用Portainer:
bash复制# 创建管理用网络
docker network create ci-cd-net
# 启动Portainer容器
docker run -d -p 9000:9000 \
--name=portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/portainer_data:/data \
--network ci-cd-net \
portainer/portainer-ce:2.16.2
访问http://服务器IP:9000 完成初始化设置,建议:
CI/CD流程中常用的辅助工具:
bash复制# 轻量级代码浏览工具
docker run -d \
--name=gogs \
-p 10022:22 -p 10080:3000 \
-v /data/gogs:/data \
--network ci-cd-net \
gogs/gogs:0.12.6
# 简易制品仓库
docker run -d \
--name=nexus \
-p 8081:8081 \
-v /data/nexus:/nexus-data \
--network ci-cd-net \
sonatype/nexus3:3.38.1
Drone以其轻量著称,非常适合作为核心引擎:
bash复制# 服务端
docker run -d \
--name=drone \
-p 8080:80 \
-v /data/drone:/data \
-e DRONE_GITEA_SERVER=http://gogs:10080 \
-e DRONE_GITEA_CLIENT_ID=<从Gogs获取> \
-e DRONE_GITEA_CLIENT_SECRET=<从Gogs获取> \
-e DRONE_RPC_SECRET=$(openssl rand -hex 16) \
-e DRONE_SERVER_HOST=服务器IP \
-e DRONE_SERVER_PROTO=http \
--network ci-cd-net \
drone/drone:2.15.0
# Runner节点
docker run -d \
--name=drone-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=drone \
-e DRONE_RPC_SECRET=<与上面相同> \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=centos7-runner \
--network ci-cd-net \
drone/drone-runner-docker:1.8.0
配置要点:
使用MailHog搭建测试用SMTP服务:
bash复制docker run -d \
--name=mailhog \
-p 1025:1025 \
-p 8025:8025 \
--network ci-cd-net \
mailhog/mailhog:v1.0.1
在Drone的.drone.yml中配置:
yaml复制kind: pipeline
steps:
- name: notify
image: plugins/email
settings:
host: mailhog
port: 1025
from: ci@your-company.com
to: dev-team@your-company.com
when:
status: [failure]
以Node.js项目为例的.drone.yml:
yaml复制kind: pipeline
name: default
steps:
- name: install
image: node:16-alpine
commands:
- npm install
volumes:
- name: node_modules
path: /app/node_modules
- name: test
image: node:16-alpine
commands:
- npm test
depends_on: [install]
- name: build
image: plugins/docker
settings:
repo: your-repo/app-name
tags: ${DRONE_BUILD_NUMBER}
registry: nexus:8081
insecure: true
when:
event: push
branch: main
volumes:
- name: node_modules
temp: {}
结合Buildx实现多架构构建:
yaml复制- name: multi-arch-build
image: docker:20.10-dind
privileged: true
commands:
- docker buildx create --use
- docker buildx build \
--platform linux/amd64,linux/arm64 \
-t your-image:${DRONE_BUILD_NUMBER} \
--push .
bash复制# 查看容器日志
docker logs -f --tail 100 drone
# 清理无用资源
docker system prune -f --volumes
# 备份关键数据
tar -czvf /backup/docker-data-$(date +%Y%m%d).tar.gz /data/docker
问题1:构建时提示权限不足
解决方案:
bash复制# 查看容器内用户ID
docker exec -it drone-runner sh -c 'id -u'
# 确保宿主机目录权限匹配
chown -R 1000:1000 /data/drone
问题2:Git仓库连接超时
检查:
docker network inspect ci-cd-netdocker run --rm busybox nslookup gogs问题3:镜像推送失败
调试步骤:
bash复制# 测试基础连接
docker login -u admin -p admin123 nexus:8081
# 检查证书配置
openssl s_client -connect nexus:8081 -showcerts
存储优化:
bash复制# 使用overlay2存储驱动
echo "STORAGE_DRIVER=overlay2" >> /etc/sysconfig/docker-storage
# 限制日志大小
journalctl --vacuum-size=100M
网络优化:
bash复制# 启用IP转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
资源限制:
bash复制# 限制单个容器资源
docker update --cpus 1.5 --memory 1G drone-runner
这套方案在我们团队已经稳定运行两年多,经历过三次大版本迭代。最大的收获是:轻量不等于简陋,合理的设计加上Docker的隔离性,完全可以构建出满足中小企业需求的CI/CD系统。对于刚开始尝试自动化的团队,建议先从核心流水线做起,再逐步扩展功能模块。