Docker 学习笔记(五):梳理 Docker 镜像知识,附带 Commit 方式提交镜像副本,安装可视化面板 portainer

一、前言

记录时间 [2024-4-10]

前置文章:
Docker学习笔记(一):入门篇,Docker概述、基本组成等,对Docker有一个初步的认识
Docker学习笔记(二):在Linux中部署Docker(Centos7下安装docker、环境配置,以及镜像简单使用)
Docker 学习笔记(三):Centos7 中 Docker 使用,镜像、容器,以及操作等常用命令小结
Docker 学习笔记(四):练习篇,Linux 中使用 Docker 部署 Nginx,Tomcat,以及 ElasticSearch


笔者对关于 Docker 学习的文章进行了整理,需要的朋友可以参考上面专栏哦。

学前准备工作:

  • Docker 学习视频
  • Docker 官方文档
  • Docker 远程仓库
  • Linux 云服务器/虚拟机
  • FinalShell 远程连接工具

在前几篇文章中,笔者讲述了关于Docker 学习的入门知识,本文是 Docker 入门的最后一篇,主要是对 Docker 镜像知识的梳理,附带了 Commit 方式提交镜像副本的操作,以及可视化面板 portainer 的安装

主要内容有:

  • 如何获取镜像
  • 联合文件系统 UnionFS
  • Docker 镜像加载原理
  • Commit 镜像
  • 安装可视化面板 portainer

二、划重点

Docker 镜像知识划重点

  • 分层 + 堆叠 + 共用
  • 方便部署和扩展:任何应用都能通过打包成 docker 镜像的方式,直接完成运行。
  • 下载镜像时看到的一层一层的,就是联合文件系统
  • 为什么镜像是一层层下载的?因为联合文件系统的修改是一次次叠加的
  • 其中某些层可以让不同的镜像共用,比如:tomcat 和 mysql 镜像都会用到 centos 那一层。
  • 在添加额外的镜像层的同时,镜像始终保持是当前所有镜像层的组合
  • 虚拟机要自己启动底层,所以分钟级;容器用宿主机的底层,所以秒级。

三、Docker 镜像知识

梳理一遍原理,重点在于理解分层

1. 镜像是什么

镜像是一种轻量级、可执行的独立软件包,将开发的软件该软件的运行环境一起打包,即:镜像中包含运行这个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。


2. 如何获取镜像

  • 从远程仓库下载镜像
  • 从朋友处拷贝镜像
  • 使用 DockerFile 自己制作镜像

3. 联合文件系统(UnionFS)

联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持将对文件系统的修改作为一次提交一层层地叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。

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

联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。


4. Docker 镜像加载原理

Docker 镜像实际上由一层一层的文件系统组成,这种层级的文件系统即为联合文件系统

比如下面提到的 bootfs 和 rootfs 这两层。

bootfs(boot file system)

  • 用于系统启动的加载引导,也就是计算机从黑屏开机进入系统之间的过程;
  • bootfs 主要包含加载器(bootloader)内核(kernel)
  • Linux 刚启动时会加载 bootfs 文件系统,用 bootloader 引导加载 kernel;
  • 可以说,任何镜像都会用到 bootfs,即,bootfs 是公用的Docker 镜像的最底层是 bootfs;
  • 这一层与典型的 Linux/Unix 系统一样,加载完成后整个内核就都在内存中了;
  • 此时内存的使用权已由 bootfs 转交给内核,而 bootfs 会被系统卸载。

rootfs(root file system)

  • rootfs 在 bootfs 之上;
  • rootfs 中包含典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件;
  • rootfs 是各种不同的操作系统发行版,比如 Ubuntu、CentOS 等等;
  • 容器相当于一个小型的虚拟机环境。

再比如,如下图所示:

  • 先下载基础镜像,基础镜像层叠加在内核层之上
  • 再对基础镜像进行两次操作,每次操作都是在下一层往上叠一层

在这里插入图片描述


5. 为什么镜像占内存少

平时安装在虚拟机中的 CentOS 系统一般占好几个 G,为什么 Docker 中的 CentOS 镜像仅 200M 呢?

原因在于操作系统精简

  • 不同的 Linux 发行版,其 bootfs 基本一致,rootfs 会有差别;
  • 底层直接用宿主机的内核,即,公用 bootfs,自己提供 rootfs;
  • rootfs 很小,只需要包含最基本的命令、工具和程序库就即可;
  • 虚拟机要自己启动底层,所以分钟级;容器用宿主机的底层,所以秒级。

