没有输出的输入是不完整的

0%

Docker提升-实现原理

docker镜像是一个特殊的文件系统。
本篇文章将介绍如何docker镜像的层级结构,同时学习如何查看中间层镜像。

docker的原理

Docker 的镜像就是它的文件系统,一个镜像可以放在另外一个镜像的上层,那么位于下层的就是它的父镜像。所以,Docker 会存在很多镜像层,每个镜像层都是只读的,并且不会改变。当我们创建一个新的容器时,Docker 会构建出一个镜像栈,并在栈的最顶层添加一个读写层,如图所示。
image

其中中间的这些镜像层就是intermediate image,是不能被删除的。

如何查看中间层镜像

1
2
3
4
//查看镜像
docker image ls
//查看所有镜像(包含中间层镜像)
docker image ls -a

带参数a选项的命令输出的结果中含有none:none标签的镜像都是intermediate image(中间层镜像),这些镜像会被其他镜像所使用,是不能被随意删除的。

none:none 标签镜像

具有none:none 标签的景象都是intermediate image吗? 其实不是,还有一类镜像是dangling image(悬虚镜像),通过

1
docker image ls

命令展示出来的镜像也会包含none:none标签的镜像,这就是dangling image.

那么dangling image是如何产生的呢?
比如我们最开始通过如下命令构造一个名称为test:v1的镜像,

1
docker build -t test:v1 .

然后我们后期对代码进行了修改,所以我们会重新构造一个镜像。

1
docker build -t test:v1 .

我们没有为它分配新的名字,新构造的镜像还是叫做test:v1。这个时候原来的test:v1就会成为dangling image,根本没用,而且会占用存储空间。

可以通过如下命令将所有的玄虚镜像删掉。

1
docker image prune

写在最后

记得多关注一下docker的help文档,以查看镜像命令为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜  log docker image ls --help

Usage: docker image ls [OPTIONS] [REPOSITORY[:TAG]]

List images

Aliases:
ls, images, list

Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show numeric IDs

可以看到-a选项后面说,默认是隐藏intermediate images的。所以我们就可以了解到存在intermediate images 而且还可以通过在原命令的后面加参数a来查看中间层镜像。

更细节的原理可以查看这篇文章What are Docker : images?