赞
踩
镜像的理解:
(1)镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需要的所有内容。我们将应用程序、配置打包成一个成型的、可交付、可部署的运行环境,包括代码、运行时所需要的库、环境变量和配置文件等,这个大包好的运行环境就是image镜像文件。
(2)只有通过镜像文件才能生成Docker容器实例。
Docker镜像是分层构建的,随着我们深入学习Docker,我们会理解到Dockerfile中每条指定都会新建一个层。以下面Dockerfile指令为例:
FROM ubuntu:20.04 #基础镜像
COPY . /app #复制文件
RUN make /app #编译文件
CMD python /app/app.py #入口文件
以上四条指令,在每一层上只记录本层所做的更改,而且这些层是只读层。当启动一个容器,Docker指挥在最顶部添加读写层,在容器内作的所有更改(写日志、修改、删除文件等,都保存到读写层内),一般称该层为容器层,如下图所示:
事实上,容器(container)和镜像(image)的最主要区别就是容器加上了顶层的读写层。所有对容器的修改都发生在此层,镜像并不会被修改,也即前面说的 COW(copy-on-write)技术。容器需要读取某个文件时,直接从底部只读层去读即可,而如果需要修改某文件,则将该文件拷贝到顶部读写层进行修改,只读层保持不变。
每个容器都有自己的读写层,因此多个容器可以使用同一个镜像,另外容器被删除时,其对应的读写层也会被删除,如果你希望多个容器共享或者持久化数据,可以使用 Docker volume。
(1)Union文件系统(UnionFS)是一种分层的、轻量级的、高性能的文件系统,它是Docker镜像的基础,并且支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂在到同一个虚拟文件系统下。
(2)镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。
Union文件系统的特性:一次性同时加载多个文件系统,但是从外面来看,只能看到一个文件系统;联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有地层的文件和目录。
Docker的镜像是由一层一层的文件系统组成,也就是以UnionFS(联合文件系统)堆叠构成。
rootfs(root file system)包含的是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件,其实rootfs就是各种不同的操作系统发行版,比如Ubuntu、Centos等等。
bootfs(boot file system)主要包含bootloader和kernel、bootloader主要是引导加载kernel、Linux刚启动时候加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成后整个内核就在内存中了,内存的使用权由bootfs转交给内核,此时系统也会写在bootfs。至此,我们就比较容易理解docker容器其实就是一个简易版的Linux环境,它包含root用户权限、进程空间、用户空间和网络空间、以及运行在它上面的应用程序。
注意:
(1)如上图所示,Docker镜像层都是只读的,容器层是可写的。当容器启动时,一个新的可写层被加载到镜像顶部,这一层通常被称作“容器层”,“容器层”之下的都叫做“镜像层”。
(2)对容器的所有更改(无论添加、删除、还是修改文件)都只会发生在容器层中。上图中只有透明的writable Container是暴露给用户的。
思考一个问题:平时我们在虚拟机上安装Linux操作系统都是好几个G,为什么docker才200M左右呢?
因为,docker是基于轻量级的虚拟化技术,它仅包含业务运行时所需的runtime环境,也就是只包含Linux基础镜像,所以docker才会只有200M左右。
镜像分层最大的好处:资源共享,方便复制迁移,容易实现资源复用。比如说多个镜像从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像;同时内存中只需要加载一份base镜像,就可以为所有容器提供服务了,更有趣的是镜像的每一层都可以被共享。
因此,Docker采用镜像分层的好处主要体现在以下三个方面:
更轻量:
更高效:
更敏捷、更灵活:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。