Java 应用 DevOps 全流程(CICD)闭环 - docker-compose版

🧩 一、项目结构

一个典型的 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 会自动执行以下步骤:

  1. 拉取代码
  2. 构建 jar
  3. 构建并推送 Docker 镜像
  4. 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.ymldocker-compose-prod.yml
自动触发 配合 GitLab webhook 或 Jenkins SCM Polling
零停机更新 使用 Compose 的 --scale 或 Nginx 代理
posted @ 2025-11-06 16:30  槑孒  阅读(4)  评论(0)    收藏  举报