跳到主要内容

Docker 构建 Jenkins(docker-compose 部署版本)

Jenkins 是最流行的开源 CI/CD 工具。本文按 docker-compose 方式一键部署 Jenkins + SonarQube(含 PostgreSQL 数据库),替代原 rpm 安装方式。镜像、端口、密码、目录、容器名等全部集中在 .env 中管理。

1. 宿主目录​

宿主目录用途容器内用户
/data/runtime/docker/jenkins/homeJenkins 主目录(/var/jenkins_home)uid 1000
/data/runtime/docker/sonarqube/postgresSonarQube 数据库数据uid 999
/data/runtime/docker/sonarqube/dataSonarQube 数据uid 999
/data/runtime/docker/sonarqube/logsSonarQube 日志uid 999
/data/runtime/docker/sonarqube/extensionsSonarQube 插件uid 999

若将 .env 中 *_DIR 留空,则回退使用 Docker 命名卷,无需创建宿主目录。

2. 创建宿主目录并设置权限​

SonarQube 内嵌 Elasticsearch,宿主机需先满足内核参数要求(否则 SonarQube 起不来):

# 立即生效;写入 /etc/sysctl.conf 可持久化
sudo sysctl -w vm.max_map_count=262144
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf

bind mount 首次使用需先建目录并授权(jenkins uid 1000、sonarqube/postgres uid 999):

mkdir -p /data/runtime/docker/{jenkins/home,sonarqube/{postgres,data,logs,extensions}}
chown -R 1000:1000 /data/runtime/docker/jenkins
chown -R 999:999 /data/runtime/docker/sonarqube

3. 编制 .env​

在本目录创建 .env 文件(内容如下,按需修改):

# ---------- Jenkins + SonarQube 环境变量(集中管理) ----------

# ===== 镜像配置 =====
JENKINS_IMAGE=jenkins/jenkins:lts-jdk17
SONAR_IMAGE=sonarqube:lts-community
SONAR_POSTGRES_IMAGE=postgres:16.3

# ===== 容器名 =====
JENKINS_CONTAINER_NAME=jenkins
SONAR_CONTAINER_NAME=sonarqube

# ===== 宿主机端口(宿主机:容器)=====
JENKINS_PORT=8080
JENKINS_AGENT_PORT=50000
SONAR_PORT=9000

# ===== SonarQube 数据库密码 =====
SONAR_DB_PASSWORD=sonar

# ===== 宿主机数据目录(统一约定 /data/runtime/docker/<服务>);留空则回退到命名卷 =====
JENKINS_HOME_DIR=/data/runtime/docker/jenkins/home
SONAR_DB_DIR=/data/runtime/docker/sonarqube/postgres
SONAR_DATA_DIR=/data/runtime/docker/sonarqube/data
SONAR_LOGS_DIR=/data/runtime/docker/sonarqube/logs
SONAR_EXTENSIONS_DIR=/data/runtime/docker/sonarqube/extensions
TZ=Asia/Shanghai

4. .env 变量说明​

变量说明示例
JENKINS_IMAGEJenkins 镜像(lts + jdk17)jenkins/jenkins:lts-jdk17
SONAR_IMAGESonarQube 镜像sonarqube:lts-community
SONAR_POSTGRES_IMAGEPostgreSQL 镜像postgres:16.3
JENKINS_PORT / JENKINS_AGENT_PORTJenkins Web / 构建代理端口8080 / 50000
SONAR_PORTSonarQube 端口9000
SONAR_DB_PASSWORDSonarQube 数据库密码sonar
JENKINS_HOME_DIR / SONAR_*_DIR数据目录,留空回退命名卷/data/runtime/docker/jenkins/...
TZ时区Asia/Shanghai

5. docker-compose.yml​

在本目录创建 docker-compose.yml:

services:
postgres:
image: ${SONAR_POSTGRES_IMAGE}
container_name: sonarqube-postgres
restart: always
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: ${SONAR_DB_PASSWORD}
POSTGRES_DB: sonar
TZ: ${TZ}
volumes:
- ${SONAR_DB_DIR:-sonar-db}:/var/lib/postgresql/data

