阿里云流水线Docker方式部署操作实战(ACR+流水线)

目录

一、前置准备

[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(免费版足够用)

https://www.aliyun.com/

创建命名空间 (如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
相关推荐
weixin_437634302 小时前
阿里云控制台添加子账号
阿里云·阿里云服务器·ecs服务器·阿里云子账号
JiayinX2 小时前
CI/CD流程搭建【Docker+jenkins+gitlab+Webhook】01
ci/cd·docker·gitlab·jenkins·webhook
2301_787328492 小时前
36.docker swarm
运维·docker·容器
xujiangyan_3 小时前
K8s控制器:管理Pod副本的智能管家
docker·容器·kubernetes
lbb 小魔仙4 小时前
Ubuntu 22.04 安装 Docker 完整步骤(附镜像加速配置)
linux·ubuntu·docker
yBmZlQzJ11 小时前
财运到内网穿透域名解析技术机制与中立评估
运维·经验分享·docker·容器·1024程序员节
yBmZlQzJ13 小时前
内网穿透工具通过端口转发实现内外网通信
运维·经验分享·docker·容器·1024程序员节
DeepHacking13 小时前
Overleaf 本地Docker部署
运维·docker·容器
好好生活_14 小时前
【Docker基础学习】从VM虚拟机到Docker
运维·docker