CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛

springboot打包docker镜像(奔走相告)springboot打包成docker镜像,Spring Boot Docker 最佳实践,

1.springboot项目打包成docker镜像

每日分享最新,最流行的软件开发知识与最新行业趋势,希望大家能够一键三连,多多支持,跪求关注,点赞,留言。

2.dockerfile打包springboot

在此博客中,您将学习一些主要针对 Spring Boot 应用程序的 Docker 最佳实践您将通过将这些实践应用于示例应用程序来学习这些实践享受!一、简介本博客继续上一篇关于 Docker 最佳实践的博客。

3.springboot部署到docker

然而,这篇博客可以独立于上一篇阅读目标是提供一些可应用于 Dockerized Spring Boot 应用程序的最佳实践将用作起点的 Dockerfile 如下:FROM eclipse-temurin:17.0.5_8-jre-alpine@sha256:02c04793fa49ad5cd193c961403223755f9209a67894622e05438598b32f210e

4.docker+springboot

WORKDIR /opt/appRUN addgroup –system javauser && adduser -S -s /usr/sbin/nologin -G javauser javauser

5.dockerfile 部署springboot项目

ARG JAR_FILECOPY target/${JAR_FILE} app.jarRUN chown -R javauser:javauser .USER javauserENTRYPOINT [“java”, “-jar”, “app.jar”]

6.docker挂载springboot配置文件

这个 Dockerfile 正在执行以下操作:FROM : 以 eclipse-temurin:17Java Docker 镜像为基础镜像;WORKDIR:设置 /opt/app为工作目录;RUN:创建系统组和系统用户;

7.springboot构建docker镜像

ARG:提供一个参数 JAR_FILE,这样您就不必将 jar 文件名硬编码到 Dockerfile 中;COPY:将jar文件复制到Docker镜像中;RUN : 更改所有者为 WORKDIR之前创建的系统用户;

8.springboot项目docker镜像

USER:确保使用之前创建的系统用户;入口点:启动 Spring Boot 应用程序在接下来的部分中,您将更改此 Dockerfile 以遵循最佳实践每个段落生成的 Dockerfile 可在目录 Dockerfiles的 git 存储库中获得。

9.springboot制作docker镜像

在每个段落的末尾,将在适用的情况下提及相应的最终 Dockerfile 的名称本博客中使用的代码可在 GitHub 上获得2.先决条件以下先决条件适用于此博客:基本的Linux知识;基本的 Java 和 Spring Boot 知识;。

10.docker 打包springboot项目

基本的 Docker 知识。

3. 示例应用需要一个示例应用程序来演示最佳实践因此,创建了一个包含 Spring Web和 Spring Actuator依赖项的基本 Spring Boot 应用程序可以通过从存储库的根目录中调用以下命令来运行该应用程序:。

$ mvn spring-boot:runSpring Actuator 将为您的应用程序提供健康端点默认情况下,它将始终返回 UP 状态$ curl http://localhost:8080/actuator/health。

{“status”:”UP”}为了改变应用程序的健康状态,添加了自定义健康指标每 5 次调用,应用程序的运行状况将设置为 DOWN@Componentpublic class DownHealthIndicator implements HealthIndicator {。

private int counter; @Override public Health health() { counter++; Health.Builder status = Health.up();

if (counter == 5) { status = Health.down(); counter = 0; } return status.build();

}}dockerfile-maven-plugin为了构建 Docker 镜像,将使用 Spotify的一个分支因此,将以下片段添加到pom文件中 com.xenoamess.docker。

dockerfile-maven-plugin 1.4.25 mydeveloperplanet/dockerbestpractices

${project.version} ${project.build.finalName}.jar

使用此插件的好处是您可以轻松地重用配置可以通过单个 Maven 命令创建 Docker 映像通过调用以下命令来构建 jar 文件:。

壳1个$ mvn clean verify可以通过调用以下命令来构建 Docker 映像:$ mvn dockerfile:build运行 Docker 镜像:$ docker run –name dockerbestpractices mydeveloperplanet/dockerbestpractices:0.0.1-SNAPSHOT

