当前位置: 首页 > news >正文

如何构建和推送容器镜像

导读:如何构建和推送容器镜像?有哪些解决方案?本文带大家探讨这些问题。

解决方案

Kubernetes 中的工作单元是一个 pod。一个 pod 代表一组容器,它们运行在同一台主机上,并共享 IP 和端口等资源。要将一个服务部署到 Kubernetes 中,需要创建一个 pod。

由于 pod 是由一个或多个容器组成的,所以需要构建服务的容器镜像。

Quarkus 提供了构建和可选地推送容器镜像的扩展。在撰写本书时,支持以下容器构建策略:

Jib

Jib 为 Java 应用构建 Docker 和 OCI 容器镜像,无须 Docker 守护进程(Dockerless)。

这使得它非常适合在容器内运行进程时构建 Docker 镜像,因为这避免了 Docker-in-Docker(DinD)进程的麻烦。此外,使用 Quarkus 的 Jib 可以将所有的依赖项缓存在与实际应用不同的层中,使得重建速度快、规模小。这缩减了推送时间和构建时间。

Docker

运用 Docker 策略,使用 docker 二进制文件构建容器镜像,该二进制文件安装在本地,默认使用位于 src/main/docker 下的 Dockerfiles 来构建镜像。

S2I

Source-to-Image(S2I)策略使用 s2i 二进制构建在 OpenShift 集群内进行容器构建。

S2I 构建需要创建一个 BuildConfig 和两个 ImageStream 资源。这些资源的创建由Quarkus Kubernetes 扩展来实现。

在这个配置中,我们将使用 Jib 来构建和推送容器。这个配置的“讨论”部分将讨论Docker 和 S2I。

要使用 Jib 构建和推送容器镜像,首先需要添加 Jib 扩展项:

./mvnw quarkus:add-extensions -Dextensions="quarkus-container-image-jib"

然后可以自定义容器镜像的构建过程。可以在 application.properties、系统属性或环境变量中设置这些属性,与在 Quarkus 中设置任何其他配置参数一样:

quarkus.container-image.group=lordofthejars①
quarkus.container-image.registry=quay.io ②
quarkus.container-image.username=lordofthejars ③
#quarkus.container-image.password=④

①设置镜像的分组,这个值默认是 ${user.name}

②镜像推向的仓库,默认镜像被推向 docker.io

③镜像仓库的用户名

④镜像仓库的密码

要为项目建立并推送容器镜像,需要将 quarkus.container-image.push 参数设置为true,在打包阶段,创建并推送容器:

