01-docker原理-01层原理
文章目录
1. 概述
层、统一文件系统、隔离空间
1.1 镜像的组成
镜像就是一堆只读层(read-only layer)的统一视角。
这些层是Docker内部的实现细节,它们重叠在一起,每层都会有一个指针指向下一层。并且能够在宿主机的文件系统上访问到。
统一文件系统(union file system)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样在用户的角度看来,只存在一个文件系统。
1.2 容器的组成
和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
1.3 容器的运行
运行态容器(running container)被定义为一个可读写的统一文件系统加上隔离的进程空间(包含其中的进程)。
1.4 层
每个层包含元数据、层ID、指针
- 元数据(metadata)
就是关于这个层的额外信息,它不仅能够让Docker获取运行和构建时的信息,还包括父层的层次信息。
注意,只读层和读写层都包含元数据。
- 指针
每一层都包括了一个指向父层的指针(如果没有指针,说明它处于最底层)。
2. docker命令对层的影响
2.1 create、start、run
docker create <container-id>
给镜像添加了一个可读写层
docker start <container-id>
为容器创建了一个隔离空间(注意是为容器)
docker run <image-id>
实际是docker create+docker start两个过程
实际是docker create+docker start两个过程
2.2 docker ps 和docker ps -a
docker ps
docker ps -a
2.3 docker images 和docker images -a
docker images
仅列出“顶层镜像”
说明:实际上,在这里我们没有办法区分一个镜像和一个只读层,所以我们提出了top-level镜像。只有创建容器时使用的镜像或者是直接pull下来的镜像能被称为顶层(top-level)镜像,并且每一个顶层镜像下面都隐藏了多个镜像层。
docker images -a
列出顶层镜像和中间层所有镜像
2.4 stop、kill、pause
docker stop <container-id>
向运行中的容器发送一个SIGTERM的信号,然后停止所有的进程。
docker kill <container-id>
向所有运行在容器中的进程发送了一个不友好的SIGKILL信号。
SIGTERM和SIGKILL的区别:
SIGTERM:可以被阻塞、处理和忽略。
SIGKILL:不友好的直接关闭,即kill -9。
KILL命令的默认不带参数发送的信号就是SIGTERM.让程序有好的退出。因为它可以被阻塞,所以有的进程不能被结束时,用kill发送后者信号,即可。
docker pause <container-id>
说明:利用了cgroups的特性将运行中的进程空间暂停
2.5 docker rm 和docker rmi
docker rm <container-id>
移除构成容器的可读写层
docker rmi <image-id>
移除顶层镜像,也可以利用-f参数移除中间层。
2.6 commit和 build
docker build
利用Dokerfile反复的执行多个命令构建镜像
docker commit
将容器转换为镜像
即将容器读写层转变成只读层构成镜像。
2.7 docker exec
在运行的容器中执行一个新进程
2.8 save和export
docker save
创建一个镜像的压缩文件,这个文件能够在另外一个主机的Docker上使用。
docker export <container-id>
建一个tar文件,并且移除了元数据和不必要的层,将多个层整合成了一个层,只保存了当前统一视角看到的内容。(通过docker images –tree命令只能看到一个镜像)