查找正在运行的容器的 IP 地址:$ docker inspect dockerbestpractices | grep IPAddress “SecondaryIPAddresses”: null,

“IPAddress”: “172.17.0.3”, “IPAddress”: “172.17.0.3”在上面的示例中,IP 地址是 172.17.0.3.

该应用程序还包含一个HelloController仅以问候消息响应的应用程序可以按如下方式调用Hello端点:$ curl http://172.17.0.3:8080/helloHello Docker!。

现在一切都解释清楚了!4. 最佳实践4.1 健康检查可以将健康检查添加到您的 Dockerfile 中,以暴露容器的健康状况基于此状态,可以重新启动容器这可以通过HEALTHCHECK命令来完成添加以下健康检查:。

文件1个HEALTHCHECK –interval=30s –timeout=3s –retries=1 CMD wget -qO- http://localhost:8080/actuator/health/ | grep UP || exit 1

此健康检查正在执行以下操作:interval:每 30 秒执行一次健康检查对于生产用途,最好选择五分钟之类的时间为了做一些测试,较小的值更容易这样您就不必每次都等待五分钟timeout:执行健康检查的超时时间为三秒。

retries:这表示在健康状态更改之前必须执行的连续检查次数这默认为三个,这对于生产来说是一个很好的数字出于测试目的,您将其设置为 1,这意味着在一次检查不成功后,健康状态变为不健康command:Spring Actuator 端点将用作健康检查。

检索响应并将其通过管道传输, grep以验证健康状态是否为 UP建议不要 curl用于此目的,因为并非每个图像都 curl可用curl除了图像之外,您还需要安装 ,这会将图像放大几 MB构建并运行容器仔细查看容器的状态。

前30秒,健康状态表示开始,因为设置的时间间隔后会进行第一次健康检查$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

ddffb5a9cbf0 mydeveloperplanet/dockerbestpractices:0.0.1-SNAPSHOT “java -jar /opt/app/…” 8 seconds ago Up 6 seconds (health: starting) dockerbestpractices

30 秒后,健康状态显示为healthy$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES。

ddffb5a9cbf0 mydeveloperplanet/dockerbestpractices:0.0.1-SNAPSHOT “java -jar /opt/app/…” 33 seconds ago Up 32 seconds (healthy) dockerbestpractices

2.5 分钟后,由于您添加到示例应用程序的自定义健康指示器,健康状态指示不健康$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES。

ddffb5a9cbf0 mydeveloperplanet/dockerbestpractices:0.0.1-SNAPSHOT “java -jar /opt/app/…” 2 minutes ago Up 2 minutes (unhealthy) dockerbestpractices

同样,在 unhealthy 状态 30 秒后,状态报告healthy您是否注意到容器由于不健康状态而没有重新启动?那是因为 Docker 引擎不会根据这个状态做任何事情像 Kubernetes 这样的容器编排器将重新启动。

用Docker引擎运行时是不是不能重启容器?是的,可以,您可以为此目的使用自动修复 Docker 映像让我们启动自动修复容器docker run -d \ –name autoheal \ –restart=always \

-e AUTOHEAL_CONTAINER_LABEL=all \ -v /var/run/docker.sock:/var/run/docker.sock \ willfarrell/autoheal

验证它是否正在运行$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES。

ddffb5a9cbf0 mydeveloperplanet/dockerbestpractices:0.0.1-SNAPSHOT “java -jar /opt/app/…” 10 minutes ago Up 10 minutes (healthy) dockerbestpractices

d40243eb242a willfarrell/autoheal “/docker-entrypoint …” 5 weeks ago Up 9 seconds (healthy) autoheal

等到健康状况再次不健康或只是调用健康执行器端点以加快速度当状态报告unhealthy时,容器被重新启动您可以在STATUS列中验证这一点,您可以在其中查看容器的正常运行时间$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

ddffb5a9cbf0 mydeveloperplanet/dockerbestpractices:0.0.1-SNAPSHOT “java -jar /opt/app/…” 12 minutes ago Up 6 seconds (health: starting) dockerbestpractices