6. 镜像分层的理解

下载镜像并观察

使用 Docker 下载一个镜像,观察下载的日志输出,可以看到是一层一层下载的

尝试一下:

[root@localhost ~]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Already exists 
c7a4e4382001: Pull complete 
4044b9ba67c9: Pull complete 
c8388a79482f: Pull complete 
413c8bb60be2: Pull complete 
1abfd3011519: Pull complete 
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

查看下详细信息:

docker image inspect redis:latest

可以看到分层情况 Layers

[root@localhost ~]# docker image inspect redis:latest
[// ..."RootFS": {"Type": "layers","Layers": ["sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f","sha256:9b24afeb7c2f21e50a686ead025823cd2c6e9730c013ca77ad5f115c079b57cb","sha256:4b8e2801e0f956a4220c32e2c8b0a590e6f9bd2420ec65453685246b82766ea1","sha256:529cdb636f61e95ab91a62a51526a84fd7314d6aab0d414040796150b4522372","sha256:9975392591f2777d6bf4d9919ad1b2c9afa12f9a9b4d260f45025ec3cc9b18ed","sha256:8e5669d8329116b8444b9bbb1663dda568ede12d3dbcce950199b582f6e94952"]},...
]

思考

为什么 Docker 镜像要采用这种分层的结构?为了实现资源共享

因为许多镜像都由相同的 Base 镜像构建而来,那么宿主机只需将 Base 镜像在磁盘上保留一份,同时在内存中加载一份,就可以为这些镜像的所有容器服务了,而且镜像的每一层都可以被共享。

Docker 镜像的每一层都是在前一层的基础上进行更改的,此方式可减少磁盘使用和提高镜像传输的效率


理解一

  • 所有的 Docker 镜像都起始于一个基础镜像层
  • 修改或增加新的内容时,会在当前镜像层之上创建新的镜像层。

如图,假如基于 Ubuntu 创建一个新的镜像,Ubuntu 即为新镜像的第 1 层;如果在该镜像中添加 Python 包,就会在基础镜像层之上创建第 2 个镜像层;如果继续添加一个安全补丁,就会创建第 3 个镜像层。该镜像当前已经包含 3 个镜像层。

在这里插入图片描述


理解二

  • 在添加额外的镜像层的同时,镜像始终保持是当前所有镜像层的组合

如下图,这个镜像包含 2 个镜像层,每个镜像层包含 3 个文件。也就是说:镜像 = 2 个镜像层 = 6 个文件

在这里插入图片描述


