在 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:流程圖
Push Code → Jenkins 觸發 → 構建 Docker 鏡像 → 單元測試 → 推送鏡像到 Registry → 遠程部署(K8s 或 Docker 運行)
三、準備工作
🔧 1. Jenkins 安裝 Docker
確保 Jenkins 所在主機已安裝 Docker 且 Jenkins 有權限使用:
# 安裝 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
示例:
pipeline {agent anyenvironment {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-stdindocker push ${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}"""}}}stage('Deploy') {steps {sh """docker pull ${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}docker stop myapp || truedocker rm myapp || truedocker 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 等輔助功能 |
六、構建參數支持(多環境發布)
parameters {choice(name: 'ENV', choices: ['dev', 'test', 'prod'], description: '部署環境')
}
配合
docker-compose
或k8s
可實現灰度、藍綠、生產環境等部署策略。
七、最佳實踐小結
建議 | 描述 |
---|---|
? 鏡像打 Tag 用 v1.0.$BUILD_NUMBER | 便于版本追蹤 |
? 用 .dockerignore 文件 | 降低構建上下文大小 |
? 鏡像推送前加安全掃描(如 Trivy) | 提前發現漏洞 |
? 部署使用 docker-compose 或 SSH 發布腳本 | 簡化操作 |
八、補充:Docker in Docker(Jenkins 容器中構建鏡像)
如果 Jenkins 自身運行在 Docker 容器里,還需要掛載宿主 Docker:
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 的主干流程。