MyException - 我的反常网
当时方位:我的反常网» 开源软件 » (转载)深化懂得Docker容器和镜像

(转载)深化懂得Docker容器和镜像

www.x8vin4.com  网友共享于:2018-06-06  阅读:0次
(转载)深化了解Docker容器和镜像

 

 

原文链接:http://dockone.io/article/783

 

 

这篇文章期望可以协助读者深化了解Docker的指令,还有容器(container)和镜像(image)之间的差异,并深化探讨容器和运转中的容器之间的差异。



 

Image Definition

镜像(Image)便是一堆只读层(read-only layer)的一致视角,或许这个界说有些难以了解,下面的这张图可以协助读者了解镜像的界说。



 
从左面咱们看到了多个只读层,它们堆叠在一起。除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker内部的完成细节,而且可以在主机(译者注:运转Docker的机器)的文件体系上访问到。一致文件体系(union file system)技能可以将不同的层整组成一个文件体系,为这些层供给了一个一致的视角,这样就躲藏了多层的存在,在用户的视点看来,只存在一个文件体系。咱们可以在图片的右边看到这个视角的方法。

你可以在你的主机文件体系上找到有关这些层的文件。需求留意的是,在一个运转中的容器内部,这些层是不行见的。在我的主机上,我发现它们存在于/var/lib/docker/目录下。

tree -L 1 /var/lib/docker/

/var/lib/docker/
├── aufs
├── containers
├── graph
├── init
├── linkgraph.db
├── repositories-aufs
├── tmp
├── trust
└── volumes
7 directories, 2 files

 

Container Definition

容器(container)的界说和镜像(image)简直如出一辙,也是一堆层的一致视角,仅有差异在于容器的最上面那一层是可读可写的



 

仔细的读者或许会发现,容器的界说并没有提及容器是否在运转,没错,这是成心的。正是这个发现协助我了解了许多困惑。


关键容器 = 镜像 + 读写层。而且容器的界说并没有提及是否要运转容器。

接下来,咱们将会谈论运转态容器。

Running Container Definition 运转态容器

一个运转态容器(running container)被界说为一个可读写的一致文件体系 加上 阻隔的进程空间和包含其间的进程下面这张图片展现了一个运转中的容器。



 

正是文件体系阻隔技能使得Docker成为了一个前途无量的技能一个容器中的进程或许会对文件进行修正、删去、创立,这些改动都将作用于可读写层(read-write layer)。下面这张图展现了这个行为。



 
咱们可以经过运转以下指令来验证咱们上面所说的:

docker run ubuntu touch happiness.txt


即便是这个ubuntu容器不在运转,咱们仍旧可以在主机的文件体系上找到这个新文件。

find / -name happiness.txt

/var/lib/docker/aufs/diff/860a7b...889/happiness.txt

 

Image Layer Definition 镜像层

为了将零散的数据整合起来,咱们提出了镜像层(image layer)这个概念。下面的这张图描绘了一个镜像层,经过图片咱们可以发现一个层并不只是包含文件体系的改动,它还能包含了其他重要信息。



 

元数据(metadata)便是关于这个层的额定信息,它不仅可以让Docker获取运转和构建时的信息,还包含父层的层次信息。需求留意,只读层和读写层都包含元数据。



 
除此之外,每一层都包含了一个指向基层的指针。假如一个层没有这个指针,阐明它处于最底层。



 

Metadata Location:

我发现在我自己的主机上,镜像层(image layer)的元数据被保存在名为”json”的文件中,比如说:

/var/lib/docker/graph/e809f156dc985.../json


e809f156dc985...便是这层的id

一个容器的元数据好像是被分成了许多文件,但或多或少可以在/var/lib/docker/containers/<id>目录下找到,<id>便是一个可读层的id。这个目录下的文件大多是运转时的数据,比如说网络,日志等等。

 

 

大局了解(Tying It All Together)

现在,让咱们结合上面说到的完成细节来了解Docker的指令。

docker create <image-id>



 

 

docker create 指令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。留意,这个容器并没有运转



 

docker start <container-id>


 