理解三

  • 上层镜像层中的文件可以覆盖底层镜像层中的文件
  • 将文件的更新版本作为一个新镜像层添加到镜像当中
  • Docker 通过快照机制来实现镜像层堆栈(1.10 版本之前通过存储引擎
  • 保证多镜像层对外展示为统一的文件系统

存储引擎与快照机制:

在 Docker 的早期版本中,每一层都是通过存储引擎的方式来实现的,在底层文件系统上构建一个读写文件系统。但从 Docker 1.10 版本开始,Docker 开始使用了更高效的快照机制来实现层的堆叠。这种快照机制允许 Docker 在不同的层之间共享数据,从而减少了磁盘的使用空间和提高了容器的启动速度。

Linux 中可用的存储引擎:AUFS、Overlay2、Device Mapper、Btrfs、ZFS,顾名思义,每种存储引擎都基于 Linux 中对应的文件系统或者块设备技术,都具备其独有的性能特点。

Windows 中可用的存储引擎:windowsfilter,该引擎基于 NTFS 文件系统之上实现了分层和 CoW。(CoW,Copy-on-Write,能保证数据的完整性,有利于掉电恢复)


如图,在这个镜像中,使用新的镜像层中的文件 7 覆盖了旧镜像层文件 5;对外展示时,提供统一的视图,所有镜像层堆叠并合并。

在这里插入图片描述


在这里插入图片描述


理解四

  • Docker 镜像都是只读的,容器层之下的是镜像层;
  • 创建一个新的容器时,Docker 会创建一个新的可写层(容器层),并加载到镜像的顶部;
  • 在可写层中添加/更新/删除文件;
  • 删除/更新文件时,Docker 会从底层的只读层中提取该文件的副本到可写层,并在可写层中进行更改。

7. 操作原理

如图是镜像相关操作运行的原理,从远程下载到本地运行,镜像是只读文件,所有对它的操作都在容器层中进行。

在这里插入图片描述


四、Commit 镜像

使用 docker commit 命令提交容器成为一个新的副本

# 命令和 git 原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]

操作一下吧:(可以随便找个容器尝试一下)

  • 启动一个默认的 tomcat
  • 发现 默认的 tomcat 下没有 webapps 应用(原因参考这篇文章)
  • 将基本的文件拷贝到 webapps 目录下
  • 将操作后的容器通过 commit 提交为一个新镜像
  • 以后可以使用这个新镜像,是我们自己修改的
  • 这个镜像相当于保存了当前容器的状态,好比 VM 的快照
docker commit -a="yuan" -m="add webapps app" b8e65a4d736d tomcat02:1.0

五、可视化面板

下面简单介绍下可视化面板 portainer 的安装

安装命令:

docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

访问测试:

访问 8088 端口测试,面板如下,可以查看 docker 中镜像、容器等的情况,并进行启动、进入、移除等操作。

在这里插入图片描述


六、总结

本文是 Docker 入门的最后一篇,下一环节进入 Docker 精髓:数据卷、DockerFile、Docker 网络。


一些参考资料

狂神说系列 Docker 教程:https://www.bilibili.com/video/BV1og4y1q7M4/

Docker 官方文档:https://docs.docker.com/engine/install/centos/

Docker 远程仓库:https://hub.docker.com/

FinalShell 下载:http://www.hostbuf.com/t/988.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

库、框架、脚手架和IDE一文讲明白

在区分上面几个问题前,咱们先看看几个疑问。 一、常见问题汇总 js css直接复制到服务器 然后引用不就行了么? 为什么还需要安装? 引入js不就是引入了框架了吗?框架就是js? 脚手架和框架都有架,是不是一…

前端js基础知识(八股文大全)

一、js的数据类型 值类型(基本类型):数字(Number)、字符串(String)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol,大数值类型(BigInt) 引用数据类型:对象(Object)、数组…

Qt | 对象树与生命期(对象的创建、销毁、擦查找)

一、组合模式与对象树 1、组合模式指的是把类的对象组织成树形结构,这种树形结构也称为对象树,Qt 使用对象树来管理 QObject 及其子类的对象。注意:这里是指的类的对象而不是类。把类组织成树形结构只需使用简单的继承机制便可实现。 2、使用组合模式的主要作用是可以通过…

JVM调优工具详解-jps、jmap、jstat、jstack

jps 用于查看相关java线程的相关信息 选项作用-q仅显示进程 ID,而不显示类名或 JAR 文件的路径-m显示传递给主类的参数-l显示完整的主类名或 JAR 文件的路径-v显示传递给 Java 虚拟机的参数 jmap 此命令用来查看内存信息,实例个数以及占内存大小 jmap…

IT技术人员必看:什么是业务?何为业务架构?

在技术型的组织里,好多Leader能脱颖而出,除了得有扎实的技术底子,对业务的熟悉和理解也相当重要。尤其在像阿里那样的公司,P7以上的技术人员要想升职,深度理解业务就特别关键。而且,级别越高,对…

Vue3+Ant Design表格排序

最近在公司做有关报表的项目时,遇到最多的问题-表格排序,刚开始看到UI设计图的时候,还有些纳闷这个排序如何做,其实实际上并没有想象中的那么难,如果说单纯的排序的话ant design这个组件里的表格有自带的排序和筛选功能…

ocr截图识别的软件有吗?分享6款!

随着科技的发展,我们越来越多地依赖于数字技术和智能工具来处理日常任务。OCR技术就是其中的佼佼者,它能够将图片中的文字快速、准确地转换成可编辑的文本格式。OCR截图识别软件就是这一技术的典型应用,它们能够帮助我们轻松地从截图中提取文…

阿里云服务器带宽价格全解析,附报价单

阿里云服务器公网带宽怎么收费?北京地域服务器按固定带宽计费一个月23元/M,按使用流量计费0.8元/GB,云服务器地域不同实际带宽价格也不同,阿里云服务器网aliyunfuwuqi.com分享不同带宽计费模式下带宽收费价格表: 公网…

【C语言】双向链表详解

文章目录 关于双向链表双向链表的初始化双向链表的打印双向链表方法调用 - 尾删为例双向链表的查找 - 指定位置之后插入为例双向链表结束 - 链表的销毁小结及整体代码实现 关于双向链表 首先链表有8种基本分法 其中在笔者之前文章种详细介绍的 单链表 是不带头单项不循环链表…

C++学习知识

C知识小菜单: 备赛蓝桥杯过程中的一些小知识积累,持续更新中! 文章目录 C知识小菜单:1.小数取整:2.小数点后保留几位:3.数字占几位字符:4. 求x 的 y 次幂(次方)5. 求平方…

STM32完成软件I2C通讯

今天的重点是利用STM32的软件方案和MPU60506轴姿态传感器建立通讯,今天只完成了简单的发送地址和接收应答的部分,特此记录一下过程,以后忘记可以随时翻出来看看。 先介绍最基本的I2C通讯的最基本的6个时序: 一:起始条…

TCP/IP协议—UDP

TCP/IP协议—UDP UDP协议UDP通信特点 UDP头部报文UDP检验 UDP协议 用户数据传输协议 (UDP,User Datagram Protocol) 是一种无连接的协议,提供了简单的数据传输服务,不保证数据的顺序以及完整性。应用层很多通信协议都基于UDP进行传输&#x…

未佩戴厨师帽识别检测 厨房管理系统 自动监测未佩戴厨师帽行为 实时报警

在厨房环境中,佩戴厨师帽对于食品安全和卫生至关重要。厨师帽能够有效地防止头发、皮屑等杂质掉入食物中,减少了食品受到污染的可能性,从而保障了食品安全。特别是在学校、餐厅等场景中,对于未佩戴厨师帽的检测更是必不可少。相关…

深入理解Linux系统中的前后台任务与守护进程

⭐小白苦学IT的博客主页 ⭐初学者必看:Linux操作系统入门 ⭐代码仓库:Linux代码仓库 ❤关注我一起讨论和学习Linux系统 1.前言 在Linux系统中,进程管理是至关重要的一个环节。其中,前后台任务和守护进程是进程管理中不可忽视的两…

Vue结合el-table实现合并单元格(以及高亮单元表头和指定行)

实现效果如下: 思路: 1.首先使用动态表头表格。 2.其次实现动态计算合并单元格。(计算规则 传递需要合并的字段) 3.然后封装公共的计算单元格方法 export导出供多个页面使用。 4.同时需要封装成公共的组件供多个页面使用。 5…

电动车新国标迎来修订机会,用户的真实需求能被满足吗?

文|新熔财经 作者|宏一 自2019年4月《电动自行车安全技术规范》发布至今,电动车的新国标标准已经实施5年,市场上的争议也此起彼伏地持续了5年。 因为新国标对电动车的各项技术标准提出的明确要求,其中,最…

Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066

很奇怪的问题,在使用nifi的时候碰到的,这里是用NIFI,把数据从postgresql中同步到mysql中, 首先postgresql中的源表,中是没有create_time这个字段的,但是同步的过程中报错了. 报错的内容是说,目标表中有个create_time字段,这个字段是必填的,但是传过来的flowfile文件中,的数据没…

[RK3399 Linux] 使用ubuntu 20.04.5制作rootfs

一、ubuntu base ubuntu base是用于为特定需求创建自定义映像的最小rootfs,是ubuntu可以运行的最小环境。 1.1 下载源码 下载ubuntu-base的方式有很多,可以从官方的地址:ttp://cdimage.ubuntu.com/ubuntu-base/releases。 也可以其它镜像地址下载,如清华源:https://mi…

使用shell管理和配置网络服务_1

1、请使用nmcli命令配置仅主机模式网络环境,要求如下: 1) 创建一个新的网卡连接eth1,该连接映射到ens32网卡上; 首先,确保 ens32 网卡没有被其他网络配置文件使用。然后,使用 nmcli 创建一个新的连接,并将其绑定到 e…

在Linux中使用dpkg -i离线安装下载的deb软件包

“dpkg -i” 是 Debian 系统中用于安装 .deb 格式软件包的命令。它是 Debian Package Management System(DPMS)的一部分,允许用户通过命令行界面来管理软件包。 使用该命令时,需要提供要安装的软件包的路径作为参数。例如&#…