1. 项目概述:Docker+Jenkins+Git自动化部署体系

在现代软件开发流程中,持续集成与持续部署(CI/CD)已成为团队标配。这套技术栈通过Docker实现环境标准化,Jenkins提供自动化流水线,Git管理代码版本,形成从代码提交到生产部署的完整闭环。我在多个百万级用户项目中验证了这套方案的可靠性,部署效率提升90%以上。

2. 环境准备与工具安装

2.1 Docker引擎部署

生产环境推荐使用Linux系统安装Docker CE(社区版),以下是CentOS下的标准安装流程:

# 卸载旧版本(如有)
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

# 安装依赖工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 配置阿里云镜像源(国内加速)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装指定版本(推荐生产环境固定版本)
sudo yum install -y docker-ce-20.10.17 docker-ce-cli-20.10.17 containerd.io

# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
docker --version

关键提示:生产环境务必锁定Docker版本,避免自动升级导致兼容性问题。我曾遇到20.10.18版本与某些存储驱动不兼容的情况,回退到20.10.17后恢复正常。

2.2 Jenkins容器化部署

使用Docker运行Jenkins时需要注意挂载卷和权限配置:

# 创建数据卷目录(避免容器删除数据丢失)
sudo mkdir -p /var/jenkins_home
sudo chown 1000:1000 /var/jenkins_home

# 运行Jenkins容器(带Docker in Docker支持)
docker run -d --name jenkins \
  -u root \
  -p 8080:8080 -p 50000:50000 \
  -v /var/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $(which docker):/usr/bin/docker \
  jenkins/jenkins:lts-jdk11

首次启动后需要:

  1. 通过 docker logs jenkins 获取初始密码
  2. 访问 http://服务器IP:8080 完成向导
  3. 安装推荐插件(包括Git、Pipeline等)

3. 核心配置详解

3.1 Jenkins系统配置

3.1.1 全局工具配置

路径:Manage Jenkins > Global Tool Configuration

  • JDK:建议使用容器内置JDK(/docker-java-home)
  • Git:选择自动安装(最新版)
  • Maven:添加3.8.6版本(与大多数项目兼容)
3.1.2 凭据管理

添加以下关键凭据:

  1. Git仓库SSH密钥(类型:SSH Username with private key)
  2. Docker Hub账号(如需推送镜像)
  3. 服务器SSH登录凭据(如需远程部署)

3.2 流水线构建配置

3.2.1 创建Pipeline项目
  1. 新建Item > 选择Pipeline类型
  2. 在Pipeline部分选择"Pipeline script from SCM"
  3. 配置Git仓库地址和凭据
  4. 指定Jenkinsfile路径(默认为根目录)
3.2.2 Jenkinsfile示例
pipeline {
    agent any
    
    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', 
                     credentialsId: 'git-ssh-key', 
                     url: 'git@github.com:your/repo.git'
            }
        }
        
        stage('Build') {
            steps {
                sh 'mvn clean package -DskipTests'
            }
        }
        
        stage('Docker Build') {
            steps {
                script {
                    docker.build("myapp:${env.BUILD_ID}")
                }
            }
        }
        
        stage('Deploy') {
            steps {
                sh '''
                docker stop myapp || true
                docker rm myapp || true
                docker run -d -p 8080:8080 --name myapp myapp:${BUILD_ID}
                '''
            }
        }
    }
}

4. 高级实践与优化

4.1 多阶段Docker构建

优化Dockerfile减少镜像体积:

# 构建阶段
FROM maven:3.8.6-jdk-11 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests

# 运行阶段
FROM openjdk:11-jre-slim
COPY --from=builder /app/target/*.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

4.2 构建缓存优化

在Jenkinsfile中添加缓存配置:

stage('Build') {
    steps {
        sh 'mvn -Dmaven.repo.local=.m2/repository clean package'
    }
    post {
        success {
            stash includes: '.m2/repository/**', name: 'm2cache'
        }
    }
}

下次构建时可通过 unstash 'm2cache' 恢复缓存。

5. 常见问题排查

5.1 权限问题汇总

现象 解决方案
Docker命令报权限拒绝 将Jenkins用户加入docker组: sudo usermod -aG docker jenkins
Git克隆失败 检查SSH密钥是否绑定到Jenkins用户而非root
文件写入失败 确保 /var/jenkins_home 目录权限为1000:1000

5.2 性能优化技巧

  1. 为Jenkins容器分配固定内存: -m 4g --memory-swap=4g
  2. 使用国内镜像源加速构建:
    # Maven镜像配置
    cat > settings.xml <<EOF
    <mirror>
      <id>aliyun</id>
      <mirrorOf>central</mirrorOf>
      <name>Aliyun Maven</name>
      <url>https://maven.aliyun.com/repository/central</url>
    </mirror>
    EOF
    
  3. 定期清理Docker资源:
    docker system prune -f --filter "until=24h"
    

6. 安全加固方案

6.1 Jenkins安全配置

  1. 启用RBAC:Role-Based Access Control插件
  2. 关闭JNLP端口:在全局安全设置中禁用
  3. 定期备份 /var/jenkins_home 目录

6.2 Docker安全实践

  1. 使用非root用户运行容器:
    FROM openjdk:11-jre-slim
    RUN useradd -ms /bin/bash appuser
    USER appuser
    
  2. 扫描镜像漏洞:
    docker scan myapp:latest
    
  3. 限制容器资源:
    docker run --cpus=1 --memory=1g ...
    

这套方案在多个生产环境稳定运行超过2年,单次部署时间从原来的15分钟缩短到2分钟以内。最关键的是要保持各组件版本兼容性,建议定期测试新版本在测试环境的稳定性后再进行生产环境升级。

更多推荐