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 会自动执行以下步骤:
- 拉取代码
- 构建 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 代理 |

浙公网安备 33010602011771号