女主宣言

容器作为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云平台团队打造的技术分享公众号,内容涉及云计算、数据库、大数据、监控、泛前端、自动化测试等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

容器技术第一讲:容器入门篇相关推荐

  1. 老的消息中间件投递失败的类型值_RabbitMQ消息中间件技术精讲11 高级篇四 confirm 确认消息...

    RabbitMQ消息中间件技术精讲11 高级篇四 confirm 确认消息 理解Confirm消息确认机制: 消息的确认,是指生产者投递消息后,如果broker收到消息,则会给生产者一个应答: 生产者 ...

  2. 视频教程-①Spring Cloud 第一季(初级入门篇)-Java

    ①Spring Cloud 第一季(初级入门篇) 2011年毕业后在澳门 遊澳集团(UO Group)旗下某IT科技公司从事 android,php,j2ee开发工作,负责 国际短信发送系统.银联支付 ...

  3. 《第一阶段 Java基础 Day01笔记》————————第一讲 Java入门

    第一讲 Java入门                                                       1.爪哇岛(印尼)                 Java之父   ...

  4. LATEX教程第一讲—— LATEX入门

    LATEX教程第一讲--LATEX入门 1.1 什么是LATEX? 1.2 怎么下载? 1.3 Latex初入门 1.3.1 基本框架 1. 一篇Latex的开始--\documentclass[** ...

  5. 面向对象技术第一讲 多态性

    面向对象技术第一讲  多态性 一﹑什么是多态?为什么要支持多态? 多态是一种普遍存在的现象,如water的三种形态:冰﹑水﹑汽,又如算术运算1+1, 1+0.5, 1/2+0.5等. 多态性用一句经典 ...

  6. 面向对象技术第一讲 多态性(原创)

    面向对象技术第一讲  多态性   一﹑什么是多态?为什么要支持多态? 多态是一种普遍存在的现象,如water的三种形态:冰﹑水﹑汽,又如算术运算1+1, 1+0.5, 1/2+0.5等. 多态性用一句 ...

  7. 容器,容器技术,云容器相关入门知识

    前言 最近面试了一家国企,交谈愉快,对方的工程师问到容器时,突然愣了一下.脑子里有学习前端时候学习的docker,但印象里docker可不能代表容器技术,于是学习容器相关知识后整理相关知识以作巩固. ...

  8. 深入理解容器技术——聊聊服务容器化三大助力

    服务容器化三大助力 我们都知道,微服务的落地有众多需求,容器化技术是它的不二之选,容器化通过三大助力来实现了微服务落地的众多需求: 码头林立--各种软硬件平台层出不穷 容器化解决方案具有一个普适性,它 ...

  9. WebMatrix网站开发系列教程:第一讲 WebMatrix入门经典

    第一讲:新手想要学习网站开发,让我们从WebMatrix开始吧! WebMatrix新手学习网站开发的首选!网站开发老鸟更新自身知识体系的最佳时机! WebMatrix简要介绍: 微软WebMatri ...

最新文章

  1. HDU1556(树状数组模版)
  2. 9中继器添加一列序号自增_三个动态自动更新EXCEL序号的小技巧,解决重复编号困扰...
  3. 通过wsdl2java工具生成客户端段代码(wsdl2java -p cn.com.css.misps.graph.webservice.impl -d F:\src -all http://10.)
  4. gin框架长连接_一个TCP长连接设备管理后台工程(一)
  5. 利用工厂模式实现怪物系统
  6. C++中dynamic_cast的简介
  7. java面试常考_JAVA面试常考系列十
  8. 服务器三大体系SMP、NUMA、MPP介绍
  9. Django--模板语言
  10. 总结-最全linux工具的使用
  11. 多进程通信相关函数归纳
  12. python将列表转换成集合_python 将DataFrame转换为List
  13. TankGame1.0
  14. 几种常见的 Kafka 集群监控工具
  15. 夏昕ibatisiBATIS 2.0 开发指南配置文件说明
  16. react-router-dom v6 使用
  17. java流程控制试讲_java试讲.ppt
  18. 安卓解压html语言,安卓怎么解压7z带密码的文件
  19. 双11购书大优惠!独家优惠券,折后再减,赶紧来抢啊!
  20. Batch Normalization详解(原理+实验分析)

热门文章

  1. Struts2之struts-2.3.20开发环境的搭建并实现第一个Hello World小应用
  2. Struts2的简单介绍
  3. Eclipse控制台Console使用说明
  4. spark.sql读取Hive数据报错
  5. 铁大Facebook——十天冲刺(1)
  6. java 树形图构建
  7. 如何让普通用户可以对DBA_SOURCE视图进行闪回查询?
  8. Winform Echarts 显示百度地图的用法(3)
  9. Android短信彩信收发流程(应用层)
  10. CHM无法打开解决办法