聊聊Docker镜像

Docker镜像简介 文章目录Docker镜像简介1、Docker中镜像的结构(1)镜像的结构原理图(2)实践理解镜像结构特性<1>交互式运行容器的基础操作<2>实践操作理解镜像特性2、如何构建镜像(1)手动构建新镜像(2)通过dockerfile自动构造新镜像(3)使用dockerfile方式自动构建镜像的缓存特性 Docker镜像简介 1、Docker中镜像的结构 (1)镜像的结构原理图 在... 阅读详情

 

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

640?wx_fmt=png
Docker

回顾前面:

前面两篇已经讲解了为什么需要Docker这项技术,以及解释了Docker的基本概念/术语,使用Docker成功运行Tomcat~

在上篇也同样留下一个问题:我们知道Tomcat运行起来需要Java的支持,那么我们在DockerHub拉取下来的Tomcat镜像是不是也有Java环境呢?

所以,这篇主要来讲讲Docker镜像相关的知识点!

一、简单了解Dockerfile

Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本。

简单来说:Dockerfile是镜像的源码。

上一篇我们pull了一份Tomcat的镜像,我们也可以去看看它的Dockerfile长的什么样:

640?wx_fmt=png
搜索,拉下去就有得看Dockerfile了

我们随便点进去一个看一下:

640?wx_fmt=png
Dockerfile

我们在Dockerfile的第一行就可以发现FROM openjdk:8-jre,所以可以确定的是:在DockerHub拉取下来的Tomcat镜像一定有Java环境!

在这里我们先不说如何阅读/编写Dockerfile文件,先了解到Dockerfile是镜像的源码即可

简单来说:通过Dockerfile文件可以知道我们拉取下来的镜像究竟是怎么构建的。

二、解除镜像的疑惑

我们知道Docker Hub有很多常用的镜像,比如说Centos。我们去pull一个下来看看Docker中的Centos长啥样:

640?wx_fmt=png
从Hub中pull一个Centos

我们可以发现的是:Tomcat的SIZE竟然比Centos还要大!但按我们常规的想法,Centos的镜像可能是3或4GB(现在200M),Tomcat的镜像可能就200M(现在400M)。这是为什么呢??

如果我们在pull的时候观察得比较仔细的话,可以发现pull会拉下很多层镜像:

640?wx_fmt=png
pull到很多层镜像

完全pull下来的之后,我们如果使用docker images只能查看到最终的镜像:

640?wx_fmt=png
只能看到最终我们拉下来的镜像

如果我们使用docker images -a命令的话,可以把中间层镜像都查出来:

640?wx_fmt=png
理想效果

Emmm,我们可以使用history命令来看看,可以发现Tomcat包含很多个镜像层

640?wx_fmt=png
使用history命令可以发现Tomcat包含很多个镜像层

还可以发现一点:Dockerfile有多少条命令,那就有多少个镜像层(不信你数数)

说了那么多,就想让大家知道:我们拉取下来的镜像实际上是由很多中间层镜像组成的。

再结合我们上一篇Docker入门为什么可以这么简单?,在解决Tomcat启动时一直卡住问题时,能够发现的是,我们可以使用cd, ls等基础命令,但无法使用vi命令(需要我自己去下载)。

我们可以推断出,pull下来的镜像由很多层镜像组成【这些镜像都是精简过的(甚至连vi命令都不支持)】

三、Docker镜像的特点

关于Docker镜像,有以下特点:

640?wx_fmt=png
Docker镜像示意图

图像来源:http://open.daocloud.io/allen-tan-docker-xi-lie-zhi-shen-ke-li-jie-docker-jing-xiang-da-xiao/

3.1镜像呈现层级结构

联合文件系统(UnionFS)是实现Docker镜像的技术基础。在Docker中一般使用是AUFS(Another Union File System或Advanced Multilayered Unification File System)【具体还是得看宿主机用的什么系统】。

在搜索中文资料的时候,常常会发现有类似的解释:

“AUFS是一种 Union FS, 简单来说就是“支持将不同目录挂载到同一个虚拟文件系统下的文件系统”, AUFS支持为每一个成员目录设定只读(Rreadonly)、读写(Readwrite)和写(Whiteout-able)权限。Union FS 可以将一个Readonly的Branch和一个Writeable的Branch联合在一起挂载在同一个文件系统下”。

看得我一头雾水….后来去官方文档介绍AUFS:

AUFS is a union filesystem, which means that it layers multiple directories on a single Linux host and presents them as a single directory. These directories are called branches in AUFS terminology, and layers in Docker terminology

说白了,还是可以理解成:Docker的镜像的基础是联合文件系统,它支持将文件系统中的修改信息作为一次提交,并层层叠加,外界看到的是最外层的镜像。(比如外界只看到Tomcat镜像,而中间叠加了很多层镜像)

