阿里云ACR+ECS部署Spring项目教程
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)实现版本追踪和快速回滚,最终实现从代码提交到部署的全流程自动化。
部署 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 上,你总会遇到些意想不到的问题,这很正常。我踩过不少坑,最常见的几个:
- 安全组配置问题: 屡试不爽的坑。应用跑起来了,但外面访问不到,十有八九是安全组没开放对应的端口。每次部署前,我都会条件反射地去检查一遍。
- 内存不足(OOM): Spring 应用尤其是 Spring Boot,默认启动可能就吃掉不少内存。如果 ECS 实例规格太小,或者 JVM 启动参数没调好,很容易就 OOM 了。我通常会给 JVM 加上
-Xmx
和-Xms
参数来限制内存使用,比如-Xmx512m -Xms256m
。另外,也要留意 Docker 容器本身的内存限制,docker run --memory=512m
也能起到作用。 - 日志和数据持久化: 容器是短暂的,一旦容器被删除或更新,里面的数据就没了。所以,日志文件、上传的文件或者数据库数据,都得通过
-v
参数挂载到 ECS 宿主机上的目录,或者直接用阿里云的 NAS、OSS 等存储服务。 - Docker 镜像拉取速度: 有时候从 ACR 拉取镜像会很慢,尤其是第一次。你可以在 ECS 实例上配置 Docker 镜像加速器,阿里云提供了官方的加速器地址,能显著提高拉取速度。
- 启动脚本的健壮性: 生产环境我不会手动敲
docker run
命令。通常会写一个 shell 脚本,包含停止旧容器、删除旧容器、拉取新镜像、启动新容器等逻辑,并且加上--restart=always
参数,确保容器异常退出后能自动重启。
优化方面,除了上面提到的,我还会关注 ECS 实例的规格选择,根据应用预估的并发量和资源消耗来定。另外,日志收集也很关键,我会考虑把容器日志通过 log-driver
或者 Sidecar 容器的方式,统一发送到阿里云日志服务 SLS,方便后续的查询和分析。
如何将 ACR 镜像服务与 CI/CD 流水线集成,实现 Spring 项目的自动化部署?
把 ACR 和 CI/CD 结合起来,才是真正释放生产力的王道。我个人用过 Jenkins、GitLab CI/CD 和阿里云效 CodePipeline,核心思路都差不多:代码一提交,就自动触发构建、打包、部署的流程。
一个典型的自动化部署流程大概是这样的:
- 代码提交触发: 开发者将代码推送到 Git 仓库(比如 GitLab、GitHub 或阿里云 CodeUp)。
- CI/CD 工具监听: CI/CD 工具检测到代码变更,触发预设的流水线。
- 项目构建: 流水线拉取最新代码,使用 Maven 或 Gradle 构建 Spring 项目,生成 JAR 包。
- Docker 镜像构建: 基于 JAR 包和 Dockerfile,构建新的 Docker 镜像。
- ACR 登录与推送: 使用 CI/CD 工具中配置的 ACR 登录凭证(通常是 AccessKey),登录 ACR,然后将新构建的镜像推送到 ACR 仓库。
- 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查找元素位置方法

- 下一篇
- SpringBoot内连接查询技巧详解
-
- 文章 · linux | 1小时前 |
- Linux内存不足解决方法及优化技巧
- 364浏览 收藏
-
- 文章 · linux | 2小时前 |
- LinuxPAM配置与安全设置详解
- 203浏览 收藏
-
- 文章 · linux | 3小时前 |
- Linux流量监控实用技巧分享
- 123浏览 收藏
-
- 文章 · linux | 3小时前 |
- Linux磁盘配额设置与管理技巧
- 303浏览 收藏
-
- 文章 · linux | 12小时前 |
- Linux加密方法与工具全解析
- 336浏览 收藏
-
- 文章 · linux | 12小时前 |
- Linux网络配置与故障排查技巧
- 406浏览 收藏
-
- 文章 · linux | 12小时前 |
- Linux启动加速技巧分享
- 218浏览 收藏
-
- 文章 · linux | 12小时前 |
- Linux多网卡绑定与故障切换技巧
- 246浏览 收藏
-
- 文章 · linux | 13小时前 |
- Linux数据恢复技巧与防丢方案
- 313浏览 收藏
-
- 文章 · linux | 14小时前 |
- Linux防恶意软件防护指南
- 179浏览 收藏
-
- 文章 · linux | 14小时前 |
- Linux日志监控:syslog-ng与ELK实战教程
- 470浏览 收藏
-
- 文章 · linux | 15小时前 |
- Linux用户组与权限管理全解析
- 356浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 119次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 118次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 131次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 126次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 128次使用
-
- 命令行工具:应对Linux服务器安全挑战的利器
- 2023-10-04 501浏览
-
- 如何使用Docker进行容器的水平伸缩和负载均衡
- 2023-11-07 501浏览
-
- linux .profile的作用是什么
- 2024-04-07 501浏览
-
- 如何解决s权限位引发postfix及crontab异常
- 2024-11-21 501浏览
-
- 如何通过脚本自动化Linux上的K8S安装
- 2025-02-17 501浏览