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

【橘子容器】如何构建一个docker镜像

你肯定打过docker镜像是吧,作为一个开发这很正常,那么你用的什么打包方式呢,这里我们来梳理几种常用的docker镜像构建方式。
ps:这里不是太讲原理,更多的是一种科普和操作。因为讲原理的东西网上已经够多了。

一、Dockerfile

dockerfile的打包方式很常见了,我们需要构建一个文件,名字必须就叫Dockerfile,没有后缀名。
我们举个例子,我现在有一个springboot项目,当我们构建出一个jar包的时候,我们就可以基于这个jar包来构建一个docker image。此时我们需要编写一个Dockerfile。比如这样

FROM openjdk:17LABEL "org.opencontainers.image.authors"="areyouok"COPY target/app-0.0.1-SNAPSHOT.jar accounts-0.0.1-SNAPSHOT.jarENTRYPOINT ["java", "-jar", "app-0.0.1-SNAPSHOT.jar"]

我们在这个dockerfile中描述了我们要执行的一组docker指令,然后我们使用docker build来构建镜像,此时就会基于这个文件来构建出我们需要的镜像。
但是这种模式存在一个问题,我们需要知道docker的一些指令,不然你无法构建出合理的镜像。
那么问题来了,我作为一个开发,要学的东西本身就一大堆了。你还要我去掌握这种相对属于运维的知识?我为啥要会docker呢,真就纯当牛马是吧。所以这种模式不好,他无法屏蔽我们对于docker知识的理解,而且我这个文件还比较简单,如果你是大型项目,dockerfile会很复杂,可能要考虑构建的体积,资源的占用以及构建的速度等等。这更加增大了我们的心智成本。至于那个什么docker compose也差不多一样。所以我们需要一种屏蔽底层命令的方式来帮助我们构建镜像。于是在这种需求下,业界产生两种新的构建模式,BuildPacks和Goole libs。下面我们就来看看这两种模式如何操作。

二、BuildPacks

其原理介绍可以参考BuildPacks介绍
我们只需要知道,这种模式不需要你编写什么构建文件,他会分析你的源代码,然后分析编译产生最终的docker image。而且他的构建是完全遵守docker的规范和协议的,构建的大小也是合理的。这个你不需要担心。对于开发来说实在是解放双手的不二选择。他的官网地址是BuildPacks官方地址
下面我们以一个springboot服务来演示一下这东西如何使用。
首先我们要明白BuildPacks是一个生态,在这个生态内有一个很方便的工具来使用,帮助我们构建镜像。那就是paketo
你能看到他支持多种应用的构建,其中自然包括java在这里插入图片描述

1、pom文件

首先你要确认你的pom文件是可以打包为jar的,当你有了这个配置哪你就要保证有maven对应的插件。也就是如下配置。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>......<packaging>jar</packaging>......<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>

这样我们就可以确保我们可以基于maven构建springboot对应的jar包。并且buildpacks也是基于这个来构建镜像的。当我们有了这个之后,我们还需要在配置中为镜像构建提供一些信息,比如名称之类的,好的,让我们来修改一下我们的pom配置。

 ......<artifactId>loans</artifactId><version>0.0.1-SNAPSHOT</version><name>loans</name><packaging>jar</packaging>
......<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!--这里做了修改--><image><name>levi/${project.artifactId}:s4</name><!--你的镜像名称和版本号,你可以取一个你能标识的,我这里用的就是服务的坐标名称,版本号s4--></image><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>

ok,至此我们的配置就简单的改完了,当然你还可以配置一些其他的诸如作者信息等等。你可以看到非常简单,他会分析你的pom文件中的结构信息包括jdk版本之类的构建对应的镜像结构。

2、mvn构建

此时让我们借助idea的maven工具并且使用mvn spring-boot:build-image来构建镜像,他会在后台为我们通过buildpacks来构建镜像,其实就是maven其实集成了这个功能而已。或者你也可以直接在dos窗口用mvn命令,我因为没配maven环境变量所以懒得弄了。当然你要先启动你的docker服务。
在这里插入图片描述

第一次构建可能会稍微耗时一点,可以略微等一等,但是他是增量的,第二次就快了。
最终我们可以看到构建成功了.
在这里插入图片描述
此时我们就可以使用命令看看我们是不是有这个镜像了。
在这里插入图片描述
没有问题,名称和版本都是我们指定的。接下来你就可以使用这个镜像了。

三、google jib

这个工具是谷歌公司搞得,你可以在github上看到他google jib
你可以在介绍中看到,他其实也是可以构建多语言应用的镜像,自然也是包括java的。所以我们完全可以使用。
而且支持maven插件,我们可以点进去链接,然后按照教程使用即可。
在这里插入图片描述

1、pom文件

按照教程我们要在我们的pom文件中添加一个插件。