(这里只是拿AUFS说明,Docker实际上支持很多存储驱动,比如还有devicemapper,overlay2(Ubuntu的14.04.4或更高版本,16.04或更高版本), overlay,zfs

3.1.1镜像继承(共享)

Docker镜像可以通过分层来进行继承。

例如,hello-world的Dockerfile镜像FROM scratch镜像,scratch在Docker中是一个基础镜像

FROM scratchCOPY hello /CMD ["/hello"]
COPY hello /
CMD ["/hello"]

Centos的Dockerfile镜像也是FROM scratch镜像:

FROM scratchADD centos-7-docker.tar.xz /LABEL org.label-schema.schema-version="1.0" \    org.label-schema.name="CentOS Base Image" \    org.label-schema.vendor="CentOS" \    org.label-schema.license="GPLv2" \    org.label-schema.build-date="20181205"CMD ["/bin/bash"]

LABEL org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20181205"

CMD ["/bin/bash"]

那么Centos镜像和hello-world共享同一个基础镜像层scratch,提高了存储效率。

再说个例子,比如我们有一个Centos镜像,这个镜像大小是202M。然后,我们基于Centos镜像手动往里边添加一个Tomcat(假设这个Tomcat的大小是300M),生成一个镜像,总大小就是502M了。

如果仅仅是单纯的累加这两个镜像的大小:202M+502M=704M,但是由于镜像复用的存在,实际占用的磁盘空间大小是:202M+300M=502M

AUFS uses the Copy-on-Write (CoW) strategy to maximize storage efficiency and minimize overhead。

如果想要了解COW,不妨阅读我之前写过的文章:

3.2json文件

Docker每一层镜像的json文件,都扮演着一个非常重要的角色,其主要的作用如下:

Docker镜像的json文件可以认为是镜像的元数据信息

最后

今天简单地聊了一下Docker镜像的一些细节,但没去深入了解,想要继续深入的同学还得通过官方文档等途径去学习哈。

参考资料:

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!

640?wx_fmt=jpeg
帅的人都关注了
觉得我的文章写得不错,不妨点一下 好看 并 分享 给朋友!


从一次诡异的Docker镜像加载失败,聊聊镜像层(Layer)和SHA256的那些事儿 本文通过一次Docker镜像加载失败的案例,深入探讨了镜像层(Layer)和SHA256哈希的底层机制。文章详细解析了`invalid diffID`错误的成因,揭示了Docker镜像分层架构的设计哲学,并提供了实用的故障排查方法和镜像安全实践,帮助开发者更好地理解和运用容器技术。 阅读详情

相关推荐

Docker跑openGauss,镜像选对了吗?聊聊enmotech镜像的隐藏配置和最佳实践

本文深入探讨了在Docker环境下使用enmotech提供的openGauss镜像进行生产级部署的最佳实践。从镜像选择、启动参数配置到安全加固和性能调优,详细解析了隐藏的关键配置和优化技巧,帮助用户实现高性能、高可用的数据库容器化部署。特别适合金融、电信等领域的数据库管理员和DevOps工程师参考。

weixin_42665725的博客 151

Docker镜像超详细介绍,java基础教程pdf百度云

其实我们也会考虑docker为什么会才用这种分层的结果,它有什么好处呢?最大的一个好处就是共享资源 比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。 2. 镜像的特点 ======================================================================== 大家需要注意,docker镜像都是只读的,当容器启动.

m0_64383449的博客 759

OpenCV实战:如何用Debevec算法搞定相机响应函数(附完整代码)

本文详细介绍了如何使用OpenCV实现Debevec算法计算相机响应函数(CRF),并应用于HDR图像合成。通过完整的代码示例和工程实践问题解决方案,帮助开发者掌握从原理到实现的关键步骤,提升高动态范围成像和计算机视觉任务的处理能力。

weixin_29061041的博客 229

Dockerfile中的保留字指令讲解

之前简单学过Docker,当时是为了快速部署一个项目,过的很快,对于Dockerfile文件的编写,有些显的陌生。 所以就写了这篇文章。希望能够帮助到大家哦!!! 一、Dockerfile是什么? 概念: Dockerfile是用来构建Docker镜像的构建文件,由一系列命令和参数构成的脚本 构建三步骤: 编写Dockerfile文件 docker build docker run Centos案例: centos案例: FROM scratch #真正的基础镜像, ADD centos-7-x8.

北 555

基于Python实现的捕鱼达人小游戏源代码+使用说明

摘要: 本文介绍了一款自制的捕鱼达人小游戏,使用Python3和Pygame模块开发。游戏包含完整的资源文件(图片、音效、字体)和源码结构(11个功能模块),实现了大炮移动射击、特殊子弹、炸弹、难度递增等核心玩法。安装需配置Python环境和Pygame模块,运行main.py即可启动游戏。游戏支持键盘控制(方向键移动、空格射击、1键放炸弹),默认时长600秒,包含开始菜单、游戏界面和结束界面。所有代码均有详细注释,项目已开源并提供下载链接。(150字)

2301_76484015的博客 667

Python实战:5分钟搞定抖音无水印视频下载(附完整代码)

本文系统介绍了抖音无水印视频下载的多种技术方案,重点解析了抖音视频的获取逻辑与去水印原理。文章提供了从零代码的浏览器插件到可编程的Python脚本的完整实现路径,并附带了详细的代码示例,帮助用户快速构建自己的抖音视频下载工具箱。

weixin_29089057的博客 847

Docker基础-8-Dockerfile语法基本介绍

前面我们学习了docker的一些命令,这篇来详细学习Dockerfile中的语法。前面,说过了,我们制作镜像文件,只推荐通过Dockerfile的方式去docker build出来。也就是,你要发布一个镜像,你得先学习如何写一个Dockerfile,就是先要学习Dockerfile的基本语法和使用举例。 一个centos7 base image官方Dockerfile https://g...

Jian Sun_的博客 577

MatLab:数字图像处理实验

图像处理基本处理实验目的实验环境实验内容题目一代码结果题目二平移平移代码平移结果水平镜像水平镜像代码水平镜像结果垂直镜像垂直镜像代码垂直镜像结果放大放大代码放大结果缩小缩小代码缩小结果旋转旋转代码旋转结果双线性旋转旋转代码旋转结果 实验目的 1、熟悉并掌握MATLAB工具的使用;  2、实现图像的读取、显示、存储、平移、镜像、放大、缩小及旋转操作; 3、掌握常用的插值方法,并了解其优缺点。 实验环境 MatLab2016 实验内容 题目一 读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分别显

luoyao_的博客 9696

Docker file lable指令

你先在正在做一个新的基于容器的项目。你几乎要完成了,现在你想要编译你的docker image并将其公开发布。 底层操作系统是linux, 然后你的工具打包入其中,最后获得了一个80Mb的包,你打上latest的tag并将其推到公共的Docker Hub。 很快,人们开始基于你的工具开始他们的工作。很酷吧。然后你解决了一些小问题,然后重新编译你的包,再次打上latest的tag并推到公共的Docker Hub。 但是这次,工具本身的工作方式发生了改变,现在的输出,文档和手册的工作方式都和以前不同。但是你

qq_30436011的博客 3824

【蓝凌表单】JSP组件常用语法整理

【代码】【蓝凌表单】JSP组件常用语法整理。

烧硬盘 708

Open3D 基于法向量夹角的特征点提取

基于法向量夹角的特征点提取是一种在点云处理中用于识别表面变化显著区域的技术。通过计算点云中每个点的法向量与其邻域点法向量之间的夹角,可以判断点云表面的局部变化程度,并提取那些法向量变化较大的点作为特征点。这种方法特别适用于提取边缘、角点等关键几何特征。

纵马踏花向自由 1553

docker centos镜像_聊聊Docker镜像

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3yDocker回顾前面:为什么需要Docker?Docker入门为什么可以这么简单?前面两篇已经讲解了为什么需要Docker这项技术,以及解释了Docker的基本概念/术语,使用Docker成功运行Tomcat~在上篇也同样留下一个问题:我们知道To...

weixin_39862484的博客 218

5、Raspberry Pi CPU架构与多线程编程详解

本文详细介绍了Raspberry Pi的CPU架构(包括ARMv6Z、ARMv7-A和ARMv8-A),通过/proc/cpuinfo解析硬件信息,并深入探讨了多线程编程的核心技术。内容涵盖pthread库的使用,如线程创建、属性设置、等待与分离、线程同步机制(互斥锁),以及实际应用场景如多媒体处理和网络服务。同时强调了线程安全、死锁预防和资源管理等关键注意事项,帮助开发者在Raspberry Pi上构建高效稳定的多线程应用。

sre5engineer的博客 95

聊聊 Docker 镜像的制作策略

在 Docker 中创建镜像时,如何处理应用程序及其依赖关系是一项非常关键的设计决策,直接影响镜像的可维护性、性能、可扩展性以及开发运维效率。对于你提到的场景,比如 Java 应用程序、JRE、Redis、MySQL 等的依赖管理,通常采用的做法是将它们分别打包为不同的 Docker 镜像,而不是将所有内容打包到一个单一的镜像中。原因在于 Docker 的设计理念和微服务架构的哲学,这些都提倡应用程序的组件要做到高度解耦和独立,以提升灵活性、可移植性和重用性。

孔乙己的博客 1156

NVIDIA Isaac Sim 联合 VS Code 开发调试环境配置

在 Visual Studio Code (VS Code) 中打开 Isaac Sim 软件包主文件夹,即可打开该工作区。注意建议在学习教程和示例时使用 Visual Studio Code。另请参见有关 VS Code 工作区的详细信息,请参阅 Visual Studio Code (VS Code) 文档。

2506_90492529的博客 3104

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

聊聊gitlab ci如何构建以时间为版本号的docker镜像

最近朋友他们部门有部分内部项目,打算用gitlab ci来做项目持续集成部署,他们有个需求,构建docker镜像的时候,版本需要是以当前时间作为版本。其格式为yyyymmddhhmm一开始朋友翻阅官方文档,发现gitlab ci有个变量CI_COMMIT_TIMESTAMP,可以生成时间戳,他默认生成的格式是ISO-8601。就是类似2022-01-31T16:47:55Z这种,很显然和朋友他们的需求不符合。于是他就想用如下方式进行转换结果报如下错后面他调整为如下方式,即直接用date命令输出当前时间戳。

kingwinstar的博客 1172

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[Node + Docker] 聊聊怎么把 nodeclub 构建成 Docker 镜像

14年毕业后开始接触node,15年来帝都找了份工作,一直默默的在cnode社区晃悠,灌过几次水,今天就想发个处女贴,跟大家聊聊怎么把nodeclub项目源码构建成一个镜像。话说Docker是今年刚接触的,还在入门中/(ㄒoㄒ)/~~,下面我简单介绍下Docker、Dockerfile的语法以及如何把nodeclub源码构建成镜像。(已经...

weixin_33905756的博客 172

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

别再直接‘docker commit’了!从一次GPU挂载失败聊聊Docker镜像构建的最佳实践

本文探讨了Docker镜像构建的最佳实践,特别是针对GPU挂载失败的问题。通过分析`docker commit`的潜在风险,提出了使用NVIDIA官方CUDA基础镜像和多阶段构建的方法,确保镜像的可复现性和兼容性。文章还介绍了诊断GPU挂载问题的系统方法,以及基础设施即代码(IaC)的实践,帮助开发者构建高效、安全的GPU环境镜像。

weixin_31327207的博客 308

从一次诡异的Docker构建失败,聊聊镜像层校验和那些坑(附修复脚本)

本文深入探讨了Docker构建过程中出现的镜像层校验和(sha256)不一致问题,分析了包括网络传输比特翻转、存储驱动损坏等五大常见诱因,并提供了详细的手动修复步骤和自动化修复脚本,帮助开发者有效解决invalid diffID错误,确保镜像完整性。

weixin_30698527的博客 616

聊聊Linux常用命令、Docker容器化、本地镜像仓库、GitLab私服、Jenkins自动化部署

GitLab是一个开源的Git仓库管理系统,它可以在本地搭建私有Git代码托管服务,并提供包括代码管理、问题跟踪、CI/CD等功能。Docker是一种容器化技术,将应用程序、依赖项和配置打包到一个可移植的容器中,以在不同的环境中运行。Jenkins是一个开源的自动化部署系统,它可以帮助开发人员自动化构建、测试、打包和部署应用程序。本地镜像仓库是一个保存镜像的地方,可以将镜像上传到本地仓库中,以便在没有互联网连接的情况下使用。

我是Java程序员廖志伟,感谢朋友们的支持! 1141

别再乱写版本号了!从npm包到Docker镜像,聊聊SemVer规范的实际应用与踩坑

本文深入探讨SemVer规范在npm包和Docker镜像管理中的实际应用与常见陷阱。通过真实案例解析X.Y.Z版本号的核心原则,揭示依赖管理和容器部署中的版本控制策略,帮助开发者避免生产环境中的版本灾难,提升软件发布的可靠性和一致性。

weixin_33682790的博客 482

此操作系统不支持 .net framework 4.6.2。_聊聊.net应用程序的Docker镜像

要在容器中运行.net应用程序,你需要在容器镜像中安装.net Framework或.net Core 运行时。这不是你需要自己管理的东西,因为微软提供的Docker镜像已经安装了运行时,你可以使用它们作为基础镜像来打包你自己的应用程序。. net镜像有几种变体,涵盖了不同的版本和不同的运行时。本文将指导你为应用程序选择正确的镜像。使用基础镜像你的应用需要运行一堆先决条件,比如操作系统和语言运行时...

weixin_29133985的博客 2220

从Alpine到Distroless:为什么你的Docker exec命令总失败?聊聊容器基础镜像的选择与交互技巧

本文探讨了Docker容器基础镜像选择与交互技巧,分析了从Alpine到Distroless镜像的差异及其对`docker exec`命令的影响。针对常见的`OCI runtime exec failed`报错,提供了详细的排查方法和高级调试策略,帮助开发者在轻量化与可调试性之间找到平衡。

weixin_33693070的博客 158
上一篇: RPC太太太太太太太容易理解啦!
下一篇: SpringBoot自动配置原理
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值