10张图带你深入理解Docker容器和镜像_容器 镜像 详情 开源

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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


### Container Definition


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


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVDUXpqQTF1aWNGMUkySTdET2FNa1FCNGliV2p4djFKT0NjMkJPWkg4SXRWeU8waWIwVzE3QlU1Z2cvNjQw?x-oss-process=image/format,png)
细心的读者可能会发现,容器的定义并没有提及容器是否在运行,没错,这是故意的。正是这个发现帮助我理解了很多困惑。


要点:**容器 = 镜像 + 读写层。并且容器的定义并没有提及是否要运行容器。**


接下来,我们将会讨论运行态容器。


### Running Container Definition


一个运行态容器(running container)被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程。下面这张图片展示了一个运行中的容器。


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVWUGNMSjFpYzhldm80dW9RTUpDc1VuenR2NHBhMDNqU2ljcDdKMTlETEVwVWNIcVBqVzdDT0J2QS82NDA?x-oss-process=image/format,png)
正是文件系统隔离技术使得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)这个概念。下面的这张图描述了一个镜像层,通过图片我们能够发现一个层并不仅仅包含文件系统的改变,它还能包含了其他重要信息。


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVNcFJrWWVVZGh0a3haODFENnJ3SlBCeWZFR0dYWkdpYzBCeDE2a1FxT2lieDdJc2RRTDk5cVZXUS82NDA?x-oss-process=image/format,png)
除此之外,每一层都包括了一个指向父层的指针。如果一个层没有这个指针,说明它处于最底层。


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXU1Q0hYNWFZZVdiTXdGT3FTMEtwdUtBSTI4cU13SU5Qbmc1aWFlZFdhY2RaZ2liU0xINmY2TGljTWcvNjQw?x-oss-process=image/format,png)
### Metadata Location:


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



/var/lib/docker/graph/e809f156dc985…/json


* e809f156dc985...就是这层的id



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


### 全局理解(Tying It All Together)


现在,让我们结合上面提到的实现细节来理解Docker的命令。



docker create


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVyUmlhdzhrTk4zbXMxakVsMEFXWnI1RTZXMjVsdURxU0hiY2ExaWNKbFh5dlV3RG5Odk50N1Vmdy82NDA?x-oss-process=image/format,png)

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


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVTZjNnR2VERGJ2aWE1aWFFcEFzZmo0a0JyVTh1Mk5wWkV2em9rQlllSEJnc0VnWFpvT0RSNzVIdy82NDA?x-oss-process=image/format,png)

docker start


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVYRG0xTFYwdU14OWJEa2VOZW43M3plWVZuRk9acTB2NGJ1OUJBWlpyNG12V0tBMFlGemljZGNnLzY0MA?x-oss-process=image/format,png)

> 
> Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。
> 
> 
> 



docker run


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVPVTN0UkZnSG43bVVWSUY0aWJ1ME5pYzl6MnBPNjM2QU1Wb2RRTnd1VnZPRVY5aGljMjBHRklNaWFBLzY0MA?x-oss-process=image/format,png)
* 看到这个命令,读者通常会有一个疑问:docker start 和 docker run命令有什么区别。


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVBMzBGekJxNEV2SnFXT1dIQmRxWEYxRUNCSVJnbGp0MzVNR0ZpYmliMlIzR0pLT2d4SE1jcWljMEEvNjQw?x-oss-process=image/format,png)

> 
> 从图片可以看出,docker run 命令先是利用镜像创建了一个容器,然后运行这个容器。这个命令非常的方便,并且隐藏了两个命令的细节。因此可以理解docker run就是docker create和docker start两个命令的组合。
> 
> 
> 



docker ps


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVzSGZrcGlhYkY3dDR5V0ZKeTFmU3luTHFQaWIwV2FXQXc3SDk5NE1RY2syeDB6bFRabFU0Tko1dy82NDA?x-oss-process=image/format,png)

> 
> docker ps 命令会列出所有运行中的容器。这隐藏了非运行态容器的存在,如果想要找出这些容器,我们需要使用下面这个命令。
> 
> 
> 



docker ps –a


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXV1bHBNcFZBaWJBNkc1UnNJSHIzVVUyVHlpYlZjcGNqRDlKeEpnWm5HdFpKZUF1eEJKSDBGbjRidy82NDA?x-oss-process=image/format,png)

> 
> docker ps –a 命令会列出所有的容器,不管是运行的,还是停止的。
> 
> 
> 



docker images


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVaOUZhcGliZnZTclpwY2lia2RUeTNESm1ySXNYcnpQclBVdDZKUVNXTTZXUjBsbVhBcGU5OHhUQS82NDA?x-oss-process=image/format,png)

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



docker images –a


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVmWFE4R1pINGxnNjhUMWF2UVUzdlk3dnhobE5HVE5JTUZMRFppYVRyODh5UjhQQ3ppYXJNcndYQS82NDA?x-oss-process=image/format,png)

> 
> docker images –a命令列出了所有的镜像,也可以说是列出了所有的可读层。如果你想要查看某一个image-id下的所有层,可以使用docker history来查看。
> 
> 
> 



docker stop


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXUzMVhiWGNpY0llTk9kYWtpYUpSS1FOMnJseENJc1VyYzI0Y3oxR25VaWJCeDRJenJnUGNqNkxhOXcvNjQw?x-oss-process=image/format,png)

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



