Docke搭建:Jenkins
目录
参考:
# Docke搭建:Jenkins
# 概要说明
Jenkins,原名 Hudson,2011 年改成Jenkins。它是一个开源的实现持续集成的软件工具。
官方网站:https://www.jenkins.io/
中文文档:https://www.jenkins.io/zh/
# 什么是CI/CD?
CI、CD 其实是三个概念,包含了一个 CI 和两个 CD,CI全称 Continuous Integration,表示持续集成,CD包含 Continuous Delivery和 Continuous Deployment,分别是持续交付和持续部署。这三个概念之间是有前后依赖关系的。CI/CD 并不是一个工具,它是一种软件开发实践,核心是通过引入自动化的手段来提高软件交付效率。CI/CD 最终目的:让工程师更快 & 更高质量 & 更简单的交付软件!参考:什么是 CI/CD ? (opens new window)
# 环境依赖
软件/系统 | 版本 | 架构 | 包名 | 备注 |
---|---|---|---|---|
# 程序安装
# 镜像拉取
# lts官方长期支持版
docker pull jenkins/jenkins:lts
2
或
# BlueOcean可视化版本(含预装插件)
docker pull jenkinsci/blueocean
2
# 创建数据卷目录
# 宿主机存储 Jenkins 配置及数据的核心目录
mkdir -p /data/docker_jenkins/jenkins_home
# 避免容器内 Jenkins 用户因权限不足导致启动失败
chmod 777 /data/docker_jenkins/jenkins_home #目录读写执行权限
chown -R 1000:1000 /data/docker_jenkins/jenkins_home #目录所属权限
2
3
4
5
为何需要赋权操作?
在 Docker 中运行 Jenkins 时,如果通过 -v
将宿主机目录挂载到容器的默认数据目录,可能会因权限冲突导致容器启动失败。原因如下:
- Jenkins 容器内的服务默认以用户
Jenkins
(UID 1000)运行。 - 若宿主机目录的权限属于 root(UID 0),容器内的 jenkins 用户将无法读写该目录,引发类似 Permission denied 的错误。
替代方案:使用 docker run
时添加 -u root
参数以 root 用户运行容器,可跳过权限调整,但可能引入安全隐患。
# 启动 Jenkins 容器
docker run -d \
-u root \
-p 9000:8080 \
-p 50000:50000 \
-v /data/docker_jenkins/jenkins_home:/var/jenkins_home \
-v /etc/localtime:/etc/localtime:ro \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-e JAVA_OPTS="-Duser.timezone=Asia/Shanghai" \
--name jenkins \
--restart=always \
jenkins/jenkins:lts
2
3
4
5
6
7
8
9
10
11
12
-u root
: 以 root 用户运行容器,可避免 Jenkins 因权限不足导致的操作异常。-p 9000:8080
: Web 访问端口映射(宿主机:容器)。-p 50000:50000
:JNLP 通信端口,用于节点连接(宿主机:容器)。-v /var/jenkins_home:/var/jenkins_home
:核心数据持久化。-v /etc/localtime:/etc/localtime:ro
:同步宿主机时区,ro
表示"read-only"(只读)属性。-v /var/run/docker.sock:/var/run/docker.sock
:挂载宿主机的Docker二进制文件,允许容器内操作宿主机 Docker。-v /usr/bin/docker:/usr/bin/docker
: 挂载 Docker 客户端。-e JAVA_OPTS="-Duser.timezone=Asia/Shanghai"
:指定时区,解决时间不一致问题。--name jenkins
:为容器指定的名称。--restart=always
:设置容器的重启策略为“总是重启”。jenkins/jenkins:lts
:指定要运行的镜像。
关于/var/run/docker.sock
(Docker守护进程的通信接口)的一些了解:挂载 /var/run/docker.sock
是实现Jenkins与宿主机Docker环境集成的关键步骤,解决了容器隔离性带来的操作限制,让 Jenkins 容器能够与宿主机的 Docker 守护进程通信。通过挂载 /var/run/docker.sock
,容器内的 Jenkins 可以直接调用宿主机的 Docker 命令(例如构建镜像、启动容器等),使Jenkins能够高效完成容器化CI/CD任务。若省略此配置,Jenkins将无法直接调用Docker功能,需通过其他复杂方式(如Docker in Docker)实现类似效果。需要注意的是:这样做直接削弱容器隔离性,成为逃逸攻击的跳板。
关于-u root
的一些了解:该参数指定容器以root用户身份运行,目的是解决容器内权限不足的问题。例如:
- 避免因默认的 jenkins用户(UID 1000)权限不足,导致无法操作挂载的卷 (如 /var/jenkins_home)
- 避免因没有root 或 Docker 组权限,导致无法确保容器内能正常调用宿主机的 Docker 命令(需 root 或 Docker 组权限)。
综上:推荐在初次部署或复杂场景中同时使用这两个参数以实现完整的自动化部署能力,并建议待权限调试完成后再考虑降权。(防护需综合权限最小化、目录隔离、安全模块加固、镜像管控及实时监控等多层措施,形成纵深防御体系。)
# 初始化配置
# 获取初始密码
# 查看启动日志获取密码
docker logs jenkins
2
或
# 进入容器查看
docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
2
# 访问Web界面
通过浏览器访问 http://<服务器IP>:8080
,输入初始密码完成解锁
# 镜像加速设置
修改/data/docker/jenkins_home/hudson.model.UpdateCenter.xml
,替换更新中心地址为清华源:
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
# 程序安装(Compose)
docker-compose.yaml
services:
jenkins:
container_name: jenkins
image: jenkins/jenkins:lts
user: root
restart: always
privileged: true
ports:
- "9000:8080"
- "50000:50000"
volumes:
- /data/docker_jenkins/jenkins_home:/var/jenkins_home
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
environment:
- JAVA_OPTS=-Duser.timezone=Asia/Shanghai
deploy:
resources:
limits:
cpus: "2.0"
memory: 4G
reservations:
cpus: "1.0"
memory: 2G
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26