sonarqube:
image: ${SONAR_IMAGE}
container_name: ${SONAR_CONTAINER_NAME}
restart: always
depends_on:
- postgres
environment:
SONAR_JDBC_URL: jdbc:postgresql://postgres:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: ${SONAR_DB_PASSWORD}
TZ: ${TZ}
ports:
- "${SONAR_PORT}:9000"
volumes:
- ${SONAR_DATA_DIR:-sonar-data}:/opt/sonarqube/data
- ${SONAR_LOGS_DIR:-sonar-logs}:/opt/sonarqube/logs
- ${SONAR_EXTENSIONS_DIR:-sonar-extensions}:/opt/sonarqube/extensions

jenkins:
image: ${JENKINS_IMAGE}
container_name: ${JENKINS_CONTAINER_NAME}
restart: always
ports:
- "${JENKINS_PORT}:8080"
- "${JENKINS_AGENT_PORT}:50000"
environment:
TZ: ${TZ}
volumes:
- ${JENKINS_HOME_DIR:-jenkins-home}:/var/jenkins_home
- /etc/localtime:/etc/localtime:ro
# 如需在容器内构建 Docker 镜像,取消下行注释(把宿主 docker 交给 jenkins 容器)
# - /var/run/docker.sock:/var/run/docker.sock
# - /usr/bin/docker:/usr/bin/docker

6. 启动​

cd Docker构建Jenkins
docker compose up -d # 启动 Jenkins + SonarQube + PostgreSQL
docker compose ps
docker compose logs -f jenkins
docker compose down # 停止并移除容器(命名卷数据保留)
docker compose down -v # 连数据卷一起清空

7. Jenkins 初始化​

Jenkins 默认端口 8080,浏览器访问 http://{jenkinsServerIP}:8080:

  1. 打开 /var/jenkins_home/secrets/initialAdminPassword 获取初始密码并粘贴
  2. 安装推荐插件,创建管理员账户
  3. 进入「系统管理 / 全局工具设置」配置 JDK / Maven(如容器内需手动安装 jdk/maven,或使用「自动安装」)

启动web控制台 验证密钥

8. 集成 SonarQube​

SonarQube 是开源代码质量管理系统,用于检测代码中的错误与漏洞、检查代码规范,可与 Jenkins 集成,在项目拉取后进行连续的代码检查。

登录 SonarQube​

浏览器访问 http://{sonarServerIP}:9000,默认账号密码 admin/admin(首次登录强制改密)。

sonar-dashboard

Jenkins 安装 SonarQube Scanner 插件​

首页 >> Manage Jenkins(系统管理) >> Manage Plugins(插件管理),安装 SonarQube Scanner for Jenkins。

install-sonarqube-scanner

生成 SonarQube 令牌​

在 SonarQube 控制台生成 token 并复制保存(后续不可见)。

sonar-token-generate

配置 Jenkins 的 SonarQube 信息​

Dashboard > Config System,填入 SonarQube 服务器地址与 token。

jenkins-sonarqube-config

配置 Sonar-scanner​

Dashboard > Global Tool Configuration,配置 SonarQube Scanner。

jenkins-sonarqube-scanner-config

构建任务中配置 Sonar Scanner​

在构建任务的「构建」步骤添加 SonarScanner,指定分析属性(项目 key、源码路径等)。

projects-sonar-scanner-config

查看扫描结果​

执行构建后,可在 SonarQube 控制台查看代码质量报告。

查看sonar扫描结果 sonar扫描详情

9. 常见问题​

容器内构建 Maven 时如遇到本地仓库权限报错(Could not create local repository),确认 /var/jenkins_home 挂载目录属主为 uid 1000(jenkins 容器内用户)或调整 JENKINS_HOME_DIR 权限:

mkdir -p /data/runtime/docker/jenkins/home
chown -R 1000:1000 /data/runtime/docker/jenkins