在 CI/CD 流程中使用 Jenkins 与 Docker 集成

在 CI/CD 流程中,Jenkins 与 Docker 的集成 可以实现自动构建、测试、打包、发布容器镜像,并部署到测试/生产环境。下面是从概念到落地操作的完整集成方案


一、常见的集成方式有哪些?

方式 描述
1️⃣ Jenkins 主机安装 Docker Jenkins 可以直接执行构建镜像、运行容器等命令
2️⃣ 使用 Docker-in-Docker(DinD) Jenkins 容器内部执行 Docker 命令,适用于容器化 Jenkins
3️⃣ 使用 Jenkins Docker 插件 动态拉起 Docker 容器作为 Agent

二、使用 Jenkins + Docker 实现 CI/CD:流程图

text 复制代码
Push Code → Jenkins 触发 → 构建 Docker 镜像 → 单元测试 → 推送镜像到 Registry → 远程部署(K8s 或 Docker 运行)

三、准备工作

🔧 1. Jenkins 安装 Docker

确保 Jenkins 所在主机已安装 Docker 且 Jenkins 有权限使用:

bash 复制代码
# 安装 Docker(Ubuntu 示例)
sudo apt update && sudo apt install -y docker.io

# 添加 Jenkins 用户到 docker 组
sudo usermod -aG docker jenkins
sudo systemctl restart docker

⚠️ 需要重启 Jenkins 服务,使组权限生效。


四、Jenkins Pipeline 示例(核心部分)

📄 Jenkinsfile 示例:

groovy 复制代码
pipeline {
  agent any

  environment {
    REGISTRY = "registry.mycompany.com"
    IMAGE_NAME = "myapp"
    IMAGE_TAG = "v1.0.${BUILD_NUMBER}"
  }

  stages {
    stage('Checkout') {
      steps {
        checkout scm
      }
    }

    stage('Build Docker Image') {
      steps {
        sh """
          docker build -t ${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} .
        """
      }
    }

    stage('Push to Registry') {
      steps {
        withCredentials([usernamePassword(credentialsId: 'docker-registry', usernameVariable: 'USER', passwordVariable: 'PASS')]) {
          sh """
            echo "$PASS" | docker login ${REGISTRY} -u "$USER" --password-stdin
            docker push ${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
          """
        }
      }
    }

    stage('Deploy') {
      steps {
        sh """
          docker pull ${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
          docker stop myapp || true
          docker rm myapp || true
          docker run -d --name myapp -p 8080:8080 ${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
        """
      }
    }
  }
}

五、Jenkins 插件推荐(可选)

插件名称 用途
Docker Pipeline Plugin 支持在 Pipeline 中使用 docker.image(...) 等方法
Docker Commons Plugin 处理镜像标签和凭据
Docker API Plugin 调用 Docker API
Pipeline Utility Steps 处理 JSON/YAML 等辅助功能

六、构建参数支持(多环境发布)

groovy 复制代码
parameters {
  choice(name: 'ENV', choices: ['dev', 'test', 'prod'], description: '部署环境')
}

配合 docker-composek8s 可实现灰度、蓝绿、生产环境等部署策略。


七、最佳实践小结

建议 描述
✅ 镜像打 Tag 用 v1.0.$BUILD_NUMBER 便于版本追踪
✅ 用 .dockerignore 文件 降低构建上下文大小
✅ 镜像推送前加安全扫描(如 Trivy) 提前发现漏洞
✅ 部署使用 docker-compose 或 SSH 发布脚本 简化操作

八、补充:Docker in Docker(Jenkins 容器中构建镜像)

如果 Jenkins 自身运行在 Docker 容器里,还需要挂载宿主 Docker:

yaml 复制代码
docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v jenkins_home:/var/jenkins_home \
  jenkins/jenkins:lts

九、总结一句话:

Jenkins 与 Docker 集成,可以将代码自动构建成镜像,推送到镜像仓库,并实现远程自动部署,构建起现代 CI/CD 的主干流程。


相关推荐
記億揺晃着的那天25 分钟前
CI/CD 是如何改变软件世界的?
ci/cd
梁正雄1 小时前
19、docker跨主机网络 Overlay\Underlay
网络·docker·容器
西部森林牧歌2 小时前
Arbess零基础学习 - 使用Arbess+GitLab实现Node.js项目自动化构建/主机部署
ci/cd·node.js·gitlab·arbess·tiklab devops
西部森林牧歌4 小时前
Arbess零基础学习 - 使用Arbess+GitLab实现 React.js 项目自动化构建/主机部署
react.js·ci/cd·arbess·tiklab devops
Hover_Z_快跑5 小时前
Docker 部署 Elasticsearch 8.12 + Kibana + Nginx 负载均衡
nginx·elasticsearch·docker
爱宇阳6 小时前
Vue3 前端项目 Docker 容器化部署教程
前端·docker·容器
帅帅梓6 小时前
docker 资源限制
运维·docker·容器
可乐大数据8 小时前
Docker安装(基于云服务器ECS实例 CentOS 7.9系统)
服务器·docker·centos
一只大耗子。10 小时前
Mac M系列芯片制作Oracle19镜像使用docker-compose运行
docker·docker-compose·mac·oracle19c
梁正雄10 小时前
18、docker-macvlan-2-示例
运维·docker·容器·macvlan