镜像

396 阅读2分钟

1、本质

  • “容器镜像”:挂载在容器根目录上、用来为容器进程提供隔离后执行环境的文件系统
  • 也叫作:rootfs(根文件系统)
  • 一般由一个完整操作系统的文件系统组成,比如 Ubuntu16.04 的 ISO
  • rootfs 只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核
  • rootfs的存在保证了容器应用的云端与本地服务器环境的高度一致性

2、Docker镜像的特点

  • 引入layer的概念,以增量式的方式来制作rootfs(即镜像)
  • 利用联合挂载UnionFS的方式来实现(常用AuFS 联合文件系统 )

3、镜像结构

image-layer.png

(1) 只读层

  • 挂载方式 ro+wh:readonly+whiteout
  • 这些只读层,都以增量的方式分别包含了 Ubuntu 操作系统的一部分

(2) init层

  • 以“-init”结尾的层,夹在只读层和读写层之间
  • Init 层是 Docker 项目单独生成的一个内部层,专门用来存放 /etc/hosts、/etc/resolv.conf 等信息

(3) 可读可写层

  • 挂载方式 rw:read write
  • 在容器中的写操作,会以增量的方式叠加在可读写层

4、镜像文件的增删改查

此种联合文件系统的特性(以AUFS 为例)如下:

  • AUFS 是一种联合文件系统,它把若干目录按照顺序和权限 mount 为一个目录并呈现出来
  • 默认情况下,只有第一层(第一个目录)是可写的,其余层是只读的。
  • 增加文件:默认情况下,新增的文件都会被放在最上面的可写层中。
  • 删除文件:因为底下各层都是只读的,当需要删除这些层中的文件时,AUFS 使用 whiteout 机制,它的实现是通过在上层的可写的目录下建立对应的whiteout隐藏文件来实现的。
  • 修改文件:AUFS 利用其 CoW (copy-on-write)特性来修改只读层中的文件:AUFS 工作在文件层面,对只读层中的文件做修改,在第一次修改时,文件都会被拷贝到可写层然后再被修改。