使用 Docker 部署 Spring Boot 应用(含 ECS 配置)(部署.配置.Docker.Spring.ECS...)

wufei123 发布于 2025-08-29 阅读(5)

使用 docker 部署 spring boot 应用的核心是将应用及其依赖打包为可移植镜像并在支持 docker 的环境(如 ecs)中运行,1. 创建 spring boot 应用并生成可执行 jar 文件;2. 编写 dockerfile,基于 openjdk:17-jdk-slim 镜像,使用 arg 定义构建参数,copy 命令复制 jar 文件,entrypoint 指定启动命令;3. 通过 docker build 命令构建镜像并使用 docker run 在本地测试;4. 可选地将镜像推送到 docker hub;5. 在 ecs 实例中安装 docker,拉取镜像并运行容器,映射 8080 端口;6. 通过公网 ip 访问应用。arg 用于构建时传参且不保留于镜像中,env 设置的环境变量在镜像和容器运行时均有效。优化镜像大小需选择轻量基础镜像、采用多阶段构建、清理缓存、使用 .dockerignore 文件并合理利用分层。监控容器健康可通过 healthcheck 指令、docker stats 命令、集成 prometheus 等监控系统、使用 elk 分析日志或编写自定义脚本实现。对于依赖数据库的应用,可使用 docker-compose.yml 编排多个服务,定义服务间依赖与环境变量,通过 docker-compose up 一键启动所有服务,确保应用与数据库协同运行,完整实现可扩展、可维护的容器化部署方案。

使用 Docker 部署 Spring Boot 应用(含 ECS 配置)

使用 Docker 部署 Spring Boot 应用,核心在于将你的应用及其依赖打包成一个可移植的镜像,然后在任何支持 Docker 的环境中运行,包括云服务 ECS。这不仅简化了部署流程,还提高了应用的可移植性和可扩展性。

