当前位置:首页 > 文章列表 > 文章 > linux > 阿里云ACR+ECS部署Spring项目教程

阿里云ACR+ECS部署Spring项目教程

2025-08-07 08:45:51 0浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《阿里云 ACR + ECS 部署 Spring 项目实战》,聊聊,我们一起来看看吧!

编写高效安全的 Dockerfile:使用多阶段构建,构建阶段用 maven 镜像编译项目,运行阶段使用 openjdk:17-jre-slim 轻量镜像,以非 root 用户运行,添加 HEALTHCHECK 健康检查,减小镜像体积并提升安全性;2. 部署到 ECS 的常见坑与优化:务必配置安全组开放应用端口,设置 JVM 内存参数如 -Xmx512m 防止 OOM,通过 -v 挂载卷实现日志和数据持久化,配置阿里云 Docker 镜像加速提升拉取速度,使用启动脚本配合 --restart=always 实现容器自愈;3. 集成 ACR 与 CI/CD 实现自动化部署:通过 Git 提交触发 CI/CD 流水线,自动构建 JAR 和 Docker 镜像,登录 ACR 推送镜像,再通过 SSH 或阿里云 API 在 ECS 上拉取新镜像并滚动更新容器,利用镜像标签(如 commit SHA)实现版本追踪和快速回滚,最终实现从代码提交到部署的全流程自动化。

阿里云 ACR 镜像服务 + ECS 实战部署 Spring 项目

部署 Spring 项目到阿里云 ECS 并结合 ACR 镜像服务,核心在于将 Spring 应用打包成 Docker 镜像,推送到 ACR,然后在 ECS 上拉取并运行该镜像。这是一种高效、可复用的自动化部署路径,它把应用运行时环境和代码都封装起来,极大简化了部署和运维的复杂度。

我个人觉得,要实现 Spring 项目在阿里云 ACR 和 ECS 上的实战部署,其实可以分解成几个关键步骤,每一步都有它自己的学问和可能遇到的坑。

首先,你得把你的 Spring 项目搞定,确保它能打成一个可执行的 JAR 包或者 WAR 包。接着,就是为这个应用写一个 Dockerfile,这是把应用“容器化”的关键一步。我通常会选择一个轻量级的 JDK 基础镜像,比如 openjdk:17-jre-slim,然后把 JAR 包复制进去,暴露端口。构建完 Docker 镜像后,下一步就是把它推送到阿里云容器镜像服务 ACR。这需要你在 ACR 创建一个仓库,然后登录 ACR 的 Docker 客户端,用 docker push 命令把本地构建好的镜像推上去。

在 ECS 这边,你需要一台安装了 Docker 环境的 Linux 实例。别忘了,安全组配置是重中之重,你得确保 Spring 应用监听的端口(比如 8080)在安全组里是开放的,否则外面根本访问不到。在 ECS 上登录 ACR 后,直接 docker pull 拉取你的镜像,然后用 docker run -d -p 80:8080 --name my-spring-app my-acr-repo/my-spring-image:latest 这样的命令就能把应用跑起来了。如果需要持久化数据或者日志,记得加上 -v 参数挂载数据卷。当然,生产环境可能还需要 Nginx 做反向代理,或者用阿里云的 SLB 做负载均衡,这些都是后话了。

如何为 Spring 项目编写一个高效且安全的 Dockerfile?

说实话,一个好的 Dockerfile 能省下你不少麻烦,尤其是在镜像体积和安全性上。我最喜欢用多阶段构建(Multi-stage builds),这简直是神器。它能让你在构建阶段用一个完整的 JDK 环境编译打包,而在最终的运行时镜像里,只保留一个精简的 JRE 环境和你的应用 JAR 包,这样能把镜像体积压缩到最小。

举个例子,你可以这样写:

# 阶段1: 构建阶段
FROM maven:3.8.5-openjdk-17 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