<plugin><groupId>com.google.cloud.tools</groupId><artifactId>jib-maven-plugin</artifactId><version>3.3.2</version><configuration><to><image>myimage</image></to></configuration>
</plugin>

所以我们要修改一下我们的pom文件。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">......<artifactId>cards</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging>......<build><plugins><plugin><groupId>com.google.cloud.tools</groupId><artifactId>jib-maven-plugin</artifactId><version>3.3.2</version><configuration><to><image>levi/${project.artifactId}:s4</image><!--这里还是名字,版本--></to></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

此时刷新你的pom,你会看到idea就为你引入了这个插件。

2、mvn构建

在这里插入图片描述
此时你就可以使用这个来构建了,当然你依然可以使用mvn命令(mvn compile jib:dockerBuild)如果你配置了环境变量的话。
所以我们可以直接在idea插件中运行即可。
在这里插入图片描述
ok,我们可以看到最后是构建成功的。
在这里插入图片描述
我们再次查看一下我们的镜像库。
在这里插入图片描述
没有任何问题。而且前面的几种方式不管是dockerfile还是buildpacks你至少本地得有个docker服务,也就是docker环境。但是google jib甚至不需要你装docker服务,就是这么简单。但是你的运行环境还是要有的,毕竟你最终是要启动容器的。他只是在构建的时候不需要docker环境。
但是这对于我们实际是很有帮助的,比如你在公司配置jeckens这种自动构建,你完全可以不用docker了,只需要配置构建即可。
当然他还有很多配置,你可以参考文档。

四、总结

至此我们就介绍了常用的几种构建模式,我们看到其实各有利弊吧。看你喜欢哪一种了,只是后面两种不需要你掌握太多docker知识,更加专注于业务开发。
在buildpacks的官方文档下面有一个对比的表格,我们可以看到各类构建的优劣。
构建模式大比武
当然,很多时候这种带点吹自己贬别人,你如果不相信他的说法,可以自己测试一下,相信结果。

相关文章:

【橘子容器】如何构建一个docker镜像

你肯定打过docker镜像是吧&#xff0c;作为一个开发这很正常&#xff0c;那么你用的什么打包方式呢&#xff0c;这里我们来梳理几种常用的docker镜像构建方式。 ps&#xff1a;这里不是太讲原理&#xff0c;更多的是一种科普和操作。因为讲原理的东西网上已经够多了。 一、Dock…...

EFAK kafka可视化管理工具部署使用

简介&#xff1a;EFAK是开源的可视化和管理软件。它允许您查询、可视化、提醒和探索您的指标&#xff0c;无论它们存储在何处。简单来说&#xff0c;它为您提供了将 Kafka 集群数据转换为漂亮的图形和可视化效果的工具。 环境&#xff1a;①操作系统&#xff1a;CentOS7.6&…...

Spring Boot 工程分层实战(五个分层维度)

1、分层思想 计算机领域有一句话&#xff1a;计算机中任何问题都可通过增加一个虚拟层解决。这句体现了分层思想重要性&#xff0c;分层思想同样适用于Java工程架构。 分层优点是每层只专注本层工作&#xff0c;可以类比设计模式单一职责原则&#xff0c;或者经济学比较优势原…...

vscode IntelliSense Configurations

IntelliSense 是一个强大的代码补全和代码分析功能&#xff0c;它可以帮助开发者提高编程效率。图中显示的是 VSCode 的 IntelliSense 配置界面&#xff0c;具体配置如下&#xff1a; Compiler path&#xff08;编译器路径&#xff09;: 这里指定了用于构建项目的编译器的完整路…...

hbase读写操作后hdfs内存占用太大的问题

hbase读写操作后hdfs内存占用太大的问题 查看内存信息hbase读写操作 查看内存信息 查看本地磁盘的内存信息 df -h查看hdfs上根目录下各个文件的内存大小 hdfs dfs -du -h /查看hdfs上/hbase目录下各个文件的内存大小 hdfs dfs -du -h /hbase查看hdfs上/hbase/oldWALs目录下…...

C++----入门篇

引言 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&#xff0c;对C学习有一定的帮助&#xff0c;本章节主要目标&#xff1a; 1. 补充C语言语法的不足&#xff0c;以及C是如何对C语言…...

C语言程序设计P5-5【应用函数进行程序设计 | 第五节】—知识要点:变量的作用域和生存期

知识要点&#xff1a;变量的作用域和生存期 视频&#xff1a; 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 有一个一维数组&#xff0c;内放 10 个学生成绩&#xff0c;写一个函数&#xff0c;求出平均分、最高分和最低分。 任务要求用一个函数来完…...

用 Sass 模块化系统取代全局导入,消除 1.80.0 引入的 @import 弃用警告

目录 前言 问题 import 的缺陷 命名冲突 重复导入 模块系统 use 规则 forward 规则 实际修改 前言 最初&#xff0c;Sass 使用 import 规则通过单个全局命名空间加载其他文件&#xff0c;所有内置函数也可全局使用。由于模块系统&#xff08;use 和 forward 规则&…...