Docker start指令为容器文件体系创立了一个进程阻隔空间。留意,每一个容器只可以有一个进程阻隔空间。

docker run <image-id>


 

看到这个指令,读者一般会有一个疑问:docker start 和 docker run指令有什么差异。

从图片可以看出,docker run 指令先是运用镜像创立了一个容器,然后运转这个容器。这个指令十分的便利,而且躲藏了两个指令的细节,但从另一方面来看,这简略让用户产生误解。

题外话:持续咱们之前有关于Git的论题,我以为docker run指令类似于git pull指令。git pull指令便是git fetch 和 git merge两个指令的组合,相同的,docker run便是docker create和docker start两个指令的组合

docker ps



 

docker ps 指令会列出一切运转中的容器。这躲藏了非运转态容器的存在,假如想要找出这些容器,咱们需求运用下面这个指令。

docker ps –a



 

docker ps –a指令会列出一切的容器,不管是运转的,仍是中止的。

docker images



 

docker images指令会列出了一切顶层(top-level)镜像。实际上,在这里咱们没有办法区别一个镜像和一个只读层,所以咱们提出了top-level镜像。只要创立容器时运用的镜像或许是直接pull下来的镜像能被称为顶层(top-level)镜像,而且每一个顶层镜像下面都躲藏了多个镜像层。

docker images –a



 

docker images –a指令列出了一切的镜像,也可以说是列出了一切的可读层。假如你想要检查某一个image-id下的一切层,可以运用docker history来检查。

docker stop <container-id>



 docker stop指令会向运转中的容器发送一个SIGTERM的信号,然后中止一切的进程。

 

docker kill <container-id>



 

docker kill 指令向一切运转在容器中的进程发送了一个不友好的SIGKILL信号。

docker pause <container-id>



 

 

 

docker stop和docker kill指令会发送UNIX的信号给运转中的进程,docker pause指令则不相同,它运用了cgroups的特性将运转中的进程空间暂停。详细的内部原理你可以在这里找到:https://www.kernel.org/doc/Doc ... m.txt,可是这种方法的不足之处在于发送一个SIGTSTP信号关于进程来说不行简略易懂,以至于不可以让一切进程暂停。

docker rm <container-id>


 

docker rm指令会移除构成容器的可读写层。留意,这个指令只能对非运转态容器履行。

docker rmi <image-id>


 

 

docker rmi 指令会移除构成镜像的一个只读层。你只可以运用docker rmi来移除最顶层(top level layer)(也可以说是镜像),你也可以运用-f参数来强制删去中心的只读层。 

docker commit <container-id>


 

docker commit指令将容器的可读写层转化为一个只读层,这样就把一个容器转化成了不行变的镜像。



 

docker build


 

docker build指令十分风趣,它会重复的履行多个指令。



 

咱们从上图可以看到,build指令依据Dockerfile文件中的FROM指令获取到镜像,然后重复地1)run(create和start)、2)修正、3)commit。在循环中的每一步都会生成一个新的层,因而许多新的层会被创立。

 

docker exec <running-container-id>



 

docker exec 指令会在运转中的容器履行一个新进程。

docker inspect <container-id> or <image-id>


 

docker inspect指令会提取出容器或许镜像最顶层的元数据。

docker save <image-id>



 

docker save指令会创立一个镜像的压缩文件,这个文件可以在别的一个主机的Docker上运用。和export指令不同,这个指令为每一个层都保存了它们的元数据。这个指令只能对镜像收效。

docker export <container-id>


 

docker export指令创立一个tar文件,而且移除了元数据和不必要的层,将多个层整组成了一个层,只保存了当时一致视角看到的内容(译者注:expoxt后的容器再import到Docker中,经过docker images –tree指令只能看到一个镜像;而save后的镜像则不同,它可以看到这个镜像的前史镜像)。

docker history <image-id>



 

docker history指令递归地输出指定镜像的前史镜像。

 

 

 

 

 

 

 

 

 

 

文章谈论

软件开发程序过错反常ExceptionCopyright © 2009-2015 MyException 版权一切