两句话回答这个问题:
AUFS
文件系统分层设计,将资源利用率玩到极致原理冗长,但很有意思,感兴趣请继续。
一句话,一张图说明问题。
Docker
虚拟化技术是基于容器化,容器化技术的本质其实是基于内核资源调度的再分配! 并不是什么新技术,只是近年Linux
内核更加成熟,在资源调度隔离更成熟,所以容器化技术再被提上议程。
比起传统 KVM,VMware
在磁盘上划分区域,虚拟操作系统的方式,性能不知道提升了多少倍。
虚拟化技术
两句话回答问题:
Image
中的数据信息、ID、网络、LXC管理的资源调度、具体的Container
配置等,称为 Docker
概念上的 Container
。即 Image 镜像其实也是容器!Image
启动一个容器,其实是Docker
从顺序加载父Image
到Base Image
的过程. 用户的进程也是运行在Writeable
文件系统层。仓库 -> 镜像 -> 容器 被认为是容器的完整生命周期。从仓库下载镜像,基于镜像创建容器,在容器上运行我们的应用,这是我们绝大多数人对容器和镜像的认知。那么容器和镜像有什么关系,下面这个试验可能会刷新你对容器的认知深度!
docker images
为什么删除失败?一句话回答问题:
Docker Image
其实也是容器,是基于其运行容器的父容器。删除时会判断是否有子容器依赖
我们安装一个nginx
容器,stop
容器后,尝试直接删除Image
镜像,看看会有什么结果。
nginx
容器并启动[root@O2O-T-K8S-TEST4 ~]# docker run -dt nginx /bin/sh
Unable to find image 'nginx:latest' locally
Trying to pull repository docker.io/library/nginx ...
latest: Pulling from docker.io/library/nginx
123275d6e508: Pull complete
6cd6a943ce27: Pull complete
a50b5ac4a7fb: Pull complete
Digest: sha256:d81f010955749350ef31a119fb94b180fde8b2f157da351ff5667ae037968b28
Status: Downloaded newer image for docker.io/nginx:latest
be89d49cace9294db10b1255ce9f3226f1a7505bdb84596f595dd4c06ffb0232
[root@O2O-T-K8S-TEST4 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
be89d49cace9 nginx "/bin/sh" 26 seconds ago Up 25 seconds 80/tcp objective_williams
stop
容器[root@O2O-T-K8S-TEST4 ~]# docker stop be89d49cace9
be89d49cace9
Nginx Image
[root@O2O-T-K8S-TEST4 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest e791337790a6 3 days ago 127 MB
You have new mail in /var/spool/mail/root
[root@O2O-T-K8S-TEST4 ~]# docker rmi e791337790a6
Error response from daemon: conflict: unable to delete e791337790a6 (must be forced) - image is being used by stopped container be89d49cace9
报错了!Nginx的容器存在,无法删除镜像! 这是什么呢?还记得我们的容器是STOP状态吗?
Nginx Image
[root@O2O-T-K8S-TEST4 ~]# docker rm be89d49cace9
be89d49cace9
[root@O2O-T-K8S-TEST4 ~]# docker rmi e791337790a6
Untagged: docker.io/nginx:latest
Untagged: docker.io/nginx@sha256:d81f010955749350ef31a119fb94b180fde8b2f157da351ff5667ae037968b28
Deleted: sha256:e791337790a6181d5ce870b3bb16de1a4d5aa3a916e8fba6907f57eb409934cf
Deleted: sha256:615a169a3412634ebf75d5f0f5162290fb6042ba36285bd0ddc9ee123165b95e
Deleted: sha256:bd32d67adcec3dba661c5afebc8a2a5413e68a3283b5ad7df134ed86f00b380a
Deleted: sha256:b60e5c3bcef2f42ec42648b3acf7baf6de1fa780ca16d9180f3b4a3f266fe7bc
这个试验说明Image
和Container
是有依赖关系的。究其源头,要从Docker
的AUFS
文件系统说起,而AUFS
是UnionFS
联合文件系统的一种衍生版本。
哈,很多新名词,莫着急,我们下面会逐步了解
UnionFS
Union File System
,简称UnionFS
,是一种为 Linux, FressBSD
和NetBSD
操作系统设计的,把多个文件系统联合挂载到一个挂载点的文件系统技术。
敲黑板,下面讲的每句话,每个字都特别重要!特别重要!特别重要!
其核心技术是:它使用branch
把不同文件系统的文件和目录“透明”覆盖,形成一个单一的文件系统。外部对该文件系统执行写操作时,系统并未真正改变readonly
权限的的系统,而是写入到有read-write
权限的系统,即原来的文件没有改变。
联合文件系统,是Docker
镜像技术的基础,一种轻量级的高性能分层文件系统,支持将文件系统中的修改进行提交和层层叠加。该特性有利于镜像通过分层实现继承,同时支持将不同目录挂载到同一虚拟文件系统下。
即Docker
镜像分为基础镜像和父镜像,没有父镜像的统称为基础镜像。
用户基于基础镜像制作不同的应用镜像。这些应用镜像共享同一个基础镜像,提高存储效率。
用户针对镜像的操作,通常会在新建镜像层进行,其基础镜像并不会改变。使用PhotoShop
的同学会更容易理解,很像新建图层。
AUFS
是UnionFS
的一种。
Docker
目前支持的联合文件系统包括AUFS
、Btrfs
、VSF
、DeviceMapper
、overlay
、overlay2
。
Linux
各发行版实现的UnionFS
各不相同,所以Docker
在不同linux
发行版中使用的也不同。通过docker info
可以查看docker
使用的是哪种UnionFS
:
CentOS, Storage Driver: overlay2
debain, Storage Driver: aufs
AUFS
简介如下内容摘自
COOLSHELL
AUFS
又叫Another UnionFS
,后来叫Alternative UnionFS
,后来可能觉得不够霸气,叫成Advance UnionFS
。是个叫Junjiro Okajima
(岡島順治郎)在2006年开发的,AUFS
完全重写了早期的UnionFS 1.x
,其主要目的是为了可靠性和性能,并且引入了一些新的功能,比如可写分支的负载均衡。AUFS
在使用上全兼容UnionFS
,而且比之前的UnionFS
在稳定性和性能上都要好很多,后来的UnionFS 2.x
开始抄AUFS
中的功能。但是他居然没有进到Linux
主干里,就是因为Linus
不让,基本上是因为代码量比较多,而且写得烂(相对于只有3000行的union mount
和10000行的UnionFS
,以及其它平均下来只有6000行代码左右的VFS
,AUFS
居然有30000行代码),所以,岡島不断地改进代码质量,不断地提交,不断地被Linus
拒掉,所以,到今天AUFS
都还进不了Linux
主干(今天你可以看到AUFS
的代码其实还好了,比起OpenSSL
好N倍,要么就是Linus
对代码的质量要求非常高,要么就是Linus
就是不喜欢AUFS
)。
Docker
使用AUFS
就是一种联合文件系统。简单讲**“支持将不同目录挂载到同一虚拟文件系统下的文件系统”**。其思想也是借鉴 Linux
启动。
Linux
的启动到运行需要两个文件系统: BootFS
和 RootFS
.
BootFS
主要包括BootLoader
和Kernel
。BootLoader
主要引导加载Kernel
,当Boot
成功后,Kernel
被加载到内存中BootFS
就被Umount
了。
RootFS
包含了典型Linux
中的/dev
、/proc
、/bin
等标准目录和文件。
不同的Linux
发行版,BootFS
基本一致,但RootFS
可能会有差异。
Linux
启动后,先将RootFS
置为Readonly
,检查结束后切换为Readwrite
供用户使用。
Docker
也是利用该技术,Union Mount
在Readonly
的RootFS
系统上挂载Readwrite
文件系统。并且向上叠加,使一组Readonly
和Readwrite
的结构构成一个Container
的运行目录。每层被称为一个文件系统Layer
。
敲黑板了哦!镜像究竟是什么,埋伏了这么多,这里终于经神龙现身了!!
AUFS
的特性,使得每个针对Readonly
层文件/目录的修改都只会存在于上层的Writeable
层中,这样不存在竞争,且多个Container
可以共享Readonly
文件系统层 。在 Docker
中,将Readonly
层称为镜像层.
对于Container
整体而言,整个RootFS
是read-write
,但事实上所有修改都写入的是上层的writeable
层, image
并不保存用户状态。
通常,上层的image
依赖下层的image
, 因此, Docker
通常把下层的image
称为父镜像, 没有父镜像的image
称为Base Image
.
因此,要从一个Image
启动一个容器,其实是Docker
从顺序加载 父Image
到Base Image
的过程. 用户的进程也是运行在Writeable
文件系统层。
所有父层Image
中的数据信息、ID、网络、LXC管理的资源调度、具体的Container
配置等,称为 Docker
概念上的 Container
.
讲到这里,终于结束了。那么你已经懂了吧?^^
https://docs.docker.com/storage/storagedriver/overlayfs-driver/ https://coolshell.cn/articles/17061.html