文章目录

  • 1. 概述
  • 1.1 镜像的组成
  • 1.2 容器的组成
  • 1.3 容器的运行
  • 1.4 层
  • 2. docker命令对层的影响
  • 2.1 create、start、run
  • 2.2 docker ps 和docker ps -a
  • 2.3 docker images 和docker images -a
  • 2.4 stop、kill、pause
  • 2.5 docker rm 和docker rmi
  • 2.6 commit和 build
  • 2.7 docker exec
  • 2.8 save和export


1. 概述

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

1.1 镜像的组成

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

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

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

docker 分层有问题 docker 分层原理与内部结构_层原理

1.2 容器的组成

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

docker 分层有问题 docker 分层原理与内部结构_层原理_02

1.3 容器的运行

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

docker 分层有问题 docker 分层原理与内部结构_层原理_03

1.4 层

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

docker 分层有问题 docker 分层原理与内部结构_容器_04

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

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

  • 指针

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

docker 分层有问题 docker 分层原理与内部结构_docker 分层有问题_05

2. docker命令对层的影响

2.1 create、start、run

  • docker create <container-id>

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

docker 分层有问题 docker 分层原理与内部结构_容器_06

docker 分层有问题 docker 分层原理与内部结构_docker_07

  • docker start <container-id>

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

docker 分层有问题 docker 分层原理与内部结构_docker 分层有问题_08

  • docker run <image-id>

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

docker 分层有问题 docker 分层原理与内部结构_docker 分层有问题_09

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

docker 分层有问题 docker 分层原理与内部结构_容器_10

2.2 docker ps 和docker ps -a

  • docker ps

docker 分层有问题 docker 分层原理与内部结构_容器_11

  • docker ps -a

docker 分层有问题 docker 分层原理与内部结构_docker 分层有问题_12

2.3 docker images 和docker images -a

  • docker images

仅列出“顶层镜像”

docker 分层有问题 docker 分层原理与内部结构_docker原理_13

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

  • docker images -a

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

docker 分层有问题 docker 分层原理与内部结构_docker 分层有问题_14

2.4 stop、kill、pause

  • docker stop <container-id>

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

docker 分层有问题 docker 分层原理与内部结构_容器_15

  • docker kill <container-id>

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

docker 分层有问题 docker 分层原理与内部结构_容器_16

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

  • docker pause <container-id>

docker 分层有问题 docker 分层原理与内部结构_层原理_17

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

2.5 docker rm 和docker rmi

  • docker rm <container-id>

移除构成容器的可读写层

docker 分层有问题 docker 分层原理与内部结构_docker 分层有问题_18

  • docker rmi <image-id>

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

docker 分层有问题 docker 分层原理与内部结构_容器_19

2.6 commit和 build

  • docker build

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

docker 分层有问题 docker 分层原理与内部结构_docker 分层有问题_20

  • docker commit

将容器转换为镜像

docker 分层有问题 docker 分层原理与内部结构_层原理_21

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

docker 分层有问题 docker 分层原理与内部结构_docker 分层有问题_22

2.7 docker exec

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

docker 分层有问题 docker 分层原理与内部结构_docker_23

2.8 save和export

  • docker save

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

docker 分层有问题 docker 分层原理与内部结构_docker 分层有问题_24

  • docker export <container-id>

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

docker 分层有问题 docker 分层原理与内部结构_docker 分层有问题_25