CI/CD流水线配上Docker自动化部署,是网站运维团队把代码从提交到生产的一条主线。核心思路很简单:代码提交触发流水线,流水线构建镜像、跑测试、推送镜像,最后在目标环境滚动更新。本文按这条主线梳理完整流程,覆盖镜像构建、流水线编排、部署策略和回滚,附可直接用的配置示例。
镜像构建规范
Docker镜像的质量决定部署的稳定。基础镜像选alpine、debian-slim这类小体积镜像,能减小传输和启动时间。多阶段构建把编译环境和运行环境分开,最终镜像只保留可执行文件:
# 构建阶段FROM golang:1.22 AS builderWORKDIR /appCOPY . .RUN CGO_ENABLED=0 go build -o app .
# 运行阶段FROM alpine:3.20RUN adduser -D appCOPY --from=builder /app/app /usr/local/bin/appUSER appEXPOSE 8080ENTRYPOINT ["/usr/local/bin/app"]
运行阶段用非root用户启动,加上了adduser和USER指令。镜像构建成功后,push到私有仓库,并给镜像打上带提交号的标签:镜像名:git-commit号,方便回滚时精确定位版本。
流水线阶段拆分
典型CI流水线分为五个阶段:代码检出、单元测试、镜像构建、镜像推送、部署。前四个阶段在CI环境执行,部署阶段按环境拆分,开发环境直接发布,生产环境加人工确认门禁。Jenkins Pipeline的声明式写法:
pipeline { agent any stages { stage('Test') { steps { sh 'go test ./...' } } stage('Build') { steps { sh 'docker build -t registry.example.com/app:\${GIT_COMMIT} .' } } stage('Push') { steps { sh 'docker push registry.example.com/app:\${GIT_COMMIT}' } } stage('Deploy') { steps { sh './deploy.sh \${GIT_COMMIT}' } } }}
用${GIT_COMMIT}做镜像标签,保证每次构建有唯一标识。Push阶段把镜像推到私有仓库,Deploy阶段让部署脚本读取版本号,更新到目标环境。
测试环境与代码检查
单元测试跑完不代表能上线,测试环境部署一次完整集成。CI里放代码检查和单测是固定动作,检查包括golangci-lint、eslint这类工具,单测覆盖核心模块。测试环境是流水线的预发布环境,部署后跑冒烟测试,检查关键接口和健康端点,再决定是否继续往下走。
生产部署与回滚
生产环境部署用滚动更新,先起新版本容器,通过健康检查后再摘旧版本。docker compose或Kubernetes都能做,以compose为例:
docker compose up -d --no-deps --scale app=2sleep 15# 检查新容器健康状态docker compose ps | grep healthy
滚动更新期间保留旧版本容器,新版本不正常马上停掉换回旧版本。回滚前把旧版本镜像tag重新打上,再执行一次正常的up操作。
流水线卡点排查
实践中遇到最多的是三个卡点:构建慢、镜像大、测试环境不给力。构建慢靠缓存层解决,把依赖下载和源码COPY分开层;镜像大靠多阶段构建和多条指令合并;测试环境挂了会导致流水线全挂,务必把测试环境拉齐到生产配置,或直接复用生产上的独立容器。
监控方面,流水线状态接入钉钉/企微机器人,失败自动通知负责人,构建时长和部署时长单独埋点。稳定运行两个月后,这套链路就能沉淀为团队内部的标准交付流程。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/docker-zi-dong-hua-bu-shu-yu-cicd-liu-shui-xian-zui-jia-shi/