Docker Compose安装部署Jenkins
-
- 一、概述
- 二、前置条件
- 三、目录规划
- [四、docker-compose.yml 配置说明](#四、docker-compose.yml 配置说明)
- 五、部署步骤
-
- [5.1 处理数据目录权限(重要)](#5.1 处理数据目录权限(重要))
- [5.2 创建并启动](#5.2 创建并启动)
- [5.3 查看启动日志](#5.3 查看启动日志)
- 六、初始化配置
-
- [6.1 访问 Jenkins](#6.1 访问 Jenkins)
- [6.2 选择插件](#6.2 选择插件)
- [6.3 创建管理员账号](#6.3 创建管理员账号)
- [6.4 配置 Jenkins URL](#6.4 配置 Jenkins URL)
- 七、推荐安装插件
- 八、日常运维
-
- [8.1 常用命令](#8.1 常用命令)
- [8.2 备份](#8.2 备份)
- [8.3 版本升级](#8.3 版本升级)
- [8.4 磁盘清理](#8.4 磁盘清理)
- 九、常见问题
-
- [9.1 Permission denied / 容器不断重启](#9.1 Permission denied / 容器不断重启)
- [9.2 端口冲突](#9.2 端口冲突)
- [9.3 插件下载慢或失败](#9.3 插件下载慢或失败)
- [9.4 容器内存不足 (OOM)](#9.4 容器内存不足 (OOM))
- [9.5 时区不正确](#9.5 时区不正确)
- 十、安全建议
一、概述
本文档介绍如何通过 Docker Compose 在 Ubuntu 服务器上部署 Jenkins LTS 版本。
相比 apt install jenkins,Docker Compose 方式有以下优势:环境隔离、版本升级方便、配置可追溯、便于迁移和备份。
部署规划:
| 项目 | 说明 |
|---|---|
| 镜像 | jenkins/jenkins:lts-jdk17 (官方 LTS,内置 JDK 17) |
| 部署目录 | /data/apps/cicd/jenkins/ |
| 数据目录 | /data/docker/jenkins_home (宿主机持久化) |
| 访问地址 | http://<服务器IP>:10000 |
| Agent 端口 | 50000 (Jenkins Agent 连接用) |
二、前置条件
服务器需要安装以下软件:
bash
# 检查 Docker 是否已安装
docker --version
# 检查 Docker Compose 是否已安装 (Docker 20.10+ 已内置 compose 插件)
docker compose version
如果未安装 Docker,可以使用官方安装脚本:
bash
curl -fsSL https://get.docker.com | sh
systemctl enable docker && systemctl start docker
三、目录规划
plain
/data/
├── apps/
│ └── cicd/
│ └── jenkins/ ← Jenkins 部署目录
│ └── docker-compose.yml ← Compose 配置文件
└── docker/
└── jenkins_home/ ← Jenkins 数据目录 (持久化)
├── config.xml ← Jenkins 主配置 (初始化后生成)
├── jobs/ ← 所有 Job 配置
├── plugins/ ← 已安装插件
├── secrets/ ← 凭据和密钥
└── ...
创建目录:
bash
mkdir -p /data/apps/cicd/jenkins
mkdir -p /data/docker/jenkins_home
四、docker-compose.yml 配置说明
在 /data/apps/cicd/jenkins/ 下创建 docker-compose.yml:
yaml
version: '3.8'
services:
jenkins:
image: jenkins/jenkins:lts-jdk17
container_name: jenkins
user: jenkins
restart: always
ports:
- "10000:8080"
- "50000:50000"
volumes:
- /data/docker/jenkins_home:/var/jenkins_home
environment:
- TZ=Asia/Shanghai
- JAVA_OPTS=-Xms512m -Xmx1024m -Dhudson.model.DownloadService.noSignatureCheck=true -Duser.timezone=Asia/Shanghai
- JENKINS_OPTS=--httpPort=8080 --prefix=/jenkins
各配置项说明:
| 配置项 | 说明 |
|---|---|
image: jenkins/jenkins:lts-jdk17 |
官方长期支持版,内置 JDK 17,稳定可靠 |
container_name: jenkins |
容器名称,可按需修改 |
user: jenkins |
以 jenkins 用户 (UID 1000) 运行,而非 root,更安全 |
restart: always |
容器异常退出或服务器重启后自动恢复 |
ports: "10000:8080" |
宿主机 10000 端口映射到容器内 8080,避免与其他服务冲突 |
ports: "50000:50000" |
Jenkins Agent 通信端口,分布式构建时需要 |
volumes |
宿主机目录挂载到容器,Jenkins 所有数据持久化在此 |
JAVA_OPTS |
JVM 参数:最小堆 512M,最大堆 1024M,跳过插件签名检查加速下载 |
JENKINS_OPTS |
Jenkins 启动参数,指定 HTTP 监听端口 |
networks |
使用独立 bridge 网络,与其他容器网络隔离 |
可选的 JAVA_OPTS 调优(根据服务器内存):
| 服务器内存 | 推荐配置 |
|---|---|
| 2G | -Xms256m -Xmx512m |
| 4G | -Xms512m -Xmx1024m (默认) |
| 8G+ | -Xms1024m -Xmx2048m |
五、部署步骤
5.1 处理数据目录权限(重要)
Jenkins 容器以 jenkins 用户运行,该用户 UID 为 1000。宿主机挂载目录必须归属该 UID,否则容器无法写入数据,会报 Permission denied 并不断重启。
bash
chown -R 1000:1000 /data/docker/jenkins_home
说明: 宿主机上可能不存在 UID 1000 的用户名映射,
ls -ln会显示数字 1000 而非用户名,这是正常的,不影响功能。
5.2 创建并启动
bash
cd /data/apps/cicd/jenkins
docker compose up -d
5.3 查看启动日志
bash
docker logs -f jenkins
首次启动需要 1-3 分钟初始化,等待日志中出现以下内容表示启动成功:
plain
2026-06-01 08:40:39.236+0000 [id=31] INFO jenkins.install.SetupWizard#init:
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
375d226fcc0d4881966acdec26e6a007
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
2026-06-01 08:40:47.821+0000 [id=45] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization
2026-06-01 08:40:47.852+0000 [id=25] INFO hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running
复制日志中的那串密码,后面初始化向导要用。
如果日志滚动太快,可以退出后通过以下命令单独获取密码:
bash
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
六、初始化配置
6.1 访问 Jenkins
浏览器打开 http://<服务器IP>:10000,输入上一步获取的初始密码。
如果访问返回:

解决办法:
无法访问网站ERR_CONNECTION_TIMED_OUT 说明端口没通,大概率是云服务器安全组没有放行 10000 端口。如果是云服务器,去云控制台(火山引擎/阿里云),找到这台服务器的安全组规则,添加入方向规则:
| 协议 | 端口 | 来源 | 说明 |
|---|---|---|---|
| TCP | 10000 | 0.0.0.0/0 (或你的办公 IP) | Jenkins Web |
协议端口来源说明TCP100000.0.0.0/0 (或你的办公 IP)Jenkins Web同时在服务器防火墙也确认一下:
shell
# 查看防火墙状态
ufw status
# 如果启用了 ufw,放行 10000
ufw allow 10000/tcp
如果用的是 iptables:
shell
iptables -I INPUT -p tcp --dport 10000 -j ACCEPT
操作步骤汇总:
shell
# 1. 修改 docker-compose.yml(加上时区配置)
cd /data/apps/cicd/jenkins
# 2. 重启容器使配置生效
docker compose down && docker compose up -d
# 3. 确认容器正常运行
docker ps | grep jenkins
# 4. 去云控制台开放安全组 10000 端口
# 5. 再试浏览器访问
# http://115.xxx.xx.198:10000
如果是通过nginx代理转发的需要增加以下配置指定前缀/jenkins:
yaml
environment:
- TZ=Asia/Shanghai
- JAVA_OPTS=-Xms512m -Xmx1024m -Dhudson.model.DownloadService.noSignatureCheck=true -Duser.timezone=Asia/Shanghai
- JENKINS_OPTS=--httpPort=8080 --prefix=/jenkins
nginx配置添加如下:
nginx
location /jenkins/ {
proxy_pass http://172.17.0.1:8080/jenkins/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_request_buffering off;
proxy_set_header Connection $http_connection;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
6.2 选择插件
在 "Customize Jenkins" 页面,建议选择 "Install suggested plugins"(安装推荐插件),Jenkins 会自动安装常用插件,包括:
- Git Plugin --- Git 代码拉取
- Pipeline --- Pipeline 流水线支持
- SSH Agent Plugin --- SSH 远程部署
- Blue Ocean --- 现代化 Pipeline 可视化界面(可选)
PS:其他插件推荐:
结合你的实际场景(Spring Boot + Vue/React、Gogs 仓库、SSH 远程部署、钉钉通知),建议额外装这几个:必装:
- Publish Over SSH --- 通过 SSH 把构建产物(jar 包、前端 dist)传输到目标服务器,配合 deploy.sh 脚本用,比 SSH Agent Plugin 更直观
- Build User Vars Plugin --- Pipeline 里能拿到当前是谁点击的构建,钉钉通知里可以显示"张三触发了构建"
- Workspace Cleanup Plugin --- 每次构建前自动清理工作空间,避免磁盘越占越大
- Role-based Authorization Strategy --- 基于角色的权限管理,可以区分谁能部署生产、谁只能部署测试环境
- Pipeline: Stage View --- 在 Job 列表页直观看到每个阶段的执行状态和耗时
推荐:
- Ansicolor Plugin --- Pipeline 日志支持彩色输出,看日志舒服很多
- Timestamper --- 日志里每行前面加时间戳,排查问题方便
- Build Name and Description Setter --- 构建历史显示分支名和环境,比如显示 #12 master→prod 而不是只有个 #12
- DingTalk Plugin --- 如果你不想用脚本方式发钉钉通知,可以用这个插件直接配置
后续 K8s 阶段再装:
- Kubernetes Plugin --- 动态创建 Jenkins Agent Pod
- Docker Pipeline --- Pipeline 里构建和推送 Docker 镜像
这些在 Manage Jenkins → Plugins → Available plugins 里搜索安装就行,装完重启 Jenkins 生效。
6.3 创建管理员账号
插件安装完成后,创建第一个管理员用户,填写用户名、密码、邮箱等信息。

默认安装如果有挺多失败是正常现象,大概率是国内网络访问 Jenkins 官方插件源太慢导致下载超时。带 ✗ 的就是安装失败的。
先别管这些失败的,继续往下走完初始化流程(创建管理员账号、设置 URL),然后换国内镜像源再重新装:
第一步:配置清华镜像源
进入 Manage Jenkins → Plugins → Advanced settings(左侧菜单找),把 Update Site 的 URL 改成:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
点 Submit 保存,然后点页面底部的 Check now 刷新一下。
第二步:重新安装失败的插件
进入 Manage Jenkins → Plugins → Available plugins,搜索安装之前失败的那几个:
Timestamper
Workspace Cleanup
Build Timeout
Credentials Binding
这几个是核心功能插件,装上就行。其他的像 Ant、Mailer 你用不到,不装也没关系。之前我建议的那些额外插件(Publish Over SSH、Build User Vars 等)也在这一步一起搜索安装。
装完之后点 Restart Jenkins when installation is complete and no jobs are running,重启一下就都生效了。
6.4 配置 Jenkins URL
确认 Jenkins 的访问地址为 http://<服务器IP>:10000/jenkins/(如果配置了nginx则使用nginx代理地址),点击保存完成初始化。
七、推荐安装插件
初始化完成后,根据 CI/CD 方案需要,进入 Manage Jenkins → Manage Plugins → Available 安装以下插件:
| 插件名称 | 用途 |
|---|---|
| SSH Agent Plugin | Pipeline 中通过 SSH 远程执行部署脚本 |
| Publish Over SSH | 将构建产物传输到目标服务器 |
| DingTalk Plugin | 钉钉通知(也可用脚本方式实现) |
| Role-based Authorization Strategy | 基于角色的权限管理 |
| Build User Vars Plugin | 在 Pipeline 中获取触发构建的用户名 |
| Workspace Cleanup Plugin | 构建后自动清理工作空间 |
| GitLab Plugin | (可选) 未来迁移 GitLab 后使用 |
安装路径:Manage Jenkins → Manage Plugins → Available plugins → 搜索插件名 → 勾选 → Install
八、日常运维
8.1 常用命令
bash
# 启动
cd /data/apps/cicd/jenkins && docker compose up -d
# 停止
cd /data/apps/cicd/jenkins && docker compose down
# 重启
cd /data/apps/cicd/jenkins && docker compose restart
# 查看日志 (实时跟踪)
docker logs -f jenkins-test
# 查看最近 100 行日志
docker logs --tail 100 jenkins-test
# 进入容器排查
docker exec -it jenkins-test bash
8.2 备份
Jenkins 所有数据都在 /data/docker/jenkins_home 目录,备份只需打包这个目录:
bash
# 备份(建议在业务低峰期执行)
tar -czf /data/backup/jenkins_home_$(date +%Y%m%d_%H%M%S).tar.gz \
-C /data/docker jenkins_home
# 恢复
# 1. 先停止容器
cd /data/apps/cicd/jenkins && docker compose down
# 2. 清空并解压备份
rm -rf /data/docker/jenkins_home/*
tar -xzf /data/backup/jenkins_home_XXXXXXXX.tar.gz -C /data/docker/
# 3. 确保权限正确
chown -R 1000:1000 /data/docker/jenkins_home
# 4. 重新启动
docker compose up -d
8.3 版本升级
bash
cd /data/apps/cicd/jenkins
# 拉取最新 LTS 镜像
docker compose pull
# 重新创建容器(会自动使用新镜像)
docker compose up -d
# 确认版本
docker exec jenkins java -jar /usr/share/jenkins/jenkins.war --version
升级前建议先备份
jenkins_home目录,升级后 Jenkins 会自动迁移插件和数据格式。
8.4 磁盘清理
Jenkins 长期使用后,构建历史和日志会占用大量磁盘空间:
bash
# 查看 jenkins_home 目录大小
du -sh /data/docker/jenkins_home
# 查看各子目录占用
du -sh /data/docker/jenkins_home/*/ | sort -rh | head -10
建议在 Jenkins 中配置全局构建保留策略:Manage Jenkins → Configure System → Discard old builds,设置每个 Job 保留最近 10-20 次构建。
九、常见问题
9.1 Permission denied / 容器不断重启
现象: docker logs 显示 missing rw permissions on JENKINS_HOME,容器反复重启。
原因: 宿主机 /data/docker/jenkins_home 目录权限不对,容器内 jenkins 用户 (UID 1000) 无法写入。
解决:
bash
chown -R 1000:1000 /data/docker/jenkins_home
cd /data/apps/cicd/jenkins && docker compose restart
9.2 端口冲突
现象: docker compose up 报错 bind: address already in use。
排查:
bash
# 查看 10000 端口被哪个进程占用
lsof -i :10000
# 或者
ss -tlnp | grep 10000
解决: 停掉占用端口的进程,或修改 docker-compose.yml 中的宿主机端口(比如改为 10001:8080)。
9.3 插件下载慢或失败
原因: Jenkins 默认从国外源下载插件。
解决: 在 docker-compose.yml 的 JAVA_OPTS 中加入国内镜像加速:
yaml
environment:
- JAVA_OPTS=-Xms512m -Xmx1024m
-Dhudson.model.DownloadService.noSignatureCheck=true
-Dhudson.model.UpdateCenter.updateCenterUrl=https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
或者在 Jenkins 初始化完成后,进入 Manage Jenkins → Manage Plugins → Advanced,将 Update Site URL 改为:
plain
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
9.4 容器内存不足 (OOM)
现象: 容器被系统杀掉,dmesg 或 docker inspect 显示 OOMKilled: true。
解决: 增大 JAVA_OPTS 中的堆内存,同时确认服务器有足够的可用内存:
yaml
environment:
- JAVA_OPTS=-Xms1024m -Xmx2048m ...
9.5 时区不正确
现象: Jenkins 中显示的构建时间与服务器时间不一致。
解决: 在 docker-compose.yml 中添加时区配置:
yaml
environment:
- TZ=Asia/Shanghai
- JAVA_OPTS=-Xms512m -Xmx1024m ...
同时可以在 JAVA_OPTS 中强制 JVM 时区:-Duser.timezone=Asia/Shanghai
十、安全建议
- 防火墙: 仅对需要访问 Jenkins 的 IP 开放 10000 端口,不建议对公网全开
- 反向代理: 生产环境建议通过 Nginx 反向代理 + HTTPS 访问,而非直接暴露端口
- 定期备份 : 设置定时任务每天备份
jenkins_home目录 - 插件管理: 只安装必要插件,定期更新插件修复安全漏洞
- 权限管理: 使用 Role-based Authorization Strategy 插件为不同人员分配不同权限
本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位指出。
主页 :共饮一杯无的博客汇总👨💻
保持热爱,奔赴下一场山海。🏃🏃🏃