解决方案:

  1. 创建 Spring Boot 应用: 如果你还没有 Spring Boot 应用,可以使用 Spring Initializr 创建一个简单的 Web 应用。

  2. 编写 Dockerfile: 在 Spring Boot 项目的根目录下创建

    Dockerfile
    文件。这是一个指令集,告诉 Docker 如何构建你的镜像。
    FROM openjdk:17-jdk-slim
    VOLUME /tmp
    ARG JAR_FILE=target/*.jar
    COPY ${JAR_FILE} app.jar
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
    • FROM openjdk:17-jdk-slim
      :基于 OpenJDK 17 的精简版镜像。
    • VOLUME /tmp
      :创建一个挂载点,用于 Spring Boot 临时文件。
    • ARG JAR_FILE=target/*.jar
      :定义 JAR 文件路径的参数。
    • COPY ${JAR_FILE} app.jar
      :将 JAR 文件复制到镜像中并重命名为
      app.jar
    • ENTRYPOINT
      :定义容器启动时执行的命令。
  3. 构建 Docker 镜像: 在项目根目录下,使用以下命令构建镜像:

    docker build -t your-app-name .
    • -t your-app-name
      :为镜像指定一个名称。
    • .
      :指定 Dockerfile 所在的目录。
  4. 运行 Docker 容器(本地测试): 在本地运行镜像,确保一切正常:

    docker run -p 8080:8080 your-app-name
    • -p 8080:8080
      :将容器的 8080 端口映射到主机的 8080 端口。
  5. 推送到 Docker Hub (可选): 如果你想在 ECS 上使用该镜像,需要将其推送到 Docker Hub 或其他镜像仓库。

    docker tag your-app-name your-dockerhub-username/your-app-name
    docker push your-dockerhub-username/your-app-name
  6. 配置 ECS 实例:

    • 创建 ECS 实例: 在云服务控制台中创建一个 ECS 实例。选择合适的操作系统(推荐 Linux)和实例规格。

    • 配置安全组: 确保安全组允许从外部访问 8080 端口。

    • 安装 Docker: 通过 SSH 连接到 ECS 实例,并安装 Docker。不同操作系统的安装方式略有不同,参考官方文档。

    • 拉取镜像: 从 Docker Hub 拉取你的镜像:

      docker pull your-dockerhub-username/your-app-name
    • 运行容器: 运行容器,将 ECS 实例的 8080 端口映射到容器的 8080 端口:

      docker run -d -p 8080:8080 your-dockerhub-username/your-app-name
      • -d
        :在后台运行容器。
  7. 访问应用: 通过 ECS 实例的公网 IP 地址和 8080 端口访问你的 Spring Boot 应用。

Dockerfile 中的 ARG 和 ENV 的区别是什么?

ARG
ENV
都是 Dockerfile 中用来设置环境变量的,但它们的作用范围和生命周期不同。
ARG
主要用于构建镜像时,允许你在
docker build
命令中传递参数,这些参数只在构建过程中有效,不会被保存到最终的镜像中。而
ENV
则是在镜像构建和容器运行时都有效,它会将环境变量设置到镜像中,并在容器启动时生效。这意味着,如果你的环境变量需要在容器运行时被应用访问,你应该使用
ENV
。如果仅仅是在构建过程中需要用到,例如指定依赖的版本,那么
ARG
更合适。

如何优化 Docker 镜像的大小?

镜像大小直接影响部署速度和资源消耗。优化 Docker 镜像大小,可以从以下几个方面入手:

  • 选择合适的 Base Image: 尽量选择体积小的基础镜像,例如
    openjdk:17-jdk-slim
    而不是
    openjdk:17-jdk
  • 使用多阶段构建 (Multi-Stage Builds): 将构建过程分为多个阶段,只将最终运行所需的文件复制到最终镜像中。例如,可以使用一个阶段编译代码,另一个阶段只包含运行环境和编译好的文件。
  • 清理临时文件: 在 Dockerfile 中,删除不再需要的临时文件和缓存。例如,在安装依赖后,删除 apt 缓存。
  • 使用
    .dockerignore
    文件: 创建
    .dockerignore
    文件,排除不必要的文件和目录,例如源代码、构建目录等,避免它们被复制到镜像中。
  • 利用镜像分层特性: 将经常变动的部分放在 Dockerfile 的最后,利用 Docker 的镜像分层特性,减少镜像的重复构建。

如何监控 Docker 容器的健康状况?

监控 Docker 容器的健康状况对于保证应用的稳定运行至关重要。可以采用以下几种方法:

  • 使用 Docker Healthcheck: 在 Dockerfile 中定义
    HEALTHCHECK
    指令,定期执行一个命令或脚本,检查容器的健康状况。Docker 会根据
    HEALTHCHECK
    的结果自动重启不健康的容器。
  • 使用 Docker stats 命令: 使用
    docker stats
    命令可以查看容器的 CPU、内存、网络 I/O 等资源使用情况。
  • 集成监控系统: 将 Docker 容器集成到专业的监控系统中,例如 Prometheus、Grafana、Datadog 等。这些系统可以提供更全面的监控指标和告警功能。
  • 使用日志分析工具: 使用日志分析工具,例如 ELK Stack (Elasticsearch, Logstash, Kibana),分析容器的日志,及时发现异常情况。
  • 自定义监控脚本: 编写自定义的监控脚本,定期检查应用的业务指标,例如请求响应时间、错误率等。

使用 Docker Compose 编排 Spring Boot 应用和数据库

如果你的 Spring Boot 应用需要依赖数据库或其他服务,可以使用 Docker Compose 来编排多个容器。创建一个

docker-compose.yml
文件,定义各个服务及其依赖关系。
version: "3.8"
services:
  db:
    image: postgres:14
    environment:
      POSTGRES_USER: your_user
      POSTGRES_PASSWORD: your_password
      POSTGRES_DB: your_db
    ports:
      - "5432:5432"
  app:
    image: your-dockerhub-username/your-app-name
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/your_db
      SPRING_DATASOURCE_USERNAME: your_user
      SPRING_DATASOURCE_PASSWORD: your_password

在这个例子中,

db
服务使用 PostgreSQL 镜像,
app
服务使用你的 Spring Boot 应用镜像。
depends_on
指令确保
app
服务在
db
服务启动后才启动。通过环境变量,Spring Boot 应用可以连接到数据库。使用
docker-compose up
命令可以启动所有服务。

以上就是使用 Docker 部署 Spring Boot 应用(含 ECS 配置)的详细内容,更多请关注知识资源分享宝库其它相关文章!

标签:  部署 配置 Docker 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。