🧩 一、项目结构
一个典型的 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-slimWORKDIR /appCOPY target/my-app-1.0.0.jar app.jarEXPOSE 8080ENTRYPOINT ["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:latestcontainer_name: my-appports:- "8080:8080"restart: alwaysenvironment:- TZ=Asia/Shanghai
💡说明:
你可以在 Jenkins 中动态替换${BUILD_NUMBER}来控制镜像版本(例如 1.0.23)。
⚙️ 五、4️⃣ Jenkins 流水线(Jenkinsfile)
这个 Jenkinsfile 会自动执行以下步骤:
- 拉取代码
- 构建 jar
- 构建并推送 Docker 镜像
- SSH 到部署机上执行
docker-compose up -d重启容器
✅ Jenkinsfile 示例(完整可用)
pipeline {agent anyenvironment {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 代理 |