5分钟搞定Docker+Gitlab+Jenkins自动化部署SpringBoot项目(避坑指南)

张开发
2026/4/19 14:25:32 15 分钟阅读

分享文章

5分钟搞定Docker+Gitlab+Jenkins自动化部署SpringBoot项目(避坑指南)
5分钟搞定DockerGitlabJenkins自动化部署SpringBoot项目避坑指南在当今快节奏的软件开发环境中自动化部署已经成为提升团队效率的关键环节。对于使用SpringBoot框架的Java开发者来说如何快速搭建一套稳定可靠的CI/CD流水线是每个项目都会面临的挑战。本文将带你用最短的时间基于Docker容器技术结合Gitlab代码仓库和Jenkins持续集成工具构建一套完整的自动化部署方案。1. 环境准备与基础配置1.1 系统要求与前置条件在开始之前确保你有一台运行Linux系统的服务器推荐CentOS 7或Ubuntu 18.04并具备以下基本条件至少4GB内存Gitlab对内存要求较高50GB可用磁盘空间稳定的网络连接root或sudo权限常见问题排查如果遇到权限问题可以在命令前添加sudo内存不足可能导致Gitlab启动失败磁盘空间不足会影响Docker镜像构建1.2 Docker安装与优化配置Docker是整个部署架构的基础我们先从安装Docker开始# 卸载旧版本Docker如有 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 安装必要工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 设置稳定版仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装Docker引擎 sudo yum install -y docker-ce docker-ce-cli containerd.io # 启动Docker并设置开机自启 sudo systemctl start docker sudo systemctl enable docker安装完成后建议进行以下优化配置镜像加速修改/etc/docker/daemon.json文件添加国内镜像源存储驱动根据系统选择合适的存储驱动如overlay2日志限制避免容器日志占用过多磁盘空间# 创建或修改daemon.json sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://registry.docker-cn.com], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } } EOF # 重启Docker使配置生效 sudo systemctl restart docker2. Gitlab部署与项目配置2.1 Gitlab容器化部署Gitlab作为代码仓库和项目管理平台我们将使用Docker方式部署# 创建必要的目录结构 sudo mkdir -p /srv/gitlab/{config,logs,data} # 拉取Gitlab CE镜像 sudo docker pull gitlab/gitlab-ce:latest # 运行Gitlab容器 sudo docker run --detach \ --hostname gitlab.example.com \ --publish 443:443 --publish 80:80 --publish 22:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest关键参数说明--hostname设置Gitlab的访问域名--publish端口映射HTTPS:443, HTTP:80, SSH:22--volume数据持久化目录2.2 Gitlab初始配置容器启动后需要进行一些基本配置修改配置文件编辑/srv/gitlab/config/gitlab.rbexternal_url http://your-server-ip gitlab_rails[gitlab_shell_ssh_port] 22重置管理员密码# 进入容器 sudo docker exec -it gitlab /bin/bash # 进入控制台 gitlab-rails console -e production # 重置root密码 user User.where(id: 1).first user.password your_strong_password user.password_confirmation your_strong_password user.save!访问Web界面通过http://your-server-ip访问使用root和刚设置的密码登录2.3 创建项目与SSH密钥配置创建新项目登录后点击New project选择Create blank project输入项目名称如hellospringboot保持其他默认设置点击Create project生成SSH密钥本地开发机ssh-keygen -t rsa -b 4096 -C your_emailexample.com添加公钥到Gitlab复制~/.ssh/id_rsa.pub内容在Gitlab中点击右上角头像 → Settings → SSH Keys粘贴公钥并添加3. Jenkins部署与流水线配置3.1 Jenkins容器化部署Jenkins作为CI/CD的核心组件同样使用Docker部署# 创建Jenkins数据目录 sudo mkdir -p /var/jenkins_home # 设置目录权限 sudo chown -R 1000:1000 /var/jenkins_home # 拉取Jenkins LTS镜像 sudo docker pull jenkins/jenkins:lts # 运行Jenkins容器 sudo docker run -d \ --name jenkins \ -p 8080:8080 -p 50000:50000 \ -v /var/jenkins_home:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v $(which docker):/usr/bin/docker \ jenkins/jenkins:lts关键参数说明-v /var/run/docker.sock允许Jenkins容器内使用Docker-v $(which docker)挂载Docker二进制文件3.2 Jenkins初始设置获取初始管理员密码sudo docker logs jenkins 21 | grep Please use the following password访问Web界面通过http://your-server-ip:8080访问安装推荐插件选择Install suggested plugins创建管理员账户设置用户名和密码3.3 配置Jenkins环境安装必要插件Git PluginDocker PluginPipelineBlue Ocean可选配置全局工具JDK配置Java 8或11路径Maven配置Maven安装Git确保Git可执行文件路径正确配置Docker连接进入Manage Jenkins → Configure System找到Cloud部分配置Docker连接4. SpringBoot项目自动化部署实战4.1 项目结构与Dockerfile准备一个典型的SpringBoot项目结构如下hellospringboot/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ └── resources/ │ └── test/ ├── pom.xml └── DockerfileDockerfile示例FROM openjdk:8-jdk-alpine VOLUME /tmp ARG JAR_FILEtarget/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT [java,-jar,/app.jar]4.2 Jenkins流水线配置创建Jenkinsfile定义CI/CD流程pipeline { agent any environment { DOCKER_REGISTRY your-docker-registry PROJECT_NAME hellospringboot } stages { stage(Checkout) { steps { git branch: main, credentialsId: gitlab-ssh-key, url: gityour-gitlab-server:root/hellospringboot.git } } stage(Build) { steps { sh mvn clean package } } stage(Docker Build) { steps { script { docker.build(${PROJECT_NAME}:${env.BUILD_NUMBER}) } } } stage(Deploy) { steps { script { docker.withRegistry(, docker-registry-credential) { docker.image(${PROJECT_NAME}:${env.BUILD_NUMBER}).push() } sh docker stop ${PROJECT_NAME} || true sh docker rm ${PROJECT_NAME} || true sh docker run -d --name ${PROJECT_NAME} -p 8080:8080 ${PROJECT_NAME}:${env.BUILD_NUMBER} } } } } }4.3 常见问题与解决方案问题1Gitlab SSH连接失败解决方案确保Jenkins容器内有正确的SSH密钥检查Gitlab的SSH端口配置验证known_hosts是否包含Gitlab服务器指纹问题2Maven构建缓慢解决方案配置阿里云Maven镜像增加构建资源内存、CPU使用Maven的并行构建选项问题3Docker构建权限不足解决方案确保Jenkins用户有Docker执行权限检查/var/run/docker.sock权限考虑使用Docker-in-Docker方案问题4端口冲突解决方案提前规划各服务端口使用netstat -tulnp检查端口占用修改服务配置使用不同端口5. 进阶优化与监控5.1 性能优化建议资源分配为Gitlab分配至少4GB内存Jenkins构建节点配置足够资源限制容器资源使用CPU、内存缓存策略Maven本地仓库缓存Docker层缓存优化Git浅克隆shallow clone网络优化使用内网镜像仓库配置HTTP代理如有需要优化Docker网络模式5.2 监控与日志基础监控容器状态监控docker stats服务健康检查资源使用情况日志收集配置Docker日志驱动集中式日志管理ELK等日志轮转策略告警设置服务不可用告警资源阈值告警构建失败通知5.3 安全加固访问控制配置Gitlab和Jenkins的RBAC使用SSH密钥认证限制网络访问数据安全定期备份Gitlab数据加密敏感信息如凭证使用私有Docker仓库容器安全最小化基础镜像非root用户运行容器定期更新镜像这套自动化部署方案在实际项目中已经验证过多次最关键的环节是确保各组件之间的连通性和权限配置正确。当第一次成功运行后你会发现后续的项目部署变得异常简单 - 只需推送代码到Gitlab剩下的工作都会自动完成。

更多文章