目录
[1.1 开通阿里云容器镜像服务(ACR)](#1.1 开通阿里云容器镜像服务(ACR))
[1.2 代码库中添加 Dockerfile(核心)](#1.2 代码库中添加 Dockerfile(核心))
[1.3 下载并安装Docker](#1.3 下载并安装Docker)
[1.4 准备JAR文件](#1.4 准备JAR文件)
[1.5 构建Docker镜像](#1.5 构建Docker镜像)
[1.6 本地运行测试](#1.6 本地运行测试)
[1.7 本地docker登录阿里云ACR](#1.7 本地docker登录阿里云ACR)
[2.1 流水线源](#2.1 流水线源)
[2.2 Java镜像构建](#2.2 Java镜像构建)
[2.3 Docker部署](#2.3 Docker部署)
目标:想把基于云效流水线、手动部署 JDK17+deploy.sh 启动的 Java 项目,改造成 Docker 化部署,核心目标是让 ECS 无需手动装 JDK,直接通过流水线完成 Docker 化部署。
一、前置准备
1.1 开通阿里云容器镜像服务(ACR)
Docker 镜像需要一个仓库存储,推荐用阿里云 ACR(免费版足够用)



创建命名空间 (如your-namespace)→ 创建镜像仓库 (如java-app),仓库类型选「公开 / 私有」(私有更安全)→ 选择codeup对应的项目;

记录镜像仓库地址:registry.cn-hangzhou.aliyuncs.com/your-namespace/java-app:latest(地域按你的 ECS 调整)。
1.2 代码库中添加 Dockerfile(核心)
在你的 Java 项目根目录下创建Dockerfile(适配 JDK17,轻量 Alpine 版本),内容如下:
bash
# 基础镜像:Alpine系统 + JDK17运行时(仅100MB左右,比全量JDK省资源)
FROM openjdk:17-jre-alpine
# 解决Alpine时区问题(避免项目时间错误)
RUN apk add --no-cache tzdata && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
# 设置工作目录
WORKDIR /app
# 复制打包后的Jar包(注意:云效构建Jar包的输出路径要和这里一致)
# 假设你的项目打包后Jar包名是 app.jar,放在target目录下
COPY target/app.jar /app/app.jar
# JVM参数优化(针对2核2G ECS,关键!)
ENV JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Duser.timezone=Asia/Shanghai"
# 暴露项目端口(根据你的项目调整,如8080)
EXPOSE 8080
# 启动命令(替代原来的deploy.sh)
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"]
1.3 下载并安装Docker
下载 Docker Desktop并安装:https://www.docker.com/products/docker-desktop/
启动并验证安装:
bash
docker --version
docker ps
配置国内镜像源:
- 打开 Docker Desktop,点击右上角的 Settings(设置)。
- 在左侧菜单找到 Docker Engine(Docker 引擎),点击进入配置页面。
- 将原有配置替换为以下内容(添加国内镜像源,如果这些镜像源不能用,需要找别的镜像源):
bash
{
"experimental": false,
"features": {
"buildkit": true
},
"ipv6": false,
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me",
"https://dislabaiot.xyz"
]
}
- 点击 Apply & Restart(应用并重启),等待 Docker Desktop 重启完成。
1.4 准备JAR文件
进入项目目录
bash
# 清理并构建JAR
mvn clean package -DskipTests
确认 JAR 文件在target中存在
1.5 构建Docker镜像
bash
docker build -t 项目名称:test .
| 命令片段 | 具体含义 |
|---|---|
docker build |
Docker 的核心命令,用于构建镜像 ,必须指定构建上下文(最后面的 .)。 |
-t 项目名称:test |
-t 是 --tag 的简写,作用是给镜像打标签(Tag) ,格式为 镜像名:标签。test是测试环境的镜像、prod是生产环境的镜像、v1.0是1.0 版本的镜像。如果不写标签,Docker 会默认给镜像打上 latest 标签(但不建议依赖 latest,因为它没有明确的版本含义)。 |
. |
表示构建上下文,告诉 Docker 从当前目录读取 Dockerfile 和相关文件来构建镜像。 |
- 如果成功,会看到 Successfully built 和镜像 ID
- 如果失败,查看错误信息(常见:JAR 文件未找到)
验证镜像:
bash
# 查看镜像列表
docker images
# 查看镜像详细信息
docker inspect 项目名称:test
1.6 本地运行测试
bash
# 运行容器(开发环境)
docker run -d -p 8080:8080 `
-e SPRING_PROFILES_ACTIVE=test `
--name 项目名-test `
项目名:test
# 查看容器日志
docker logs 项目名-test
# 查看实时日志
docker logs -f 项目名-test
# 查看容器状态
docker ps
# 测试健康检查(等待几秒让应用启动)
curl http://localhost:8080/api/actuator/health
# 检查JVM参数
docker exec 项目名-test ps aux
# 停止容器
docker stop 项目名-test
# 删除容器
docker rm 项目名-test
# 删除测试镜像
docker rmi 项目名:test
| 命令片段 | 具体含义(新手友好版) |
|---|---|
docker run |
Docker 核心命令,创建并启动一个新容器(基于指定的镜像)。 |
-d |
全称 --detach,表示后台运行容器 ("守护进程模式")。启动后不会占用当前终端,你可以继续执行其他命令;如果不加 -d,容器会在前台运行,关闭终端就会停止。 |
-p 8080:8080 |
端口映射(主机端口:容器端口):- 左边 8080:你本地电脑(主机)的 8080 端口;- 右边 8080:容器内部应用(比如你的 Spring Boot 接口)监听的 8080 端口;作用:你访问 http://localhost:8080 就能访问容器里的 API 服务。 |
-e SPRING_PROFILES_ACTIVE=dev |
设置容器内的环境变量 :- -e 是 --env 的简写,用于给容器传递环境变量;- SPRING_PROFILES_ACTIVE=dev 是 Spring Boot 专属的环境变量,作用是激活 dev(开发)环境的配置文件 (比如你的项目里的 application-dev.yml/application-dev.properties)。 |
--name 项目名-test |
给容器指定自定义名称 (项目名-test),方便后续管理(比如停止、删除容器时,不用记冗长的容器 ID);如果不加 --name,Docker 会自动生成一个随机名称(比如 happy_morse)。 |
项目名:test |
指定要运行的镜像:就是你之前用 docker build 构建的、标签为 test 的 项目名 镜像。 |
1.7 本地docker登录阿里云ACR
ACR控制台:容器镜像服务-->实例列表-->个人版实例-->镜像仓库-->点击已创建的仓库名称
根据基本信息中的操作指南,登录并推送镜像
可以参照:阿里云ACR镜像上传与使用
二、云效流水线配置
流水线配置:流水线源 --> Java镜像构建 --> Docker部署
2.1 流水线源
配置自己的代码源
工作目录写成自己的项目名称
2.2 Java镜像构建
- 安装Java(和项目jdk版本保持一致)
- 这里测试:JDK版本17、Maven 3.9.3
- 执行命令(项目打包)
bash
mvn clean package -DskipTests -Dspring.profiles.active=test
- 镜像构建并推送至ACR(个人版)
- 选择自己ACR仓库(如果没有需要创建ACR仓库)
- 标签:test(这里是测试版本代码)
- Dockerfile路径:Dockerfile
- ContextPath(不填)
- 镜像缓存:远端缓存
2.3 Docker部署
- 主机组:选择自己配置的主机组,保证里面有可用的ECS,如果没有主机组,需要创建并配置ECS
- 部署脚本:
bash
# 1. 拉取云效构建好的最新镜像(必须先拉取,避免用旧镜像)
docker pull crpi-****.cn-beijing.personal.cr.aliyuncs.com/****/镜像仓库:test
# 2. 停止并删除旧容器(避免容器重名/端口冲突,可选但建议加)
docker stop 项目名-test || true
docker rm 项目名-test || true
# 3. 启动新容器(保留端口、环境变量配置)
docker run -d -p 8080:8080 -e SPRING_PROFILES_ACTIVE=test --name 项目名-test crpi-****.cn-beijing.personal.cr.aliyuncs.com/****/镜像仓库:test
# 4. 验证容器是否启动成功
echo "容器启动状态:"
docker ps | grep 镜像仓库-test
- 部署策略
- 暂停方式:不暂停
- 分批数量:1