您必须自己决定是要这个还是要自己通过监控工具来监控健康状况autoheal 映像为您提供了无需手动干预即可自动重启 Docker 容器的方法生成的 Dockerfile 在名称为6-Dockerfile-healthcheck的 git 存储库中可用 。

4.2 Docker ComposeDocker Compose让您有机会使用一条命令同时启动多个容器除此之外,它还使您能够记录您的服务,即使您只有一项服务需要管理Docker Compose 过去与 Docker 分开安装,但现在它是 Docker 本身的一部分。

您需要编写一个compose.yml包含此配置的文件让我们看看您在健康检查期间使用的两个容器的情况services: dockerbestpractices: image: mydeveloperplanet/dockerbestpractices:0.0.1-SNAPSHOT

autoheal: image: willfarrell/autoheal:1.2.0 restart: always environment: AUTOHEAL_CONTAINER_LABEL: all

volumes: – type: bind source: /var/run/docker.sock target: /var/run/docker.sock

配置了两个服务(阅读:容器)一个用于 dockerbestpractices图像,一个用于 autoheal图像自动修复映像将 在重新启动后重新启动,定义了环境变量并安装了卷compose.yml 从可以找到文件的目录中执行以下命令:。

$ docker compose up在日志记录中,您将看到两个容器都已启动打开另一个终端窗口并导航到compose.yml可以找到的目录许多命令可以与 Docker Compose 结合使用例如显示正在运行的容器的状态。

$ docker compose psNAME COMMAND SERVICE STATUS PORTS

mydockerbestpracticesplanet-autoheal-1 “/docker-entrypoint …” autoheal running (healthy)

mydockerbestpracticesplanet-dockerbestpractices-1 “java -jar /opt/app/…” dockerbestpractices running (healthy)

或者停止容器:$ docker compose stop[+] Running 2/2 ⠿ Container mydockerbestpracticesplanet-autoheal-1 Stopped 4.3s

⠿ Container mydockerbestpracticesplanet-dockerbestpractices-1 Stopped 或者轻松移除容器:$ docker compose rm

? Going to remove mydockerbestpracticesplanet-dockerbestpractices-1, mydockerbestpracticesplanet-autoheal-1 Yes

[+] Running 2/0 ⠿ Container mydockerbestpracticesplanet-autoheal-1 Removed 0.0s

⠿ Container mydockerbestpracticesplanet-dockerbestpractices-1 Removed

⠿ 容器 mydockerbestpracticesplanet-dockerbestpractices-1 已删除 如您所见,Docker Compose 提供了很多优势,您绝对应该考虑使用它。

4.3 多阶段构建有时在 Docker 容器中构建应用程序会很方便优点是您不需要在系统上安装完整的开发环境,并且可以更轻松地互换开发环境但是,在容器内构建应用程序存在问题特别是当你想使用同一个容器来运行你的应用程序时。

源代码和完整的开发环境将在您的生产容器中可用,从安全角度来看这不是一个好主意您可以编写单独的 Dockerfile 来规避此问题:一个用于构建,一个用于运行应用程序但这是相当麻烦的解决方案是使用多阶段构建. 使用多阶段构建,您可以将构建阶段与运行阶段分开。

Dockerfile 如下所示:FROM maven:3.8.6-eclipse-temurin-17-alpine@sha256:e88c1a981319789d0c00cd508af67a9c46524f177ecc66ca37c107d4c371d23b AS builder

WORKDIR /buildCOPY . .RUN mvn clean package -DskipTestsFROM eclipse-temurin:17.0.5_8-jre-alpine@sha256:02c04793fa49ad5cd193c961403223755f9209a67894622e05438598b32f210e

WORKDIR /opt/appRUN addgroup –system javauser && adduser -S -s /usr/sbin/nologin -G javauser javauser

COPY –from=builder /build/target/mydockerbestpracticesplanet-0.0.1-SNAPSHOT.jar app.jarRUN chown -R javauser:javauser .

USER javauserHEALTHCHECK –interval=30s –timeout=3s –retries=1 CMD wget -qO- http://localhost:8080/actuator/health/ | grep UP || exit 1

