加入收藏 | 设为首页 | 会员中心 | 我要投稿 承德站长网 (https://www.0314zz.com.cn/)- 云开发、边缘计算、数据分析、视频终端、人体识别!
当前位置: 首页 > 云计算 > 正文

了解这些 Docker 原理知识,出去吹牛逼再也不担心了

发布时间:2021-06-07 11:12:06 所属栏目:云计算 来源:互联网
导读:在现代的开发流程中随处可见 Docker 的身影,Docker 提供了环境隔离、应用打包等功能让服务部署变得特别简单,本文将会浅析 Docker 背后所使用的技术,阅读完后,你可以搞清楚如下问题: 容器与虚拟机之间的差别 Docker 资源隔离的原理 Docker 资源限制的原
在现代的开发流程中随处可见 Docker 的身影,Docker 提供了环境隔离、应用打包等功能让服务部署变得特别简单,本文将会浅析 Docker 背后所使用的技术,阅读完后,你可以搞清楚如下问题:
容器与虚拟机之间的差别
Docker 资源隔离的原理
Docker 资源限制的原理
Docker 分层结构的原理
容器 vs 虚拟机
虚拟机(VM)是计算机系统的仿真器,通过软件模拟具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,能提供物理计算机的功能。
虚拟机通过在当前的真实操作系统上通过 Hypervisor 技术进行虚拟机运行环境与体系的建立并通过该技术进行资源控制,一个性能较好的物理机通常可以承载多个虚拟机,每个虚拟机都会有自己操作系统,如图 1.1 所示。
掌握这些 Docker 原理知识,出去吹牛逼再也不担心了
从图中可以看出,虚拟机提供了物理机硬件级别的操作系统隔离,这让不同虚拟机之间的隔离很彻底,但也需要消耗更多资源,而有时不需要这么彻底的隔离,而更希望不消耗那么多资源,此时就可以使用容器技术。
容器可以提供操作系统级别的进程隔离,以 Docker 为例,当我们运行 Docker 容器时,此时容器本身只是操作系统中的一个进程,只是利用操作系统提供的各种功能实现了进程间网络、空间、权限等隔离,让多个 Docker 容器进程相互不知道彼此的存在,如图 1.2 所示。
掌握这些 Docker 原理知识,出去吹牛逼再也不担心了
虚拟机技术与容器技术的最大区别在于:多个虚拟机使用多个操作系统内核,而多个容器共享宿主机操作系统内核。
Docker 资源隔离:Linux Namespace
Linux Namespace(Linux 命名空间)是 Linux 内核(Kernel)提供的功能,它可以隔离一系列的系统资源,如 PID(进程 ID,Process ID)、User ID、Network、文件系统等。
如果你熟悉 Linux,你可能会联想到 linux 中的 chroot 命令,该命令允许将当前目录修改成根目录(即根目录 / 的挂载点切换了),相当于文件系统被隔离了,Namespace 也具有相似的功能,但更加强大。
目前 Linux 主要提供 6 种不同类型的 Namespace,如下表所示。
掌握这些 Docker 原理知识,出去吹牛逼再也不担心了
以一个具体的例子来解释 Namespace 的作用,假设你有一台性能非常好的计算机,你向用户出售自己的计算机的资源,每个用户买到一个 ssh 实例,为了避免不同客户之间相互干扰,你可能会对不同用户进行权限限制,让用户只能访问自己 ssh 实例下的资源。
但有些操作需要 root 权限,而我们不能将 root 权限提供给用户,此时就可以使用 Namespae 了,通过 User Namespace 对 UID 进行隔离,具体而言,UID 为 x 的用户在该 Namespace 中具有 root 权限,但在真实物理机中,他依旧是 UID 为 x 的用户,这就解决了用户间隔离的问题。
此外还可以通过 PID Namespace 对 PID 进行隔离,从该 Namespace 中的用户角度看,Namespace 中就像一台新的 Linux,有自己的 init 进程(初始进程,PID 为 1),其他进程的 PID 在 init 进程 PID 上递增,如图 1.3 所示。
掌握这些 Docker 原理知识,出去吹牛逼再也不担心了
图中,进程 3 在父命名空就中 PID 为 3,而在子命名空间中,其 PID 为 1,用户在该子命名空间中内看进程 3 就像 init 进程一样。
Linux 提供了 3 个系统 API 方便我们使用 Namespace:
clone () 创建新进程,根据系统调用 flags 来决定哪种类型 Namespace 将会被创建,而该进程的子进程也会包含这些 Namespace。
setns () 将进程加入到已存在的 Namespace 中。
unshare () 将进程移出某个 Namespace
Docker 利用 Linux Namespace 功能实现多个 Docker 容器相互隔离,具有独立环境的功能,Go 语言对 Namespce API 进行了相应的封装,从 Docker 源码中可以看到相关的实现。

(编辑:承德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读