./mvnw clean package -Dquarkus.container-image.push=true
...
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ greeting-jib ---
[INFO] Building jar: /greeting-jib/target/greeting-jib-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- quarkus-maven-plugin:1.3.0.CR2:build (default) @ greeting-jib ---
[INFO] [org.jboss.threads] JBoss Threads version 3.0.1.Final
[INFO] [io.quarkus.deployment.pkg.steps.JarResultBuildStep] Building thin jar: greeting-jib/target/greeting-jib-1.0-SNAPSHOT-runner.jar
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Starting container image build①
[WARNING] [io.quarkus.container.image.jib.deployment.JibProcessor] Base image 'fabric8/java-alpine-openjdk8-jre' does not use a specific image digest - build may not be reproducible
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] LogEvent [level=INFO, message=trying docker-credential-desktop for quay.io]
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] LogEvent [level=LIFECYCLE, message=Using credentials from Docker config ($HOME/.docker/config.json) for
quay.io/lordofthejars/greeting-jib:1.0-SNAPSHOT]
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] The base image requires auth. Trying again for fabric8/java-alpine-openjdk8-jre...
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Using base image with digest:
 sha256:a5d31f17d618032812ae85d12426b112279f02951fa92a7ff8a9d69a6d3411b1
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Container entrypoint set to [java, -Dquarkus.http.host=0.0.0.0,
-Djava.util.logging.manager=org.jboss.logmanager.LogManager,-cp, /app/resources:/app/classes:/app/libs/*, io.quarkus.runner.GeneratedMain]
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Pushedcontainer image quay.io/lordofthejars/greeting-jib:1.0-SNAPSHOT(sha256:e173e0b49bd5ec1f500016f46f2cde03a055f558f72ca8ee1d6cb034a385a657)②
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 12980ms

①这个容器镜像被构建

②容器镜像被推向 quay.io

讨论

除了 Jib,还有另外两个选项可以用来构建容器镜像。要使用它们,只需要注册扩展:

Docker

quarkus-container-image-docker

S2I

quarkus-container-image-s2i

每个扩展都提供了特定的配置参数来更改构建过程。利用这些参数,可以更改用于构建容器镜像的基础镜像,并设置环境变量、传递给可执行文件的参数或 Dockerfile 的位置。

也可以建立镜像但不推送它到仓库。为此,需要将 quarkus.container-image.build 属性设置为 true,而不是设置 quarkus.container-image.push 属性:

./mvnw clean package -Dquarkus.container-image.build=true

如果使用 Jib,并且将 push 设置为 false,扩展就会创建一个容器镜像,并将其注册到 Docker 守护进程中。这意味着虽然没有使用 Docker 来构建镜像,但它仍然是必要的。

容器镜像扩展可以从 JAR 包(用于 JVM 模式)和原生可执行文件创建容器,这取决于在 build/output 目录中找到的内容。如果你想创建一个可从 Linux 容器中运行的原生可执行文件,然后创建一个包含所产生的原生可执行文件的容器镜像,可以运行以下命令:

./mvnw clean package -Dquarkus.container-image.push=true -Pnative \ 
-Dquarkus.native.container-build=true

将 quarkus.native.container-build 属性设置为 true,会在 Docker 容器内创建原生可执行文件。

 

本文摘编于机械工业出版社出版的图书《Quarkus实战:专为Kubernetes而优化的Java解决方案》。

 

关于作者:Alex Soto Bueno 是Red Hat的开发者体验总监,自 2017 年以来一直是 Java Champion。Jason Porter 是一名首席软件工程师,在Red Hat从事中间件工程服务、Arquillian、Quarkus 和其他开发者体验项目。

本书向熟悉Java企业应用开发的中高级开发人员展示了如何快速上手Quarkus。你将了解如何在更广泛的Java生态系统中使用Quarkus,并掌握如何使该框架满足自己的特殊需求。每一章都以问题-解决方案-讨论的格式编写。

通过本书,你将学会:

  • 通过在开发模式下启用实时重载来缩短开发周期。

  • 连接到 Kafka 并与之通信。

  • 使用响应式编程模型进行开发并轻松地为服务添加容错功能。

  • 将应用程序构建为一个 Kubernetes 就绪的容器。

  • 使用 OpenAPI 轻松地开发和测试原生 Quarkus 应用程序。


扫码关注【华章计算机】视频号

每天来听华章哥讲书

更多精彩回顾

书讯 | 4月书讯 | 好书和最美四月天一起来了...

资讯 | DB-Engines 4月数据库排名:Redis有望甩掉“千年老七”?

书单 | 360漏洞响应平台(SRC)为白帽子挑选的10本互联网安全好书

干货 | 数据仓库分层存储技术揭秘

收藏 | 计算机系统之芯——从零开始设计CPU

上新 | 【新书速递】深入理解Java虚拟机HotSpot

点击阅读全文购买

相关文章:

  • 5月书讯(下)| 5天小长假,一起读新书
  • WebRTC技术详解
  • 如何使用 Vault 安全地存储配置的 secret
  • 数据中台:企业数据质量参差不齐?听听专家怎么说
  • 【新书速递】信息安全标委会委员推荐的金融科技安全工具书
  • 终于有人把A/B测试讲明白了
  • 学会这7个绘图工具包,Matplotlib可视化也没那么难
  • 多图详解数据中台建设框架(建议收藏)
  • ASC20-21超算大赛开战——有一群年轻人正在用超算的力量改变世界
  • 【第54期】“换道超车”:无人驾驶在中国的落地之路
  • 微服务究竟是“灵丹”还是“毒药”?
  • 【新书速递】字节跳动、360的智能硬件产品经验总结
  • 手把手教你用Scrapy爬取知乎大V粉丝列表
  • 这样构建的用户画像!想不懂你的用户都难
  • 【新书速递】硅谷和国内的数据中台有哪些区别?
  • 2017-08-04 前端日报
  • 78. Subsets
  • Github访问慢解决办法
  • isset在php5.6-和php7.0+的一些差异
  • javascript面向对象之创建对象
  • JS专题之继承
  • Python利用正则抓取网页内容保存到本地
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 简单实现一个textarea自适应高度
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 手机端车牌号码键盘的vue组件
  • 算法-插入排序
  • 算法-图和图算法
  • 消息队列系列二(IOT中消息队列的应用)
  • 携程小程序初体验
  • 我们雇佣了一只大猴子...
  • ​【已解决】npm install​卡主不动的情况
  • #if 1...#endif
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (day6) 319. 灯泡开关
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (一)RocketMQ初步认识
  • (转) 深度模型优化性能 调参
  • (转)ABI是什么
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .NET Remoting学习笔记(三)信道
  • .net 获取url的方法
  • .NET 设计一套高性能的弱事件机制
  • .net 怎么循环得到数组里的值_关于js数组
  • .netcore 获取appsettings
  • .net开发引用程序集提示没有强名称的解决办法
  • /*在DataTable中更新、删除数据*/
  • @Builder用法
  • @Not - Empty-Null-Blank