Docker(二):镜像管理
一:镜像介绍
简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统
那么镜像从哪里来?
Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像:https://hub.docker.com/
二:UnionFS(联合文件系统)
union文件系统(UnionFS)是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统 下(unite serveral directorires inot a single virtual filesystem)。union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
例如:
[root@t-docker chenzx]# ls dir1
a.txt b.txt
[root@t-docker chenzx]# ls dir2
c.txt d.txt
# 把dir1和dir2挂载到dir目录下,最终两个目录内容会显示在一个目录下:
[root@t-docker chenzx]# ls dir
a.txt b.txt c.txt d.txt
三:Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统称为联合文件系统(unionFS)。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统, 在docker镜像的最底层就是bootfs 。这一层与我们典型的linux/unix系统是一样的,包含boot加载器和内核。当boot加载完成之后,整个内核就都在内存中了。此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev/,/proc,/bin,/etc/等标准目录和文件。rootfs就是各种不同操作系统发行版,比如ubuntu,centos等。

ubuntu和centos的内核相同,只是rootfs布局不一样而已。
平时我们安装虚拟机的centos都是好几个G,为什么docker这里才200M?
[root@node01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 9f38484d220f 5 weeks ago 202 MB
对一个精简的os,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以了,因为底层直接用宿主机的kernel,自己只需要提供rootfs就行了。由此可见,对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
docker为什么快,就是因为共有宿主机的内核。
以我们的pull为例,在下载的过程中,我们可以看到docker的镜像好像是在一层一层的下载。
[root@node01 ~]# docker pull tomcat # 默认拉取的是tomcat:latest版本,拉取指定版本镜像:tomcat:3.2
Using default tag: latest
Trying to pull repository docker.io/library/tomcat ...
latest: Pulling from docker.io/library/tomcat
e79bb959ec00: Pull complete
d4b7902036fe: Pull complete
1b2a72d4e030: Pull complete
de423484a946: Pull complete
ceaac3b844f7: Pull complete
88f01b722a52: Pull complete
c23be56a9ac1: Pull complete
d852ffd6d31f: Pull complete
11775a3d792d: Pull complete
13fdd17462ac: Pull complete
2092995a1e54: Pull complete
Digest: sha256:6cb1b64fa315eab22803c7cde8408b91dedba8fbf5f01d4def96d95f79344a17
Status: Downloaded newer image for docker.io/tomcat:latest
好了,有了上面分层的概念后,我们思考一个问题,为什么tomcat的镜像比centos镜像还大?
[root@t-docker chenzx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 690cb3b9c7d1 7 days ago 463MB
centos latest 5182e96772bf 3 weeks ago 200MB
这是因为Tomcat的镜像是由kernel、centos、jdk8、tomcat组成,所以比centos镜像大。

为什么docker镜像要采用这种分层结构呢? 一句话, 分层最大的好处是:共享资源 。
比如,有多个镜像都是从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
镜像的特点: 镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层被称为容器层,容器层之下的层都是镜像层。
四:镜像管理命令

4.1 搜索镜像
[root@node01

本文深入探讨Docker镜像的管理,包括镜像的分层加载原理,UnionFS的作用,以及如何进行镜像搜索、拉取、提交和备份。Docker利用分层结构实现资源共享,使得镜像更高效且易于定制。此外,通过实例演示了如何从基础镜像创建自定义镜像,并展示了镜像备份与加载的过程。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