ENTRYPOINT [“java”, “-jar”, “app.jar”]如您所见,此 Dockerfile 包含两个 FROM语句第一个用于构建应用程序:FROM:包含 Maven 和 Java 17 的 Docker 镜像,这是构建应用程序所必需的;。

WORKDIR:设置工作目录;COPY : 将当前目录复制到容器中的工作目录;RUN:用于构建 jar 文件的命令声明中还添加了其他内容FROM最后,AS builder添加这样,这个容器就被标记了,可以用来构建运行应用程序的镜像。

第二部分与您之前拥有的 Dockerfile 相同,除了两行删除了以下行:ARG JAR_FILECOPY target/${JAR_FILE} app.jar这些行确保我们本地构建的 jar 文件被复制到图像中。

这些被替换为以下行:COPY –from=builder /build/target/mydockerbestpracticesplanet-0.0.1-SNAPSHOT.jar app.jar通过这一行,您表明您想要将构建器容器中的文件复制到新图像中。

当你构建这个 Dockerfile 时,你会注意到构建容器执行构建,最后创建运行应用程序的镜像在构建映像期间,您还会注意到所有 Maven 依赖项都已下载生成的 Dockerfile 在名称为7-Dockerfile-multi-stage-build的 git 存储库中可用 。

4.4 Spring Boot Docker 层Docker 镜像由层组成如果您不熟悉 Docker 层,可以查看 以前的帖子Dockerfile 中的每个命令都会生成一个新层当您最初拉取 Docker 镜像时,将检索并存储所有层。

如果你更新你的 Docker 镜像并且你只改变了例如 jar 文件,其他层将不会被重新检索这样,您的 Docker 映像会更有效地存储但是,当您使用 Spring Boot 时,会创建一个 fat jar。

这意味着当您只更改部分代码时,会创建一个新的 fat jar,但其依赖项没有改变因此,每次您创建新的 Docker 映像时,都会在没有任何必要的情况下将兆字节添加到新层中为此,可以使用 Spring Boot Docker 层。

可以找到详细的解释 在这里简而言之,Spring Boot 可以将 fat jar 拆分成几个目录:/依赖项/弹簧引导装载机/快照依赖/应用应用程序代码将驻留在目录 application中,而依赖项将驻留在目录 dependencies中。

为了实现这一点,您将使用多阶段构建第一部分会将 jar 文件复制到 JDK Docker 映像中,然后提取 fat jarFROM eclipse-temurin:17.0.4.1_1-jre-alpine@sha256:e1506ba20f0cb2af6f23e24c7f8855b417f0b085708acd9b85344a884ba77767 AS builder。

WORKDIR applicationARG JAR_FILECOPY target/${JAR_FILE} app.jarRUN java -Djarmode=layertools -jar app.jar extract

第二部分将拆分目录复制到新图像中这些COPY命令替换了 jar 文件FROM eclipse-temurin:17.0.4.1_1-jre-alpine@sha256:e1506ba20f0cb2af6f23e24c7f8855b417f0b085708acd9b85344a884ba77767。

WORKDIR /opt/appRUN addgroup –system javauser && adduser -S -s /usr/sbin/nologin -G javauser javauser

COPY –from=builder application/dependencies/ ./COPY –from=builder application/spring-boot-loader/ ./

COPY –from=builder application/snapshot-dependencies/ ./COPY –from=builder application/application/ ./

RUN chown -R javauser:javauser .USER javauserHEALTHCHECK –interval=30s –timeout=3s –retries=1 CMD wget -qO- http://localhost:8080/actuator/health/ | grep UP || exit 1

ENTRYPOINT [“java”, “org.springframework.boot.loader.JarLauncher”]构建并运行容器运行容器时您不会注意到任何差异主要优势在于 Docker 镜像的存储方式。

生成的 Dockerfile 在名称为8-Dockerfile-spring-boot-docker-layers的 git 存储库中可用 5.结论在此博客中,介绍了为 Spring Boot 应用程序创建 Dockerfile 时的一些最佳实践。

学习应用这些实践,你最终会得到更好的 Docker 镜像举报/反馈

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
相关推荐
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容