# 阶段2: 运行阶段
FROM openjdk:17-jre-slim
WORKDIR /app
# 复制构建阶段生成的jar包
COPY --from=build /app/target/*.jar app.jar
# 暴露Spring Boot默认端口
EXPOSE 8080
# 以非root用户运行,增加安全性
RUN groupadd --system springgroup && useradd --system --gid springgroup springuser
USER springuser
# 定义健康检查,Spring Boot Actuator的/actuator/health端点
HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD curl -f http://localhost:8080/actuator/health || exit 1
# 启动Spring Boot应用
ENTRYPOINT ["java", "-jar", "app.jar"]

这里面,我特意用了 openjdk:17-jre-slim 这种轻量级的基础镜像,并且让应用以非 root 用户 springuser 运行,这能有效降低安全风险。HEALTHCHECK 指令也挺重要的,它能让 Docker 知道你的应用是不是真的“活”着,而不仅仅是容器在跑。

在 ECS 上部署 Docker 化 Spring 应用时,常见的坑和优化策略有哪些?

部署到 ECS 上,你总会遇到些意想不到的问题,这很正常。我踩过不少坑,最常见的几个:

  1. 安全组配置问题: 屡试不爽的坑。应用跑起来了,但外面访问不到,十有八九是安全组没开放对应的端口。每次部署前,我都会条件反射地去检查一遍。
  2. 内存不足(OOM): Spring 应用尤其是 Spring Boot,默认启动可能就吃掉不少内存。如果 ECS 实例规格太小,或者 JVM 启动参数没调好,很容易就 OOM 了。我通常会给 JVM 加上 -Xmx-Xms 参数来限制内存使用,比如 -Xmx512m -Xms256m。另外,也要留意 Docker 容器本身的内存限制,docker run --memory=512m 也能起到作用。
  3. 日志和数据持久化: 容器是短暂的,一旦容器被删除或更新,里面的数据就没了。所以,日志文件、上传的文件或者数据库数据,都得通过 -v 参数挂载到 ECS 宿主机上的目录,或者直接用阿里云的 NAS、OSS 等存储服务。
  4. Docker 镜像拉取速度: 有时候从 ACR 拉取镜像会很慢,尤其是第一次。你可以在 ECS 实例上配置 Docker 镜像加速器,阿里云提供了官方的加速器地址,能显著提高拉取速度。
  5. 启动脚本的健壮性: 生产环境我不会手动敲 docker run 命令。通常会写一个 shell 脚本,包含停止旧容器、删除旧容器、拉取新镜像、启动新容器等逻辑,并且加上 --restart=always 参数,确保容器异常退出后能自动重启。

优化方面,除了上面提到的,我还会关注 ECS 实例的规格选择,根据应用预估的并发量和资源消耗来定。另外,日志收集也很关键,我会考虑把容器日志通过 log-driver 或者 Sidecar 容器的方式,统一发送到阿里云日志服务 SLS,方便后续的查询和分析。

如何将 ACR 镜像服务与 CI/CD 流水线集成,实现 Spring 项目的自动化部署?

把 ACR 和 CI/CD 结合起来,才是真正释放生产力的王道。我个人用过 Jenkins、GitLab CI/CD 和阿里云效 CodePipeline,核心思路都差不多:代码一提交,就自动触发构建、打包、部署的流程。

一个典型的自动化部署流程大概是这样的:

  1. 代码提交触发: 开发者将代码推送到 Git 仓库(比如 GitLab、GitHub 或阿里云 CodeUp)。
  2. CI/CD 工具监听: CI/CD 工具检测到代码变更,触发预设的流水线。
  3. 项目构建: 流水线拉取最新代码,使用 Maven 或 Gradle 构建 Spring 项目,生成 JAR 包。
  4. Docker 镜像构建: 基于 JAR 包和 Dockerfile,构建新的 Docker 镜像。
  5. ACR 登录与推送: 使用 CI/CD 工具中配置的 ACR 登录凭证(通常是 AccessKey),登录 ACR,然后将新构建的镜像推送到 ACR 仓库。
  6. ECS 部署触发: 这是最关键的一步。流水线可以通过 SSH 连接到 ECS 实例,执行预先写好的部署脚本;或者通过阿里云的 OpenAPI/SDK 调用 ECS 相关的接口,比如运行命令等。这个脚本会负责拉取 ACR 中的最新镜像,停止旧的容器,并启动新的容器。

一个简单的 GitLab CI/CD 配置片段可能长这样:

stages:
  - build
  - deploy

build_image:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker login --username=$ACR_USERNAME --password=$ACR_PASSWORD registry.cn-hangzhou.aliyuncs.com
    - docker build -t registry.cn-hangzhou.aliyuncs.com/your-namespace/your-spring-app:$CI_COMMIT_SHORT_SHA .
    - docker push registry.cn-hangzhou.aliyuncs.com/your-namespace/your-spring-app:$CI_COMMIT_SHORT_SHA
  only:
    - master

deploy_to_ecs:
  stage: deploy
  image: alpine/ssh-client:latest
  script:
    - ssh -o StrictHostKeyChecking=no $ECS_USER@$ECS_HOST "
      docker login --username=$ACR_USERNAME --password=$ACR_PASSWORD registry.cn-hangzhou.aliyuncs.com &&
      docker pull registry.cn-hangzhou.aliyuncs.com/your-namespace/your-spring-app:$CI_COMMIT_SHORT_SHA &&
      docker stop my-spring-app || true &&
      docker rm my-spring-app || true &&
      docker run -d -p 80:8080 --name my-spring-app --restart=always registry.cn-hangzhou.aliyuncs.com/your-namespace/your-spring-app:$CI_COMMIT_SHORT_SHA
      "
  only:
    - master

这里 ACR_USERNAME, ACR_PASSWORD, ECS_USER, ECS_HOST 都是 CI/CD 工具的环境变量,用于安全地存储凭证。每次提交,都会用当前的 commit SHA 作为镜像标签,这样方便追溯和回滚。

说到回滚,自动化部署也得考虑这一点。如果新版本有问题,我通常会通过 CI/CD 界面手动触发一个任务,指定拉取并运行上一个稳定版本的镜像,这样就能快速恢复服务。这些都是在实践中慢慢摸索出来的,虽然过程有点折腾,但一旦搭建起来,部署效率真是质的飞跃。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

JavaScript中indexOf查找元素位置方法JavaScript中indexOf查找元素位置方法
上一篇
JavaScript中indexOf查找元素位置方法
SpringBoot内连接查询技巧详解
下一篇
SpringBoot内连接查询技巧详解
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 千音漫语:智能声音创作助手,AI配音、音视频翻译一站搞定!
    千音漫语
    千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
    119次使用
  • MiniWork:智能高效AI工具平台,一站式工作学习效率解决方案
    MiniWork
    MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
    118次使用
  • NoCode (nocode.cn):零代码构建应用、网站、管理系统,降低开发门槛
    NoCode
    NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
    131次使用
  • 达医智影:阿里巴巴达摩院医疗AI影像早筛平台,CT一扫多筛癌症急慢病
    达医智影
    达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
    126次使用
  • 智慧芽Eureka:更懂技术创新的AI Agent平台,助力研发效率飞跃
    智慧芽Eureka
    智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
    128次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码