安卓低功耗蓝牙BLE官方开发例程(JAVA)翻译注释版

官方原文链接 https://developer.android.com/develop/connectivity/bluetooth/ble/ble-overview?hlzh-cn 目录 低功耗蓝牙 基础知识 关键术语和概念 角色和职责 查找 BLE 设备 连接到 GATT 服务器 设置绑定服务 设置 BluetoothAdapter 连接到设备 声明 GATT 回…...

搭建fastapi项目

环境准备 # 创建项目目录 mkdir my_fastapi_project cd my_fastapi_project# 创建和激活虚拟环境 python -m venv venv .\venv\Scripts\activate安装必要的包 pip install fastapi uvicorn python-dotenv创建项目基本结构 my_fastapi_project/ │ .env # …...

Maven学习(Maven项目模块化。模块间“继承“机制。父(工程),子项目(模块)间聚合)

目录 一、Maven项目模块化&#xff1f; &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;汽车模块化生产再聚合组装。 &#xff08;3&#xff09;Maven项目模块化图解。 1、maven_parent。 2、maven_pojo。 3、maven_dao。 4、maven_service。 5、maven_web。 6…...

华为云云原生中间件DCS DMS 通过中国信通院与全球IPv6测试中心双重能力检测

近日&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;与全球IPv6测试中心相继宣布&#xff0c;华为云的分布式缓存服务&#xff08;Distributed Cache Service&#xff0c;简称DCS&#xff09;和分布式消息服务&#xff08;Distributed Message …...

PostgreSQL中事件触发器Event Trigger

在PostgreSQL中&#xff0c;事件触发器&#xff08;Event Trigger&#xff09;是一种特殊的触发器类型&#xff0c;它允许你在特定的数据库系统事件发生时执行特定的操作。与普通的触发器不同&#xff0c;事件触发器并不与特定的表或视图相关联&#xff0c;而是与数据库级别的全…...

uni.request流式(Stream)请求,实现打印机效果

最近使用扣子 - 开发指南 (coze.cn)和智谱AI开放平台开发小程序AI导诊和用药对话指南。 开发的过程中也是走了不少坑,下面就来聊聊走了哪些坑。 坑1 :coze试了v2和v3的接口,两个接口请求还是有点差别的,v2拿到了botId和accessToken可以直接请求不需要做任何处理,v3还需要…...

canvas保存图片

需求&#xff1a;上面有几个按钮&#xff0c;其中有一个切换是图片 用v-if会导致图片加载慢 实现方法&#xff1a; 一进来就加载&#xff0c;通过监听元素显示&#xff0c;用于控制canvas的宽高&#xff0c;从而达到隐藏的效果 组件dowolad.vue <template><view …...

DNS到底有什么用?

举个例子&#xff0c;对于我们来说访问的域名是www.baidu.com&#xff0c;但是实际在计算机并不认识这个域名&#xff0c;计算机是需要通过IP地址去访问这个网站&#xff0c;所以呢&#xff1f;这个时候就需要一个dns解析器&#xff0c;来把这串域名转换为IP地址给计算机去访问…...

什么是CRM系统?CRM系统的功能、操作流程、生命周期

CRM系统作为企业管理和维护客户关系的重要工具&#xff0c;在商业活动中扮演着越来越重要的角色。今天&#xff0c;就让我们一起揭开它的神秘面纱&#xff0c;看看这个“幕后英雄”到底是怎么工作的。 什么是CRM系统&#xff1f; 首先&#xff0c;我们要了解什么是CRM。简单来…...

美畅物联丨JS播放器录像功能:从技术到应用的全面解析

畅联云平台的JS播放器是一款功能十分强大的视频汇聚平台播放工具&#xff0c;它已经具备众多实用功能&#xff0c;像实时播放、历史录像回放、云台控制、倍速播放、录像记录、音频播放、画面放大、全屏展示、截图捕捉等等。这些功能构建起了一个高效、灵活且用户友好的播放环境…...

我们来学mysql -- 事务并发之不可重复读(原理篇)

事务并发之不可重复读 题记不可重复读系列文章 题记 在《事务之概念》提到事务对应现实世界的状态转换&#xff0c;这个过程要满足4个特性这世界&#xff0c;真理只在大炮射程之类&#xff0c;通往和平的道路&#xff0c;非“常人”可以驾驭一个人生活按部就班&#xff0c;人多…...

ABAQUS进行焊接仿真分析(含子程序)

0 前言 焊接技术作为现代制造业中的重要连接工艺,广泛应用于汽车、船舶、航空航天、能源等多个行业。焊接接头的质量和性能直接影响到结构件的安全性、可靠性和使用寿命。因此,在焊接过程中如何有效预测和优化焊接过程中的热效应、应力变化以及材料变形等问题,成为了焊接研…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...