Docker 部署 Jenkins
本文是一份独立的 Jenkins 控制器容器部署参考。示例只运行 Jenkins 控制器,不直接授予其宿主 Docker 管理权限;构建执行器和容器镜像构建应按安全边界另行设计。
版本与前置条件
- 安装 Docker Engine 与 Docker Compose v2。
- 本文示例固定为 Jenkins LTS
2.568.2-lts-jdk21,便于复现。部署前应查看 Jenkins Java 支持策略和镜像标签,选择仍受支持的 LTS 补丁版本。 - 为小型团队准备至少 4 GB 内存和足够的工作区、制品与日志空间。
- 生产环境应使用反向代理、可信 TLS 证书、外部身份源或严格的本地账号策略。
Compose 部署
.env:
JENKINS_VERSION=2.568.2-lts-jdk21
compose.yaml:
services:
jenkins:
image: jenkins/jenkins:${JENKINS_VERSION}
restart: unless-stopped
ports:
- "127.0.0.1:8080:8080"
environment:
JAVA_OPTS: "-Djava.awt.headless=true"
volumes:
- jenkins-home:/var/jenkins_home
volumes:
jenkins-home:
name: jenkins-home
默认不暴露 TCP Agent 端口 50000。只有确实使用 inbound agent,并已配置防火墙和 Jenkins 安全策略时才开放该端口。
启动服务:
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=200 jenkins
首次初始化
获取一次性初始化密码:
docker compose exec jenkins \
cat /var/jenkins_home/secrets/initialAdminPassword
然后访问 http://127.0.0.1:8080,完成以下设置:
- 安装经过评估的最小插件集合。
- 创建独立管理员账号,并禁用共享账号。
- 配置 Jenkins URL、凭据存储和授权策略。
- 在反向代理上启用 HTTPS 后再允许远程访问。
健康与验证
curl --head --fail http://127.0.0.1:8080/login
docker compose ps
docker compose logs --since=10m jenkins
docker stats
/login 返回成功响应只说明 Web 入口可用。还应创建一个无敏感信息的测试任务,验证队列、执行器、制品保存和通知链路。
不要直接挂载 Docker Socket
将 /var/run/docker.sock 挂载到 Jenkins 控制器,等同于把宿主机的高权限 Docker API 交给能运行流水线的用户或插件。基础部署不应这样配置,也不应把 Docker TCP API 以无 TLS 的 2375 端口暴露出去。
需要构建容器镜像时,优先考虑:
- 使用隔离的 Jenkins Agent,并限制其凭据、网络和工作区权限。
- 使用短生命周期构建节点或受控的远程构建服务。
- 若采用 Docker-in-Docker,使用 TLS、独立网络和专用数据卷,并按 Jenkins 官方方案评估
privileged风险。
持久化与备份
全部 Jenkins 配置、插件元数据、任务和凭据存放在 jenkins-home 卷。备份前先停止新构建,并确保 Jenkins 处于静止状态;对正在变化的目录直接打包可能得到不一致备份。
停止后可使用只读挂载导出卷:
docker compose stop jenkins
docker run --rm \
-v jenkins-home:/source:ro \
-v "$PWD:/backup" \
alpine:3.22 \
tar -czf /backup/jenkins-home-backup.tgz -C /source .
docker compose start jenkins
备份文件包含敏感凭据,应加密、限制访问并保存在独立位置。恢复流程必须在隔离环境中定期演练。
升级
- 查看 Jenkins LTS 升级指南、Java 要求和插件兼容性。
- 停止构建并完成可恢复备份。
- 把
.env改为明确的 LTS 补丁版本,不使用latest。 - 执行
docker compose pull && docker compose up -d。 - 检查启动日志、插件状态、登录和测试任务。
跨越多个 LTS 基线时,应按官方升级路径逐步升级,不要直接跳到目标版本。
停止与清理
# 删除容器和网络,保留 Jenkins 数据
docker compose down
# 查看相关数据卷
docker volume ls --filter name=jenkins
只有确认加密备份可恢复且不再需要实例时,才执行 docker compose down --volumes。