使用docker运行jenkins最轻量且可复现,需挂载jenkins_home实现持久化,绑定docker.sock支持容器化构建,配合声明式pipeline和安全加固措施保障稳定高效。

直接用 Docker 运行 Jenkins 是目前最轻量、可复现性最强的部署方式。核心思路是:用官方 jenkins/jenkins:lts 镜像启动容器,挂载持久化目录(尤其是 JENKINS_HOME),并开放必要端口;后续所有插件安装、任务配置、构建执行都在容器内完成,构建过程本身也可通过 Docker-in-Docker(DinD)或绑定宿主机 Docker Socket 的方式实现容器化构建。
快速启动一个可持久化的 Jenkins 容器
避免每次重启丢失配置和插件,必须挂载 JENKINS_HOME 到宿主机目录:
- 创建本地目录:
mkdir -p /opt/jenkins_home - 运行容器(映射 8080 管理端口 + 50000 Agent 端口):
docker run -d \<br> -p 8080:8080 \<br> -p 50000:50000 \<br> --name jenkins \<br> -v /opt/jenkins_home:/var/jenkins_home \<br> -v /var/run/docker.sock:/var/run/docker.sock \<br> --restart=unless-stopped \<br> jenkins/jenkins:lts
- 首次访问
http://localhost:8080,从/opt/jenkins_home/secrets/initialAdminPassword获取初始密码
让 Jenkins 能在容器里执行 Docker 构建(关键步骤)
默认容器无法调用 Docker 命令。有两种主流方案,推荐第二种(更安全、更常用):
-
Docker Socket 绑定(推荐):上面命令中已包含
-v /var/run/docker.sock:/var/run/docker.sock,再安装 Docker Plugin 或直接在 Pipeline 中用sh 'docker build ...'即可调用宿主机 Docker 引擎 -
Docker-in-Docker(DinD):启动一个带
dockerd的辅助容器,Jenkins 容器通过网络连接它。需额外管理 dockerd 生命周期,适合隔离要求极高的场景,但复杂度高、性能略低
注意:绑定 docker.sock 意味着 Jenkins 容器拥有宿主机 Docker 权限,应确保 Jenkins 实例不暴露在公网,并启用权限控制(如 Role-Based Authorization Strategy 插件)。
编写支持容器化构建的 Jenkinsfile
使用声明式 Pipeline,在 agent 指定 docker 工具链,或直接在 sh 步骤中调用 docker 命令:
pipeline {
agent any
environment {
DOCKER_IMAGE = 'myapp:latest'
}
stages {
stage('Build') {
steps {
sh 'docker build -t $DOCKER_IMAGE .'
}
}
stage('Test') {
steps {
sh 'docker run --rm $DOCKER_IMAGE npm test'
}
}
stage('Push') {
steps {
sh 'docker push $DOCKER_IMAGE'
}
}
}
}
若需多阶段构建或使用特定基础镜像,可在 agent 中指定:agent { docker 'node:18-alpine' } —— 此时整个 stage 在临时 Node 容器中执行,无需宿主机预装 Node。
进阶建议:提升稳定性与安全性
- 用
docker-compose.yml管理 Jenkins 及其依赖(如 Nginx 反向代理、PostgreSQL 用于备份) - 定期备份
/opt/jenkins_home目录(含 jobs、plugins、credentials) - 禁用 Jenkins 默认的 Script Security 沙箱绕过(如关闭
Allow scripts to be run from anywhere) - 为构建节点单独配置资源限制(
--memory=2g --cpus=2),防止构建任务拖垮宿主机
不复杂但容易忽略:Jenkins 容器内的时间应与宿主机同步,否则流水线日志、定时触发可能异常。启动时加 --volume /etc/localtime:/etc/localtime:ro 可解决。










