内容简介:HULK一线技术杂谈由360云平台团队打造的技术分享公众号,内容涉及
女主宣言
容器作为Paas的一种体现,越来越受到广大 程序员 的喜爱。本文作为容器的入门篇,对 Docker 的原理和主要技术进行了初步的介绍。
PS:丰富的一线技术、多元化的表现形式,尽在“ HULK一线技术杂谈 ”,点关注哦!
1
概述
容器是Paas( Platform-as-a-Service,平台即服务)的一种体现。将所需软件整合成一个应用,一个服务。
通俗的讲:容器是一种沙盒技术。沙盒就是像集装箱一样,把应用整体封装起来的技术。封装后,应用与应用之间,在各自的边界内运行,不会相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去。
2
实现原理
容器技术的核心就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。 所以,容器只是运行在宿主机上的一种特殊的进程,使用的还是同一个宿主机的操作系统内核。
Docker在创建容器进程时,指定了这个进程所需要启用的一组Namespace参数。容器就只能看到当前Namespace所限定的资源、文件、设备、状态或者配置。而对于宿主机以及其他不相关的程序,它就完全看不到了。
3
对比虚拟机的工作原理
虚拟机主要是通过Hypervisor 的硬件虚拟化功能,模拟运行一个操作系统需要的各种硬件,比如 CPU、内存、I/O 设备等等。然后,它在这些虚拟的硬件上安装了一个新的操作系统,即 Guest OS。
基于以上,用户的应用进程就可以运行在这个虚拟的机器中,它能看到的只有 Guest OS 里面的文件和目录,以及这个机器里的虚拟设备。
区别于虚拟机技术的Docker则是用一个名为 Docker Engine 的软件替换了 Hypervisor。
Docker项目帮助用户启动的,还是原来的应用进程,只不过在创建这些进程时,Docker为它们加上了各种各样的Namespace参数。
进程会觉得自己是各自PID Namespace里的第1号进程,只能看到各自Mount Namespace里面挂载的目录和文件,只能访问到各自Network Namespace里的网络设备,就仿佛运行在一个“容器”里面一样。
Docker初始化时,默认会启用 PID, UTS, network, user, mount, IPC, cgroup的Namespace。
4
容器主要技术
Cgroups技术是用来制造约束的主要手段。
Namespace技术是用来修改进程视图的主要方法。
Linux Namespaces
Linux Namespaces机制是 Linux 提供的一种内核级别环境隔离的方法。 PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace。每个Namespace里面的资源对其他Namespace都是透明的。 Linux Namespace官方文档《Namespace in Operation》
实现过程主要用到:
Linux Cgroups
Linux Cgroups就是 Linux 内核中用来为进程设置资源限制的,它就是一个子系统目录加上一组资源限制文件的组合。
Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。Cgroups 还能够对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。
在 Linux 中,Cgroups 给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式存在于 /sys/fs/cgroup 路径下。
在 /sys/fs/cgroup 下面有很多诸如 cpuset、cpu、 memory 这样的子目录。这些都是机器当前可以被 Cgroups 进行限制的资源种类。在其资源下可以看到该类资源具体可以被限制的方法。Cgroups 的每一项子系统都有其独有的资源限制能力,比如:
5
容器的优点
Namespace 技术实际上只是限制了应用进程可以查看的内容,这些进程和宿主机上的其他进程一样,都是由宿主机操作系统统一管理,只不过这些被隔离的进程拥有额外设置过的 Namespace 参数。
容器本身并没有像Hypervisor那样对应用进程的隔离环境负责,真正对隔离环境负责的是宿主机操作系统。Docker在这里扮演的是辅助管理工作。
使用虚拟化技术作为应用沙盒,就必须要由 Hypervisor 来负责创建虚拟机,这个虚拟机是真实存在的,并且它里面必须运行一个完整的 Guest OS 才能执行用户的应用进程。这就不可避免地带来了额外的资源消耗和占用,尤其对计算资源、网络和磁盘 I/O 的损耗非常大。
而相比之下,容器化后的应用,却还是宿主机上的普通进程,所以性能损耗就不存在了;再有,使用 Namespace 作为隔离手段的容器并不需要 Guest OS,这就使得容器额外的资源占用几乎可以忽略不计。
6
容器的坑
基于 Linux Namespace 的机制隔离不彻底
首先,虽然容器只是运行在宿主机上的进程,但是那么多个容器之间使用的还是同一个宿主机的操作系统内核。 如果你要在 Windows 宿主机上运行 Linux 容器,或者在低版本的 Linux 宿主机上运行高版本的 Linux 容器,都是行不通的。
其次,在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,最典型的例子就是:时间。如果在虚机修改时间,会发现宿主机的也会改变。
容器的“限制”问题
上文说到容器只是看起来被封装起来,但是实际上他和系统上其他的进程是有资源间相互竞争的关系。合理的评估资源的使用就显得很重要了。
HULK一线技术杂谈
由360云平台团队打造的技术分享公众号,内容涉及 云计算 、 数据库 、 大数据 、 监控 、 泛前端 、 自动化测试 等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 容器入门浅解
- docker入门之容器网络
- C++逆向之容器vector篇入门
- Docker 容器编排入门[Docker 系列-8]
- Docker入门实战-SSH连接Docker容器
- 又一篇 iOS Extension 入门(2/3)— 与容器沟通
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
孵化Twitter
[美]尼克·比尔顿(Nick Bilton) / 欧常智、张宇、单旖 / 浙江人民出版社 / 2014-1 / 49.90元
一个在挣扎中生存的博客平台Odeo,一小撮龙蛇混杂的无政府主义者员工,经历了怎样的涅槃,摇身一变,成为纽交所最闪耀的上市企业Twitter? 一个野心勃勃的农场小男孩,一个满身纹身的“无名氏“,一个爱开玩笑的外交家,一位害羞而又充满活力的极客,这四位各有特色的创始人如何从兢兢业业、每日劳作的工程师,成为了登上杂志封面、奥普拉秀和每日秀的富裕名人?而在Twitter日益茁壮成长的过程中,他们又......一起来看看 《孵化Twitter》 这本书的介绍吧!