如何通过docker-compose实现Java应用DevOps全流程CICD闭环?

摘要:🧩 一、项目结构 一个典型的 Java + Docker Compose 项目可以这样组织: my-app ├── src ├── pom.xml ├── Dockerfile ├──
🧩 一、项目结构 一个典型的 Java + Docker Compose 项目可以这样组织: my-app/ ├── src/ ├── pom.xml ├── Dockerfile ├── docker-compose.yml └── Jenkinsfile 🏗️ 二、1️⃣ 打包:Maven 构建 Spring Boot 项目使用标准 Maven 命令即可: mvn clean package -DskipTests 生成文件: target/my-app-1.0.0.jar 🐳 三、2️⃣ 构建镜像:Dockerfile Dockerfile 内容如下(推荐生产级配置): FROM openjdk:17-jdk-slim WORKDIR /app COPY target/my-app-1.0.0.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","app.jar"] 🧱 四、3️⃣ 定义 docker-compose.yml docker-compose.yml version: '3' services: my-app: image: registry.cn-hangzhou.aliyuncs.com/myrepo/my-app:latest container_name: my-app ports: - "8080:8080" restart: always environment: - TZ=Asia/Shanghai 💡说明: 你可以在 Jenkins 中动态替换 ${BUILD_NUMBER} 来控制镜像版本(例如 1.0.23)。 ⚙️ 五、4️⃣ Jenkins 流水线(Jenkinsfile) 这个 Jenkinsfile 会自动执行以下步骤: 拉取代码 构建 jar 构建并推送 Docker 镜像 SSH 到部署机上执行 docker-compose up -d 重启容器 ✅ Jenkinsfile 示例(完整可用) pipeline { agent any environment { IMAGE_NAME = "registry.cn-hangzhou.aliyuncs.com/myrepo/my-app" VERSION = "1.0.${BUILD_NUMBER}" DEPLOY_HOST = "your.server.ip" DEPLOY_USER = "root" DEPLOY_PATH = "/opt/my-app" } stages { stage('Checkout') { steps { git branch: 'main', url: 'https://github.com/yourname/my-app.git' } } stage('Build Jar') { steps { sh 'mvn clean package -DskipTests' } } stage('Build Image') { steps { sh "docker build -t ${IMAGE_NAME}:${VERSION} ." } } stage('Push Image') { steps { withCredentials([usernamePassword(credentialsId: 'aliyun_docker', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) { sh "docker login -u ${USERNAME} -p ${PASSWORD} registry.cn-hangzhou.aliyuncs.com" sh "docker push ${IMAGE_NAME}:${VERSION}" } } } stage('Deploy to Server') { steps { sshagent(['server_ssh_key']) { sh """ ssh -o StrictHostKeyChecking=no ${DEPLOY_USER}@${DEPLOY_HOST} ' cd ${DEPLOY_PATH} && sed -i "s#image: .*\$#image: ${IMAGE_NAME}:${VERSION}#g" docker-compose.yml && docker-compose pull && docker-compose up -d ' """ } } } } post { success { echo "✅ 部署成功: ${IMAGE_NAME}:${VERSION}" } failure { echo "❌ 构建失败,请检查日志。" } } } 🧰 六、5️⃣ 服务器部署目录结构 在目标服务器(比如一台运行 Docker 的 Linux 服务器)上放置: /opt/my-app/ ├── docker-compose.yml └── env (可选环境变量) Jenkins 通过 SSH 登录服务器,执行: docker-compose pull && docker-compose up -d 从仓库拉取最新镜像并重启容器。 📈 七、6️⃣ 闭环管理 功能 工具 说明 代码仓库 GitLab/GitHub 提交触发构建 构建系统 Jenkins 自动化打包、推镜像、部署 镜像仓库 Harbor/阿里云 存储 Docker 镜像 部署环境 Docker Compose 管理容器运行 日志 docker logs my-app 或 ELK 查看运行日志 监控 Prometheus + Grafana 监控容器健康、性能 回滚 手动 docker-compose up -d 使用旧版本镜像 快速回滚 🔄 八、完整闭环流程图 开发提交代码 ↓ Jenkins 自动触发 ↓ Maven 打包 Jar ↓ Docker 构建镜像 ↓ 推送至镜像仓库 ↓ SSH 部署服务器 ↓ Docker Compose 启动容器 ↓ 监控/日志反馈 Jenkins ↓ 闭环 💡可选增强点 场景 建议方案 镜像清理 Jenkins 定期执行 docker image prune -a -f 多环境部署 使用不同 Compose 文件:docker-compose-dev.yml、docker-compose-prod.yml 自动触发 配合 GitLab webhook 或 Jenkins SCM Polling 零停机更新 使用 Compose 的 --scale 或 Nginx 代理