在 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 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 等辅助功能 |
六、构建参数支持(多环境发布)
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 的主干流程。