Docker镜像分层的原理详解
base镜像
base镜像有两层含义:
不依赖其他镜像,从scratch构建
其他镜像可以之为基础进⾏扩展
所以,base镜像⼀般都是各种Linux发⾏版本的Docker镜像,⽐如:Ubuntu,Debian或者CentOS等。
base镜像提供的都是最⼩安装的Linux发⾏版本。
我们可以⾃⼰构建docker base镜像,也可以直接使⽤已有的base镜像。⽐如centos。我们可以直接从docker hub上拉取。
advanced to enable拉取
docker pull centos
查看
action翻译docker images centos
export什么意思呀REPOSITORY    TAG        IMAGE ID      CREATED      SIZE
centos      latest      1e1148e4cc2c    2 months ago    202MBpython 条件语句
centos和ubuntu可以看到最新的centos镜像只有200mb,是不是觉得太⼩了?这是因为docker镜像在运⾏的时候直接使⽤docker宿主机器的kernel。
Linux操作系统由⽤户空间和内核空间构成。
内核空间是kernel,⽤户空间是rootfs,不同发⾏版的区别主要是rootfs。⽐如Ubuntu 14.04使⽤ upstart 管理服务,apt 管理软件包;⽽ CentOS 7 使⽤ systemd 和 yum。这些都是⽤户空间的不同,Kernel差别不⼤。
所以Docker可以同时⽀持多种 Linux 镜像,模拟出不同的操作系统环境。
base镜像只是⽤户空间和发⾏版本⼀致,内核空间使⽤的是Docker宿主机器的Kernel。
存储结构
上⽂⾥展⽰了如何下载⼀个base镜像。我们通常是基于这份base镜像来构建我们⾃⼰的镜像。⽐如,在centos⾥添加⼀个nginx负载均衡。⾸先,得需要了解镜像的结构是什么。
Docker镜像的分层结构
启动镜像时,⼀个新的可写层会加载到镜像的顶层。这⼀层通常称为"容器层",之下是"镜像层"。
容器层可以读写,容器所有发⽣⽂件变更写都发⽣在这⼀层。镜像层只允许读取,read-only。
修改时复制策略(copy-on-write)
Docker通过⼀个修改时复制策略来保证base镜像的安全性,以及更⾼的性能和空间利⽤率。
当容器需要读取⽂件的时候
从最上层的镜像层开始往下,到后读取到内存中,若已经在内存中,可以直接使⽤。换句话说,运⾏在同⼀台机器上的Docker容器共享运⾏时相同的⽂件。
当容器需要修改⽂件的时候
从上往下查,到后复制到容器层,对于容器来说,可以看到的是容器层的这个⽂件,看不到镜像
层⾥的⽂件,然后直接修改容器层的⽂件。
当容器需要删除⽂件的时候
从上往下查,到后在容器中记录删除,并不是真正的删除,⽽是软删除。这导致镜像体积只会增加,不会减少。
当容器需要增加⽂件的时候
直接在最上层的容器可写层增加,不会影响镜像层。
镜像的精简优化
优化基础镜像
aerial基础镜像选择时,选择合适的较⼩的镜像,常⽤的 Linux 系统镜像⼀般有 Ubuntu、CentOs、Alpine···等串联Dockerfile指令
在Dockerfile中,每条指令都会创建⼀个镜像层,从⽽增加镜像的⼤⼩。当前层的修改不会影响上⼀层。
⽤&&串联指令(RUN指令中)
安装完软件记得clean
具体实例如下:
⾃定义Dockerfile:
FROM ubuntu:14.04
#基础源镜像
MAINTAINER xiongkun
#描述镜像的创建者,名称和邮箱
WORKDIR /home
RUN dd if=/dev/zero of=50M.file bs=1M count=50
#创建⼤⼩为50M的测试⽂件
RUN rm -rf 50M.file
#删除该⽂件
优化后的Dockerfile:
FROM ubuntu:14.04
#基础源镜像
MAINTAINER xiongkun
#描述镜像的创建者,名称和邮箱
WORKDIR /home
RUN dd if=/dev/zero of=50M.file bs=1M count=50 && rm -rf 50M.file
#创建⽂件,同时在该层删除该⽂件
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。