0
点赞
收藏
分享

微信扫一扫

Docker学习笔记04:镜像分层

柠檬果然酸 2024-01-25 阅读 13
Docker运维

镜像分层

在pull镜像的时候,可以看到,一个镜像是一层一层的被拉取的。


Docker学习笔记04:镜像分层_Docker

Docker镜像具有分层结构,这种结构基于UnionFS技术。具体来说,每个新镜像是从基础镜像(base image)一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。这种分层结构的好处在于共享资源。例如,如果有多个镜像都从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像,同时内存中也只需加载一份base镜像,就可以为所有容器服务。



UnionFS(联合文件系统)

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


Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS.bootis(boot fle system)主要bootloader和kernel。bootloader主要是引导加载kernel, Linux刚启动时会加bootis文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root fle system),在bootis之上,包含的就是典型 Linux 系统中的 /dev, proc, bin,/etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。


Docker的镜像层都是只读的,容器层是可写的。

当容器启动时,一个新的科协曾被加载到镜像的顶部。这一层通常被称为“容器层”,“容器层”之下的都叫做“镜像层”。


docker commit

提交容器副本,使之成为一个新的镜像,运行一个容器时,如果不使用卷,任何文件修改都会被记录在容器存储层里。Docker的commit命令可以将容器的存储层保存下来成为新的镜像,即在原有镜像的基础上叠加容器的存储层,构成新的镜像。

注意,使用Docker commit命令制作镜像后,除了要修改的文件之外,还有大量的无关内容被添加进来。原来的镜像每一层都不会改变,变化的仅仅是当前层,每次修改都是改变当前层,制作修改次数一多,会造成镜像极为臃肿,体积会越来越大,无法重复利用。

docker commit -m='提交的描述' -a='作者' 容器ID 镜像名:[TAG]

示例:

生成一个包含vim的ubuntu镜像

官方的ubuntu镜像是不含vim,可以通过在容器内使用apt-get命令安装vim。然后退出,使用docker commit提交成为一个包含vim的ubuntu镜像

#启动容器
docker run -it ubuntu /bin/bash
#进入容器后
apt-get update
apt-get install vim 
#退出容器
#83e为容器id
docker commit -m='vim' -a='quietguoguo' 83e ubuntu_vim

使用docker images查看镜像,可以看到新提交的镜像体积大了很多。以后可以对比一下使用dockerfile方式打出来的有什么区别。

Docker学习笔记04:镜像分层_Docker_02


PS:

12月份参与活动送的包包收到了。挺厚实,适合做饭盒袋。如果在封口处加个扣子就更好了。

Docker学习笔记04:镜像分层_Docker_03

举报

相关推荐

0 条评论