暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Quarkus系列 - 构建容器镜像

整码阁 2021-06-09
1571

Quarkus旨在实现“容器优先”的云原生开发框架,通过提供dockerfile和基础镜像简化容器镜像的构建。

Dockerfile

Quarkus项目默认生成一个docker文件夹,里面包括四个dockerfile。

前两个使用jar包构建docker镜像,后两个使用本地可执行文件构建镜像。

前三个使用ubi-minimal作为基础镜像,最后一个使用quarkus-distroless-image作为基础镜像。

  • Dockerfile.jvm - 使用fast jar构建docker镜像,即复制target/quarkus-app下的文件用于启动项目;

  • Dockerfile.legacy-jar - 使用legacy jar构建docker镜像,即复制target下的lib目录和*-runner.jar文件用于启动项目;

  • Dockerfile.native - 使用本地可执行文件构建docker镜像,即复制target目录下的*-runner可执行文件用于启动项目;

  • Dockerfile.native-distroless - 同Dockerfile.native,仅基础镜像不同;


UBI和Distroless
  • UBI是Universal Base Image的缩写,由Red Hat维护的基础镜像,它主要服务于Red Hat产品和技术;

  • Distroless代表仅包含应用和运行时依赖的基础镜像,它甚至没有包管理工具和shell,是体积更小的基础镜像;

构建Jar包的Docker镜像

执行命令:

docker build -f src/main/docker/Dockerfile.jvm -t geekstower/grocery-jvm .


该命令使用Quarkus脚手架生成的Dockerfile.jvm构建Docker镜像。

执行该命令的前提是已经生成fast jar,参考Quarkus系列-项目构建

启动项目:

docker run -i --rm -p 8080:8080 geekstower/grocery-jvm
构建本地可执行文件的Docker镜像

执行命令:

docker build -f src/main/docker/Dockerfile.native -t geekstower/grocery .


该命令使用Quarkus脚手架生成的Dockerfile.native构建Docker镜像。

执行该命令的前提是已经生成本地可执行文件,参考Quarkus系列-构建本地可执行文件

启动项目:

docker run -i --rm -p 8080:8080 geekstower/grocery

使用Distroless构建本地可执行文件的Docker镜像

执行命令:

docker build -f src/main/docker/Dockerfile.native-distroless -t geekstower/grocery-distroless .


该命令使用Quarkus脚手架生成的Dockerfile.native-distroless构建Docker镜像。

同上,执行该命令的前提是已经生成本地可执行文件。

启动项目:

docker run -i --rm -p 8080:8080 geekstower/grocery-distroless

镜像分析

查看镜像:

docker images


可以看出:

1. 基于jar构建的镜像体积最大(380M),使用quarkus distroless基础镜像构建的可执行文件镜像最小(21.3M),使用UBI基础镜像构建的可执行文件镜像也不大(103M)

2. 使用distroless基础镜像构建的docker镜像的体积仅是使用UBI基础镜像构建的docker镜像的1/5

3. 使用distroless基础镜像构建的docker镜像的体积仅是基于jar构建的docker镜像的1/18

4. 使用distroless基础镜像构建的体积最小; 

文章转载自整码阁,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论