【菜菜的CV进阶之路-GPU服务器使用-Docker环境配置-七】Docker 底层原理初探

第07课:Docker 底层原理初探

      • Docker 究竟做了什么/li>
      • Docker 的 C/S 模型
      • 进程和控制组
      • 分层存储
      • 接下来做什么/li>

Docker 究竟做了什么/h3>

为了理解 Docker 帮助我们做了什么,我们先来看看 Linux 内核做了什么。简单来说,Linux 内核做了下面几件事:

  • 对来自硬件的消息作出响应;
  • 启动和规划程序的运行;
  • 控制和组织存储;
  • 在程序之间传递消息;
  • 分配资源——内存,CPU, 络等;

Docker 做的也是这些事情:

Docker 的 C/S 模型

Docker 采用了 C/S 架构,包括客户端(Client)和服务端(Server),服务端通过 socket 接受来自客户端的请求,这些请求可以是创建镜像,运行容器,终止容器等等。

服务端既可以运行在本地主机,也可以运行在远程服务器或者云端,只要你可以访问 Docker 的服务端,你甚至可以在容器里运行容器。现在,我们来看看在 Docker 容器里运行 Docker 容器的例子:

Docker 官方有一个名为“docker”的镜像,使用这个镜像运行容器的话,就可以在容器里运行 Docker 命令。现在,我们让客户端运行在这个容器里面,服务端运行在宿主主机,所以需要把宿主主机的“/var/run/docker.sock”挂载到容器里的“/var/run/docker.sock”:

然后,我们可以在这个容器里运行 Docker 命令:

你可以看到,“net:v1.0” 本是我们自定义的镜像,存储在宿主主机里,之所以我们在容器里可以从这个镜像运行容器,是因为我们可以访问宿主主机的 Docker 服务端。所以只要我们可以访问宿主主机的 Docker 服务端,我们就可以从服务端存在的镜像运行容器。

总之,只要理解:Docker是C/S架构就可以了!

在深入讲解 Docker 络原理之前,不得不简单提一下 络有关的知识:

  • Ethernet(以太 ):通过有线或者无线传递“帧”(frame)
  • IP Layer:在局域 内传递数据包
  • Routing(路由):在不同 络之间传递数据包
  • Ports(端口):寻址一台主机的特定程序,这里指的是某些程序监听某些端口

其实在之前学习 Docker 络操作部分的时候,我们已经介绍过 Docker 络的一些原理了。Docker 并不是像变魔术一样直接在容器之间传递包,而是运行的时候会自动在宿主主机上创建一个名为 docker0 的虚拟 桥,它就像软件交换机一样,在挂载到它的 口之间进行消息转发。运行一个 Docker 容器时,会创建 veth 对(Virtual Ethernet Pair)接口,这对接口一端在容器内,另一端挂载到 Docker 的 桥(默认 docker0,或者使用– net 参数指定 络)。veth 总是成对出现,并且从一端进入的数据会从另一端流出,这样就可以实现挂载到同一 桥的容器间通信。

之前在学习 Docker 端口映射的时候,使用 -p 参数将宿主主机的端口映射到容器内部,这个过程用到了 Linux 的防火墙命令 iptable,iptable 会创建映射规则。现在,我们的主机上没有运行任何容器,让我们看看目前的端口映射规则:

现在,运行一个容器,映射宿主机的8080端口:

现在,再来看看端口映射情况:

可以从最后一行看到我们的映射规则“tcp dpt:8080 to 172.17.0.2:8080”。

进程和控制组

先来简单描述一下 Linux 进程有关知识。

Linux 的进程都是来自一个父进程,所以进程之间是父子关系。当一个子进程结束的时候,会返回一个退出代码给父进程。在众多进程中,有一个进程是特殊的,它就是初始化进程(init),进程 为0,这个进程负责启动所有其它进程。

使用 Docker 运行容器时,容器启动的时候也有一个初始化进程,当这个进程终止的时候,对应的容器也就终止了。下面以一个具体例子加深理解:

首先,运行一个容器:

然后,查看容器进程 :

在我的电脑上结果是:

然后使用”kill 23483″命令,发现容器退出。

并且,Docker 使用 Linux 控制组(cgroup, control group) 来对容器进程进行隔离。cgroup 是 Linux 内核的特性之一,它保证所有在一个控制组内的进程组成一个私密的、隔离的空间。控制组内的进程有自己的进程 ,并且无法访问所在控制组之外的进程。所以控制组可以把你的系统中的进程划分为若干相互隔离的区域,并且控制组内的父进程衍生的子进程依旧在这个控制组内。Docker 正是利用这个特性实现容器间进程隔离。同时,控制组还提供了资源限制,资源审计等功能,这些在 Docker 里都有所体现。

分层存储

在学习编写 Dockerfile 的部分,我们已经详细介绍过了 Docker 的分层存储架构,所以如果忘记了,请返回去复习相关内容。

接下来做什么/h3>

文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树首页概览8587 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年2月20日
下一篇 2019年2月20日

相关推荐