@[TOC](Docker 部署 Jenkins持续集成(CI)工具)
前言
Jenkins 是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中。通过 Docker 部署 Jenkins,可以简化安装和配置过程,并让你方便地管理 Jenkins 容器。
本文将介绍如何使用 Docker 部署 Jenkins,并对比两种端口配置方式:使用 host 网络模式 和使用 port 映射来设置 Jenkins 容器的访问端口。
一、准备工作
首先,确保你的系统上已经安装了 Docker。
Linux上进行Docker安装有两种方式:
- Docker自动化安装
- Docker手动安装
可以根据该文章的步骤进行安装:https://blog.csdn.net/weixin_44876263/article/details/136714078?spm=1001.2014.3001.5502
二、设置变量和目录结构
在部署 Jenkins 之前,首先设置一些变量并创建相关目录,以确保 Jenkins 数据和日志能够持久化存储。
bash
#!/bin/bash
# 设置变量
PORT=8081
PROJECT_DIR="/opt/docker/jenkins"
# 创建目录结构
mkdir -p "$PROJECT_DIR/jenkins_home"
mkdir -p "$PROJECT_DIR/logs"
PORT=8081
设置 Jenkins 容器暴露的端口。可以根据需求修改为其他端口。PROJECT_DIR
是 Jenkins 配置和数据存储的根目录。- 创建
jenkins_home
目录来存储 Jenkins 的数据。 - 创建
logs
目录来存储 Jenkins 的日志文件。
三、配置 Docker 权限和网络
运行 Jenkins 容器时,我们可能需要赋予它一些特权和网络设置,具体如下:
--privileged=true
:该选项赋予容器管理员权限,这样容器可以执行更多操作。需要评估是否赋予这个权限。--network=host
:使容器与主机共享网络堆栈,而不进行端口映射。Jenkins 将直接使用主机的端口。--cap-add=NET_ADMIN
:允许容器管理网络接口,某些 Jenkins 插件可能需要此权限。--cap-add=SYS_PTRACE
:允许容器内的进程进行调试,通常用于调试工具或监控进程。
四、启动 Jenkins 容器
1. 使用 host 网络模式(共享主机网络)
通过设置 --network host
,容器将直接使用宿主机的网络堆栈。此时,不需要端口映射,容器会占用主机上的端口 8080。因此,访问 Jenkins 的 URL 会直接是宿主机的 IP 地址。
bash
# 运行 Jenkins 容器(使用 host 网络)
docker run -d \
--restart=always \
--cap-add=SYS_PTRACE \
--cap-add=NET_ADMIN \
--name jenkins \
-u root \
-e JENKINS_OPTS="--httpPort=$PORT" \
-v "$PROJECT_DIR/jenkins_home:/var/jenkins_home" \
-v "$PROJECT_DIR/logs:/var/log/jenkins" \
-v "/var/run/docker.sock:/var/run/docker.sock" \
-v "/etc/localtime:/etc/localtime" \
--network host \
jenkins/jenkins:lts-alpine-jdk17
修改 host模式下 Jenkins
端口的正确方法:
如果你需要更改 Jenkins URL 或 端口 ,可以直接修改 jenkins.model.JenkinsLocationConfiguration.xml
文件。
这个文件通常位于 Jenkins
的数据目录中(即 /var/jenkins_home
)。
-
找到并打开
/var/jenkins_home/jenkins.model.JenkinsLocationConfiguration.xml
文件。 -
修改 标签中的端口部分,例如:
bash<jenkinsUrl>http://localhost:8081/</jenkinsUrl>
优点:
- 不需要额外的端口映射,容器和主机共享网络堆栈。
- 对于没有多个容器的简单环境,配置非常方便。
缺点:
- 端口直接共享主机端口,因此如果主机上有其他服务占用了相同的端口,可能会导致冲突。
- 不能灵活配置容器的端口映射。
2. 使用 port 映射(绑定特定端口)
如果你想控制容器的端口映射,或者在一台机器上运行多个 Docker 容器,可以使用 -p
参数将宿主机的端口映射到容器的端口。在这种情况下,Jenkins 容器会绑定到宿主机的指定端口,而不是共享整个主机的网络。
bash
# 运行 Jenkins 容器(使用端口映射)
docker run -d \
--restart=always \
--cap-add=SYS_PTRACE \
--cap-add=NET_ADMIN \
--name jenkins \
-u root \
-p "$PORT:8080" \
-v "$PROJECT_DIR/jenkins_home:/var/jenkins_home" \
-v "$PROJECT_DIR/logs:/var/log/jenkins" \
-v "/var/run/docker.sock:/var/run/docker.sock" \
-v "/etc/localtime:/etc/localtime" \
jenkins/jenkins:lts-alpine-jdk17
优点:
- 容器和宿主机的网络堆栈相互隔离,避免了端口冲突。
- 可以灵活设置宿主机与容器之间的端口映射。
- 适合在单台机器上运行多个容器时使用不同的端口。
缺点:
- 需要手动设置端口映射(如果有多个容器)。
五、Docker 内安装 Docker 环境
如果你需要在 Jenkins 容器内执行 Docker 命令(例如,构建 Docker 镜像),你可以通过在容器中安装 Docker 客户端来实现:
bash
# 安装 Docker CLI 工具
apk add docker-cli
这将允许 Jenkins 在容器内部调用 Docker 命令。
六、访问 Jenkins
无论你选择了哪种端口配置方式,你都可以通过浏览器访问 Jenkins Web 界面:
- 使用
host
网络模式 :访问http://<your-server-ip>:8080
,直接通过主机的 IP 地址。 - 使用
port
映射 :访问http://<your-server-ip>:8081
,通过宿主机上映射的端口(在这里是 8081)。
首次访问时,Jenkins 会要求你输入解锁密钥。你可以在容器日志中找到该密钥:

复制并粘贴日志中的密钥,完成 Jenkins 的初始设置。
总结
通过 Docker 部署 Jenkins 容器并设置端口映射或共享主机网络堆栈,都是部署 Jenkins 的有效方式。选择哪种方式,取决于你的具体需求:
- 如果你希望容器与宿主机共享网络,避免端口映射,选择
host
网络模式。 - 如果你需要灵活地控制容器与宿主机的端口映射,选择
port
映射 方式。
通过这种方式,你可以轻松地在 Docker 中管理 Jenkins 环境,提升持续集成和持续交付的效率。