最全的Linux教程,Linux从入门到精通
======================
-
linux从入门到精通(第2版)
-
Linux系统移植
-
Linux驱动开发入门与实战
-
LINUX 系统移植 第2版
-
Linux开源网络全栈详解 从DPDK到OpenFlow
第一份《Linux从入门到精通》466页
====================
内容简介
====
本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。
本书适合广大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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**