01-docker原理-01层原理

1. 概述

层、统一文件系统、隔离空间

1.1 镜像的组成

镜像就是一堆只读层(read-only layer)的统一视角。

这些层是Docker内部的实现细节,它们重叠在一起,每层都会有一个指针指向下一层。并且能够在宿主机的文件系统上访问到。

统一文件系统(union file system)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样在用户的角度看来,只存在一个文件系统。

image.jpeg

1.2 容器的组成

和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

image.jpeg

1.3 容器的运行

运行态容器(running container)被定义为一个可读写的统一文件系统加上隔离的进程空间(包含其中的进程)。

image.jpeg

1.4 层

每个层包含元数据、层ID、指针

image.jpeg

  • 元数据(metadata)
    就是关于这个层的额外信息,它不仅能够让Docker获取运行和构建时的信息,还包括父层的层次信息。

注意,只读层和读写层都包含元数据。

  • 指针

每一层都包括了一个指向父层的指针(如果没有指针,说明它处于最底层)。

image.jpeg

2. docker命令对层的影响

2.1 create、start、run

  • docker create <container-id>

给镜像添加了一个可读写层

image.jpeg

image.jpeg

  • docker start <container-id>

为容器创建了一个隔离空间(注意是为容器)

image.jpeg

  • docker run <image-id>

实际是docker create+docker start两个过程

image.jpeg

实际是docker create+docker start两个过程

image.jpeg

2.2 docker ps 和docker ps -a

  • docker ps

image.jpeg

  • docker ps -a

image.jpeg

2.3 docker images 和docker images -a

  • docker images

仅列出“顶层镜像”

image.jpeg

说明:实际上,在这里我们没有办法区分一个镜像和一个只读层,所以我们提出了top-level镜像。只有创建容器时使用的镜像或者是直接pull下来的镜像能被称为顶层(top-level)镜像,并且每一个顶层镜像下面都隐藏了多个镜像层。

  • docker images -a

列出顶层镜像和中间层所有镜像

image.jpeg

2.4 stop、kill、pause

  • docker stop <container-id>

向运行中的容器发送一个SIGTERM的信号,然后停止所有的进程。

image.jpeg

  • docker kill <container-id>

向所有运行在容器中的进程发送了一个不友好的SIGKILL信号。

image.jpeg

SIGTERM和SIGKILL的区别:
SIGTERM:可以被阻塞、处理和忽略。
SIGKILL:不友好的直接关闭,即kill -9。
KILL命令的默认不带参数发送的信号就是SIGTERM.让程序有好的退出。因为它可以被阻塞,所以有的进程不能被结束时,用kill发送后者信号,即可。

  • docker pause <container-id>

image.jpeg

说明:利用了cgroups的特性将运行中的进程空间暂停

2.5 docker rm 和docker rmi

  • docker rm <container-id>

移除构成容器的可读写层

image.jpeg

  • docker rmi <image-id>

移除顶层镜像,也可以利用-f参数移除中间层。

image.jpeg

2.6 commit和 build

  • docker build

利用Dokerfile反复的执行多个命令构建镜像

image.jpeg

  • docker commit

将容器转换为镜像

image.jpeg

即将容器读写层转变成只读层构成镜像。

image.jpeg

2.7 docker exec

在运行的容器中执行一个新进程

image.jpeg

2.8 save和export

  • docker save

创建一个镜像的压缩文件,这个文件能够在另外一个主机的Docker上使用。

image.jpeg

  • docker export <container-id>

建一个tar文件,并且移除了元数据和不必要的层,将多个层整合成了一个层,只保存了当前统一视角看到的内容。(通过docker images –tree命令只能看到一个镜像)

image.jpeg

posted on 2021-09-14 17:22  运维开发玄德公  阅读(14)  评论(0编辑  收藏  举报  来源

导航