本文将详细解释Docker中图像分层的原理。文章内容质量较高,桂哥网络将与大家分享,以供参考。希望大家看完这篇文章后对相关知识有一定的了解。
base镜像
基本镜像有两种含义:
独立于其他映像从头开始构建
其他镜子可以在此基础上扩展
所以基础映像一般是各种Linux发行版的Docker映像,比如Ubuntu,Debian或者CentOS。
基本映像提供最低安装的Linux发行版。
我们的大部分图像将建立在基础图像上。所以通常使用官方发布的基础图像。可以在docker hub找到。例如,Centos:https://hub.docker.com/_/centos
我们可以自己构建docker基础映像,也可以直接使用现有的基础映像。比如centos。我们可以直接从码头中心提取。
拉啊拉
Dockerpullcentos视图
dockerimagescentos
REPOSITORYTAGIMAGEIDCREATEDSIZE
Centos最新的1e1148e4c2c2个月前202mb,可以看到最新的centos镜像只有200mb,是不是太小了?这是因为docker映像在运行时直接使用docker主机的内核。
Linux操作系统由用户空间和内核空间组成。
内核空间是内核,用户空间是rootfs。不同发行版之间的主要区别是rootfs。比如Ubuntu 14.04使用新贵管理服务和apt管理软件包;而CentOS 7用的是systemd和yum。这些都是用户空间的不同,内核也没多大区别。
所以Docker可以同时支持多个Linux镜像,模拟不同的操作系统环境。
基础映像的用户空间与发布版本一致,内核空间使用Docker主机的内核。
存储结构
上面显示了如何下载基本映像。我们通常会在这个基础形象的基础上建立自己的形象。例如,在centos中添加一个nginx负载平衡。首先,我们需要知道镜子的结构是什么。
正式文件:https://docs.docker.com/storage/storagedriver/
Docker镜像的分层结构
开始镜像时,会在镜像的顶部加载一个新的可写层。这一层通常被称为“容器层”,下面是“镜像层”。
容器层可以读写,容器中的所有文件更改都写在这个层。镜像层只允许读取,只读。
修改时复制策略(copy-on-write)
Docker通过修改时复制策略确保了基础映像的安全性以及更高的性能和空间利用率。
当容器需要读取文件时
从顶镜层往下看,找到它,读入内存。如果已经在内存中,可以直接使用。换句话说,在同一台机器上运行的Docker容器在运行时共享相同的文件。
当容器需要修改文件时
从上到下搜索,找到后复制到容器层。对于容器,可以在容器层看到文件,在镜像层看不到文件,然后直接在容器层修改文件。
当容器需要删除文件时
从上到下搜索,找到后在容器中记录删除,不是真正的删除,是软删除。这将导致镜像音量增加,而不是减少。
当容器需要添加文件时,
直接在顶层上的容器的可写层增加,而不影响镜像层。
镜像的精简优化
优化基础镜像
选择基本图像时,选择合适的较小图像。常用的Linux系统镜像有Ubuntu、CentOs、Alpine等。
串联Dockerfile指令
在Dockerfile中,每个指令都会创建一个镜像层,这会增加镜像的大小。当前层的修改不会影响到上一层。
使用串行指令(在运行指令中)
安装软件后记得清洗
具体例子如下:
自定义文档文件:
FROMubuntu:14.04
#基本源镜像
维护者雄坤
#描述镜像的创建者、名称和邮箱
工作目录/主页
RUNddif=/dev/zero of=50M . filebs=1计数=50
#创建一个50M大小的测试文件
RUNrm-rf50M.file
#删除优化的文件:
FROMubuntu:14.04
#基本源镜像
维护者雄坤
#描述镜像的创建者、名称和邮箱
工作目录/主页
runDDif=/dev/zero of=50M . filebs=1 count=50rm-RF50M . file
#创建文件,同时删除文件。我们将在这里分享Docker中图像分层的原理是什么。希望以上内容能对大家有所帮助,学到更多的知识。如果你觉得文章好,可以分享给更多人看。