【云原生 | 从零开始学Docker】四、Docker镜像深度解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 相信大家经过前面的练习都掌握了基本的指令,在实战操作之后我们就要进行镜像的详解来帮助大家对于docker有一个更深层次的理解,并且会介绍一下我们的容器卷,后面也会用到容器卷进行数据同步!

镜像原理


镜像是什么


镜像是一种轻量级,可执行的独立软件包,用来打包软件环境和基于运行环境开发的软件,它包含某个软件的所有所需内容,包括代码,环境等。


容器与镜像的关系


容器是一个动态的环境,每一层镜像中的文件属于静态内容,然而 Dockerfile 中的ENV、VOLUME、CMD等内容最终都需要落实到容器的运行环境中,而这些内容均不可能直接坐落到每一层镜像所包含的文件系统内容中,那此时每一个docker镜像还会包含json文件记录与容器之间的关系。


镜像加载原理


UnionFS(联合文件系统)


联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。


联合文件系统有一个特性:它可以一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。


举个例子,比如一个mysql,一个tomcat,tomcat下载了centos,mysql就不用下载了 ,过去就用,并且他是一层一层叠加的。


分层加载


Docker的镜像实际由一层一层的文件系统组成:


bootfs


主要包含bootloader和kernel。bootloader主要是引导加载kernel,完成后整个内核就都在内存中了。此时内存的使用权已由bootfs转交给内核,系统卸载bootfs。可以被不同的Linux发行版公用。


bootfs 启动的时候都要引导加载,加载linux的东西几乎不变,一个内核一个加载器,加载完之后会自动卸载卸载bootfs并把权限交给内核。


rootfs


包含典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同操作系统发行版(Ubuntu,Centos等)。因为底层直接用Host的kernel,rootfs只包含最基本的命令,工具和程序就可以了。


对于一个精简的os,rootfs可以很小,只需要包含基础命令,工具和程序库,因为底层直接用host的kernel,自己只用提供bootfs就行了,对于不同的linux版本,bootfs基本一致。rootfs会有差别,因此不同的版本可以用公用的bootfs。


49.png


所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的容器层,比如centos是第一层,python是第二层。这样有一个最大的一个好处就是共享资源


比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像, 同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。实现了资源共用,所以pull是分层下载,避免重复下载,简单的类比就是虚拟机,你多个虚拟机用同一个镜像。


并且在添加额外的镜像层时,它会始终保持所有镜像组合,比如一个镜像两层,每层三个文件,最终拼起来是六个文件,但是突然来了个新需求,新加了一层,但是这个新加的文件是第二层的一个升级版,此时系统会覆盖一下低级版本,所以还是六个文件。


5.png


我们pull了一个tomcat,本来的tomcat是只读的,我们启动之后它会在上面加一层,所有操作都在这里,叫容器层。然后再两个一起打包成一个大的镜像(也是新的)底层的东西不会变的,你的操作实际上就是在新加操作。


特点


容器在启动时会在镜像最外层上建立一层可读写的容器层(R/W),而镜像层是只读的(R/O),“容器层”之下的都叫“镜像层”。


如何提交自己的镜像


docker commit 提交容器成为新的副本
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]


通过上篇文章下载的tomcat来示范


50.png


51.png


这样就完成了镜像上传,也算是docker的精华,整个环境打包,类似于快照,想保存就commit打包就可以了。

目录
相关文章
|
4天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
135 28
|
18天前
|
缓存 监控 持续交付
|
6天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
63 2
|
8天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
17 1
|
9天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
13天前
|
存储 缓存 Java
Java应用瘦身记:Docker镜像从674MB优化至58MB的实践指南
【10月更文挑战第22天】 在容器化时代,Docker镜像的大小直接影响到应用的部署速度和运行效率。一个轻量级的Docker镜像可以减少存储成本、加快启动时间,并提高资源利用率。本文将分享如何将一个Java基础Docker镜像从674MB缩减到58MB的实践经验。
26 1
|
20天前
|
Docker 容器
docker:记录如何在x86架构上构造和使用arm架构的镜像
为了实现国产化适配,需将原x86平台上的Docker镜像转换为适用于ARM平台的镜像。本文介绍了如何配置Docker buildx环境,包括检查Docker版本、安装buildx插件、启用实验性功能及构建多平台镜像的具体步骤。通过这些操作,可以在x86平台上成功构建并运行ARM64镜像,实现跨平台的应用部署。
247 2
|
21天前
|
存储 应用服务中间件 云计算
深入解析:云计算中的容器化技术——Docker实战指南
【10月更文挑战第14天】深入解析:云计算中的容器化技术——Docker实战指南
50 1
|
24天前
|
网络协议 Docker 容器
docker pull命令拉取镜像失败的解决方案
docker pull命令拉取镜像失败的解决方案
548 1
|
29天前
|
缓存 网络协议 网络安全
docker中DNS解析问题
【10月更文挑战第6天】
122 6
下一篇
无影云桌面