Docker镜像分层的原理

base镜像

base镜像有两层含义:

  • 不依赖其他镜像,从scratch构建
  • 其他镜像可以之为基础进行扩展

所以,base镜像一般都是各种Linux发行版本的Docker镜像,比如:Ubuntu,Debian或者CentOS等。

base镜像提供的都是最小安装的Linux发行版本。
我们大部分镜像都将是基于base镜像构建的。所以,通常使用的是官方发布的base镜像。可以在docker hub里找到。比如centos:https://hub.docker.com/_/centos
我们可以自己构建docker base镜像,也可以直接使用已有的base镜像。比如centos。我们可以直接从docker hub上拉取。
拉取

docker pull centos

查看

docker images centos 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        2 months ago        202MB

可以看到最新的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负载均衡。首先,得需要了解镜像的结构是什么。

官方文档: https://docs.docker.com/stora…

Docker镜像的分层结构

启动镜像时,一个新的可写层会加载到镜像的顶层。这一层通常称为”容器层”,之下是”镜像层”。
容器层可以读写,容器所有发生文件变更写都发生在这一层。镜像层只允许读取,read-only。

修改时复制策略(copy-on-write)

Docker通过一个修改时复制策略来保证base镜像的安全性,以及更高的性能和空间利用率。

  • 当容器需要读取文件的时候

从最上层的镜像层开始往下找,找到后读取到内存中,若已经在内存中,可以直接使用。换句话说,运行在同一台机器上的Docker容器共享运行时相同的文件。

  • 当容器需要修改文件的时候

从上往下查找,找到后复制到容器层,对于容器来说,可以看到的是容器层的这个文件,看不到镜像层里的文件,然后直接修改容器层的文件。

  • 当容器需要删除文件的时候

从上往下查找,找到后在容器中记录删除,并不是真正的删除,而是软删除。这导致镜像体积只会增加,不会减少。

  • 当容器需要增加文件的时候

直接在最上层的容器可写层增加,不会影响镜像层。

镜像的精简优化

  1. 优化基础镜像

基础镜像选择时,选择合适的较小的镜像,常用的 Linux 系统镜像一般有 Ubuntu、CentOs、Alpine···等

  1. 串联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
#创建文件,同时在该层删除该文件
									

作者:xiongkun01

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker镜像分层Docker的一个重要特性,它可以帮助我们更高效地管理和共享镜像。下面是关于Docker镜像分层的介绍: 1. Docker镜像分层原理Docker镜像是由一系列只读层(Layer)组成的,每个层都包含了文件系统的一部分。当我们创建一个新的镜像时,Docker会在已有的镜像层上添加一个新的可写层,这个可写层就是我们所做的修改和添加的内容。这种分层的结构使得镜像可以被共享和复用,同时也减少了存储空间的占用。 2. 镜像分层的优势: - 高效利用存储空间:由于镜像分层结构,相同的层可以被多个镜像共享,减少了存储空间的占用。 - 快速构建和部署:当我们构建一个新的镜像时,只需要在已有的层上添加新的层,而不需要重新构建整个镜像,大大提高了构建和部署的速度。 - 简化更新和回滚:由于每个层都是只读的,当我们需要更新或回滚一个镜像时,只需要修改或切换相应的层即可,而不会影响其他层的内容。 3. 使用镜像分层: - 创建镜像:当我们创建一个新的镜像时,可以使用基础镜像作为起点,在其上添加新的层来构建我们所需的镜像。这样可以避免重复构建相同的基础环境。 - 共享镜像:由于镜像分层的特性,我们可以将自己构建的镜像推送到Docker仓库中,供其他人使用。其他人可以基于我们的镜像再次构建自己的镜像,从而实现镜像的共享和复用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值