docker kill


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVYdm9Fb2FzeXRYUldWUnFsNm5GWWY5ZW4xQ0kxZjlpY05HeWxMQkE5Z0hRVHQyNU03ck1BSTVBLzY0MA?x-oss-process=image/format,png)

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



docker pause


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVmR0JuWWZsZ0ZGUEFZNFY0bGp4Q2VZOHJnY09qU3FENUQxa0xsQUtRaWIxN3lDellFSmpaWmF3LzY0MA?x-oss-process=image/format,png)

> 
> docker stop和docker kill命令会发送UNIX的信号给运行中的进程,docker pause命令则不一样,它利用了cgroups的特性将运行中的进程空间暂停。具体的内部原理你可以在这里找到:https://www.kernel.org/doc/Doc ... m.txt,但是这种方式的不足之处在于发送一个SIGTSTP信号对于进程来说不够简单易懂,以至于不能够让所有进程暂停
> 
> 
> 



docker rm


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXV3SnY1djRaanVocWppYU1LdWpra21qTXFlWUxyVmdLOVBBaWF4eDF0eTF1R0VoODlSZU5VSlJBZy82NDA?x-oss-process=image/format,png)

> 
> docker rm命令会移除构成容器的可读写层。注意,这个命令只能对非运行态容器执行。
> 
> 
> 



docker rmi


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXUzdjVKeDZFUVAycDBhMXlyTmMxaWM5MmVBc012ZmRVYkRFZUtUd2FoN21Lb3g0b0txaFJ3S2tBLzY0MA?x-oss-process=image/format,png)

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



docker commit


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXV5OXhRQlY1RXRpYzNRQWljREFHS2libUpaUXoyMHMxVGRKaWE1MnREZENsR2dpY3lVUmYxYjB1WVF2Zy82NDA?x-oss-process=image/format,png)
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVjZ0YxMHVDaHFIblJuQlNaclhTakpGbjNrelJUamJHMXJ0a0lPUWljaWF3RTNaSUY0Wkhyd1R6US82NDA?x-oss-process=image/format,png)

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



docker build


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVaRlo4MW9XSEFCZ2lheVZDdFZQYmxCTkhFdkxwaWFyQ3JrcEthWEk0RUxMa1NLNnVISFRnYUpndy82NDA?x-oss-process=image/format,png)

> 
> docker build命令非常有趣,它会反复的执行多个命令。
> 
> 
> 


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9jYkNMZ2ZKWmlicHJKT3JOd21RM1hGRnMycm1UdjBqQXVHMkxNaWJVb29VUUxBV2p4ZXpiQUtUSzd3SGljbldINGQ0VkVHM3p5TU1keEVkVGRTYlo4ZERCQS82NDA?x-oss-process=image/format,png)


### 最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

### 资料预览

给大家整理的视频资料:

![](https://img-blog.csdnimg.cn/img_convert/492871081a89470f7fa565d3bca885ce.png)

给大家整理的电子书资料:

  

![](https://img-blog.csdnimg.cn/img_convert/6fbde33fb124598d41f19b27863e2d54.png)



**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

[外链图片转存中...(img-I0nvBICf-1715692371081)]

给大家整理的电子书资料:

  

[外链图片转存中...(img-6XpbsspV-1715692371082)]



**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 23
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker是一种流行的容器化技术,通过轻量级、隔离性强的容器来运行应用程序。下面我将通过十张图深入理解Docker容器镜像。 1. 第一张图展示了Docker容器镜像的关系。镜像Docker的基础组件,它是一个只读的模板,包含了运行应用程序所需的所有文件和配置。容器是从镜像创建的实例,它具有自己的文件系统、网络和进程空间。 2. 第二张图展示了Docker容器的隔离性。每个容器都有自己的文件系统,这意味着容器之间的文件互不干扰。此外,每个容器还有自己的网络和进程空间,使得容器之间的网络和进程相互隔离。 3. 第三张图展示了Docker镜像容器的可移植性。镜像可以在不同的主机上运行,只需在目标主机上安装Docker引擎即可。容器也可以很容易地在不同的主机上迁移,只需将镜像传输到目标主机并在其上创建容器。 4. 第四张图展示了Docker容器的快速启动。由于Docker容器与主机共享操作系统内核,启动容器只需几秒钟的时间。这使得快速部署和扩展应用程序成为可能。 5. 第五张图展示了Docker容器的可重复性。通过使用Dockerfile定义镜像构建规则,可以确保每次构建的镜像都是相同的。这样,可以消除由于环境差异导致的应用程序运行问题。 6. 第六张图展示了Docker容器的资源隔离性。Docker引擎可以为每个容器分配一定数量的CPU、内存和磁盘空间,确保容器之间的资源不会互相干扰。 7. 第七张图展示了Docker容器的可扩展性。通过使用Docker Swarm或Kubernetes等容器编排工具,可以在多个主机上运行和管理大规模的容器群集。 8. 第八张图展示了Docker镜像的分层结构。镜像由多个只读层组成,每个层都包含一个或多个文件。这种分层结构使得镜像的存储和传输变得高效。 9. 第九张图展示了Docker容器的生命周期。容器可以通过创建、启动、停止和销毁等命令来管理。这使得容器的维护和管理变得简单。 10. 第十张图展示了Docker容器的应用场景。Docker容器广泛应用于开发、测试、部署和运维等领域。它可以提供一致的开发和运行环境,简化了应用程序的管理和交付过程。 通过这十张图,希望能让大家更深入地理解Docker容器镜像的概念、特性和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值