容器_容器技术 - CSDN
容器 订阅
容器是指用以容纳物料并以壳体为主的基本装置。常用作储存设备或其他化工设备的外壳。主要由壳体、封头、接管、法兰和支座组成。对容器的基本要求是:满足工艺需要;保证操作安全,包括具有足够的强度、刚度以及密封性;耐腐蚀,具有一定的使用寿命;便于制造、安装、维修和使用;成本低,材料节省,尤其要节约不锈钢和有色金属等贵重材料。容器在化工生产中应用广泛,按压力分有真空、常压、外压的压力容器,压力容器又可分低压、中压、高压及超高压容器;按温度分有常温、低温及高温容器;按筒体结构分有单层容器和多层容器;按工艺用途分有储存、分离、反应及换热容器;按厚度分有薄壁和厚壁容器。 [1] 展开全文
容器是指用以容纳物料并以壳体为主的基本装置。常用作储存设备或其他化工设备的外壳。主要由壳体、封头、接管、法兰和支座组成。对容器的基本要求是:满足工艺需要;保证操作安全,包括具有足够的强度、刚度以及密封性;耐腐蚀,具有一定的使用寿命;便于制造、安装、维修和使用;成本低,材料节省,尤其要节约不锈钢和有色金属等贵重材料。容器在化工生产中应用广泛,按压力分有真空、常压、外压的压力容器,压力容器又可分低压、中压、高压及超高压容器;按温度分有常温、低温及高温容器;按筒体结构分有单层容器和多层容器;按工艺用途分有储存、分离、反应及换热容器;按厚度分有薄壁和厚壁容器。 [1]
信息
定义1
包装或装载物品的贮存器
外文名
container;vessel
材    质
金属 非金属
用    途
装载物品
中文名
容器
定义2
能将其他控件放置在其上面的控件
容器计算机
能够将其他控件放置在其上面的控件,如VB中的Frame控件或PictureBox控件等。容器是应用服务器中位于组件和平台之间的接口集合。容器是伴随着瘦客户端系统的发展而诞生的。在开发瘦客户端系统时,开发人员要花费大量的精力去关注线程安全、事务、网络、资源等等细节,从而降低了开发效率。由于这些对这些细节的解决方法一般是固定不变,或者只有参数改变的,所以从代码重用和设计模式的角度出发,开发人员将这些底层细节提取出来,做成平台,并提供一定的接口。这样,业务开发人员就不需要在关注与这些底层细节的实现,而专注于业务逻辑的实现。容器一般位于应用服务器之内,由应用服务器负责加载和维护。一个容器只能存在于一个应用服务器之内,一个应用服务器可以建立和维护多个容器。容器一般遵守可配置的原则,即容器的使用者可以通过对容器参数的配置,来达到自己的使用需求,而不需要修改容器的代码。定义容器是用来存储和组织其他对象的对象。实现链表的类就是一个容器的示例。如vectormydata;//创建存储double类型值的容器mydata可以在容器中存储基本类型或任何类类型的条目。如果STL容器模板的类型实参是一个类类型,那么容器可以存储该类型的对象或者任何派生类类型的对象。通常,容器存储我们存储在其中的对象的副本,它们自动分配和管理对象占用的内存。当销毁某个容器的对象时,容器会负责销毁它包含的对象并释放它们占用的内存。使用STL容器存储对象的一个优点是我们不用费心管理它们的内存。 在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要。经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在细节上有所出入。STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。STL容器类的模板容器部分主要由头文件,,,,,组成。对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件的对应关系。数据结构描述实现头文件向量(vector)连续存储的元素列表(list)由节点组成的双向链表,每个结点包含着一个元素双队列(deque)连续存储的指向不同元素的指针所组成的数组集合(set)由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的位次排列,没有两个不同的元素能够拥有相同的次序多重集合(multiset)允许存在两个次序相等的元素的集合栈(stack)后进先出的值的排列队列(queue)先进先出的值的排列优先队列(priority_queue)元素的次序是由作用于所存储的值对上的某种谓词决定的一种队列映射(map)由{键,值}对组成的集合,以某种作用于键对上的谓词排列多重映射(multimap)允许键对有相等的次序的映射为所有容器定义的操作
收起全文
精华内容
参与话题
  • 本套课程Docker虚拟化容器—Docker网络和数据持久化: 旨在理解Docker网络和数据持久化
  • 容器的基本概念

    千次阅读 2018-12-15 12:36:46
    容器技术的基本概念: 什么是容器? 包装或装载物品的贮存器 没错计算机领域的容器概念也是一样,思考一下你们家的菜要分盘子呢?难道不可以十几个菜放一个大盆子里吗?当然是可以的,只是这样能好吃吗~~~~ 容器...

    容器技术的基本概念:

    什么是容器?

    包装或装载物品的贮存器

    没错计算机领域的容器概念也是一样,思考一下你们家的菜要分盘子呢?难道不可以十几个菜放一个大盆子里吗?当然是可以的,只是这样能好吃吗~~~~ 容器技术也是一样的道理就是不同容器里的进程不会互相影响,你的空间只有那么大,就好比你的碗只能盛那么多饭~~~~~ 没错就是这样

    容器是虚拟化技术

    虚拟化技术分为:

    • 主机级虚拟化
    • 容器级虚拟化

    主机级虚拟化:

    Type-I:

    Type-II:

    为每一个封闭的实例,提供的是一个从底层硬件开始一直到高层的基础环境。也就意味着说我们每一个对应的虚拟机实例就拥有自己可视的,而且是隔离于其它实例的基础硬件,包括CPU,内存等等,所以它在硬件完成资源划分以后,提供给了我们每一个实例一个基础环境,使得我们每一个实例都得安装操作系统,从而就拥有自己的内核空间和用户空间,所以这么一来不当紧,做为当前实例的使用者,就得安装操作系统,提供环境,安装程序并提供配置文件,最终才可用服务。

    主机级虚拟化,由于做了两级内核,虚拟机自己有一级,hypervisor会有性能损耗,但是隔离性是非常好的。但过于重量级。

    技术代表:

    VM:这个开发者们就比较熟悉了

    容器级虚拟化:

    用户空间仅仅运行用户进程而以,就不需要在主机级虚拟化技术上,它自己管理自己的内核,把虚拟出来的内核给剥离掉。给用户一个chroot环境,在这个虚根下,能够隔离和其它用户相关的用户环境。
    在内核中的一个逻辑级别能够设置为隔离开来的区域,彼此之间互相不干扰,不影响的话。那么我们就可以做出来仅在用户空间,就能实现隔离的组件来。那这个在用户空间就能实现的组件就称为“容器”。每一个空间就称为一个容器,因为每一个空间都容纳了一堆的进程和用户帐号文件等等

    容器的作用是环境隔离也是追求的目标,隔离的是用户空间,IPC 完全独立 ,不同,USER 不同(一个假的root)、网络(都有不同的TCP协议栈)都是假的宿主机来说

    技术代表:
    LXC:

    LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与传统虚拟化技术相比,它的优势在于:
    (1)与宿主机使用同一个内核,性能损耗小;
    (2)不需要指令级模拟;
    (3)不需要即时(Just-in-time)编译;
    (4)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
    (5)避免了准虚拟化和系统调用替换中的复杂性;
    (6)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。

    缺点:

    • lxc-create,template(解决系统发行版不同问题,完成各种隔离文件系统等 的安装)
    • 迁移和批量不方便
      总结:Linux Container是一种轻量级的虚拟化的手段,是一种前端工具,但是不适合大规模使用。
    Docker:

    相当于LXC的加强版和LXC一样的是都是一种工具,对于Docker 解决的就是LXC问题,对不同发行版做了更好的问题,解决思路就是镜像,基于镜像启动容器,而不同的镜像在拉取得时候会对应的发行版

    docker的优势:

    • 一个容器只运行一个进程没有使用容器的话就是所有的进程共同使用一个用户空间 ipc 等

    • 如果没用容器假如出问题了,那么每个容器都有自带的调试工具,对运维人员不友好,对开发人员友好
      易于分发,不考虑底层系统,部署简单

    • docker 镜像(分层构建,联合挂载):防止单个镜像体积过大

    ps:下层不能修改只能读,就算该也会先复制下层,对于数据 一般都是挂载宿主机的存储里,容器不需要持久,进程挂了容器也就可以删了

    隔离与分配的实现

    那么这个隔离怎么实现呢?

    内核 Namespaces原生支持(UTS,mount,ips,pid,user,net)这些隔离,linux有专门的系统调用

    namespaces 系统调用参数 隔离内容 内核版本
    UTS CLONE_NEWUTS 主机和域名 2.6.19
    IPC CLONE_NEWIPC 信号量,消息队列,共享内存 2.6.19
    PID CLONE_NEWPID 进程编号 2.6.24
    NETWORK CLONE_NEWNET 网络设备 2.6.29
    MOUNT CLONE_NEWMOUNT 挂载点 2.4.19
    USER CLONE_USER 用户和用户组 3.8

    资源分配如何实现呢?
    使用cgroups针对用户控件和进程进行资源分配

    cgroups 分配内容
    blkio 块设备IO
    cpu CPU
    cpuacct CPU资源使用报告
    cpuset 多处理器平台上的CPU集合
    devices 设备访问
    freezer 挂起或恢复任务
    memory 内存用量和报告
    perf_event 对cgroups中的任务进行统一性能测试
    net_ds 数据报文的类别标识

    容器编排工具:

    为了管理(单机或集群)容器的生命周期,解决服务之前的依赖关系,这就是编排工具干的事(

    常用的编排工具:

    • machine+swarm+compose (单机)
    • mesos-marathon
    • k8s(占市场80%一家独大,K8s 支持很多种容器技术)

    CNCF :k8s 的组织不会被谷歌私有化

    容器标准:lxc->libcontainer->runC

    展开全文
  • 通俗讲解:什么是容器?为什么我们要使用它?

    万次阅读 多人点赞 2018-12-17 10:35:04
    作为程序员,让我们回忆我们每天从事的熟悉得不能再熟悉的软件开发工作: 在本地搭好开发环境,进行开发工作,完了进行单元测试,把开发好的代码部署到测试系统,重复测试,最后部署到生产系统。...

    作为程序员,让我们回忆我们每天从事的熟悉得不能再熟悉的软件开发工作:

    在本地搭好开发环境,进行开发工作,完了进行单元测试,把开发好的代码部署到测试系统,重复测试,最后部署到生产系统。

    在这里插入图片描述

    我们不可避免地会遇到这种情况:同样的代码,运行环境发生变化之后无法正常运行。

    这种运行环境的变化可以分成不同的维度:

    比如代码从程序员的笔记本电脑切换到测试服务器,或者从一台物理服务器切换到公有云/私有云上;
    代码依赖的运行库版本发生变化,比如开发时用的python2.7, 但生产机上用的python3
    也可能是代码运行的操作系统发生了变化,比如开发及用的ubuntu,生产机用的redhat

    程序员除了投入时间在应用程序本身开发上之外,还需要花费额外的精力去处理这种环境或者说infrastructure问题,有的时候很头痛。

    作为一个应用程序开发人员,我对底层的这些环境问题不感兴趣,有没有一种办法能使的我不去考虑它们呢?有,使用容器技术。

    什么是容器?我们可以从现实生活中容器的概念来类比。
    在这里插入图片描述
    简单地说,一个容器包含了完整的运行时环境:除了应用程序本身之外,这个应用所需的全部依赖、类库、其他二进制文件、配置文件等,都统一被打入了一个称为容器镜像的包中。通过将应用程序本身,和其依赖容器化,操作系统发行版本和其他基础环境造成的差异,都被抽象掉了。

    为什么我们要使用容器?那得看看它带来的好处。
    在这里插入图片描述

    既然容器封装了所有运行应用程序所必需的相关的细节,比如应用依赖以及操作系统,这就使得镜像从一个环境移植到另外一个环境更加灵活。比如,同一个镜像可以在Windows或Linux,开发、测试或生产环境中运行。

    标准化:大多数容器实现技术基于开放标准,可以运行在所有主流 的Linux 发行版、Microsoft等操作系统上。

    容器镜像提供版本控制,这样就可以追踪不同版本的容器,监控版本之间的差异。

    容器隔离带来的安全性:一台宿主机上可以运行多个容器,但这些容器内的进程是相互隔离的,且无法相互感知。其中一个容器的升级或者出现故障,不会影响其他容器。

    相比虚拟机来说更加轻量级:

    虚拟机和容器的目的类似,都致力于对应用程序及其关联性进行隔离,从而构建起一套能够不依赖于具体环境而运行的应用单元。
    在这里插入图片描述

    虚拟机是在物理服务器的上层用软件来模拟特定的硬件系统。Hypervisor位于硬件和系统之间,是创建虚拟机必须的一个部分。虚拟机软件必须使用Hypervisor作为一个中间层,是虚拟机技术的核心,当宿主操作系统启动虚拟机时,会通过hypervisor给虚拟机分配内存,CPU,网络和磁盘等资源,并加载虚拟的操作系统,因而需要消耗宿主机大量的物理资源。

    一台宿主机上运行的多个容器化应用共享这台宿主机操作系统的内核,因而不需要虚拟机技术的hypervisor中间层,因而同虚拟机技术相比,更加轻量化,启动速度更快。

    为什么这几年来容器技术一下子流行了起来?

    随着微服务架构应用开发的普及,很多IT公司纷纷推出了基于微服务架构的新产品,就连SAP这种传统的企业管理软件巨头也发布了很多基于微服务的解决方案,比如Engagement center, revenue cloud等等。
    在这里插入图片描述

    起初微服务提供商倾向于把微服务部署在虚拟机里,这也能实现微服务的隔离性,但无法进行快速扩展,因为前面介绍过的虚拟机的实现原理,其启动需要耗费一些时间,无法立即对瞬时突增的负载或者流量做出反应。并且从成本考虑,使用传统的虚拟机技术,为了实现隔离性,每个应用或者说微服务都必须运行在一个虚拟机里,这种重复和浪费的操作系统和资源的分配,可以通过容器技术来避免,从而大大减少了云服务提供商对硬件的投入,节省了云服务中心的成本。

    在这里插入图片描述

    要获取更多Jerry的原创文章,请关注公众号"汪子熙":

    展开全文
  • 容器技术详解

    2018-11-21 21:03:59
    一、什么是容器? IT里的容器技术是英文单词Linux Container的直译。container这个单词有集装箱、容器的含义(主要偏集装箱意思)。不过,在中文环境下,咱们要交流要传授,如果翻译成“集装箱技术” 就有点拗口,...

    一、什么是容器?

    IT里的容器技术是英文单词Linux Container的直译。container这个单词有集装箱、容器的含义(主要偏集装箱意思)。不过,在中文环境下,咱们要交流要传授,如果翻译成“集装箱技术” 就有点拗口,所以结合中国人的吐字习惯和文化背景,更喜欢用容器这个词。不过,如果要形象的理解Linux Container技术的话,还是得念成集装箱会比较好。我们知道,海边码头里的集装箱是运载货物用的,它是一种按规格标准化的钢制箱子。集装箱的特色,在于其格式划一,并可以层层重叠,所以可以大量放置在特别设计的远洋轮船中(早期航运是没有集装箱概念的,那时候货物杂乱无章的放,很影响出货和运输效率)。有了集装箱,那么这就更加快捷方便的为生产商提供廉价的运输服务。

    img

    因此,IT世界里借鉴了这一理念。早期,大家都认为硬件抽象层基于hypervisor(['haɪpəvaɪzə],系统管理程序,一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件)的虚拟化方式可以最大程度上提供虚拟化管理的灵活性。各种不同操作系统的虚拟机都能通过hypervisor(KVM、XEN等)来衍生、运行、销毁。然而,随着时间推移,用户发现hypervisor这种方式麻烦越来越多。为什么?因为对于hypervisor环境来说,每个虚拟机都需要运行一个完整的操作系统以及其中安装好的大量应用程序。但实际生产开发环境里,我们更关注的是自己部署的应用程序,如果每次部署发布我都得搞一个完整操作系统和附带的依赖环境,那么这让任务和性能变得很重和很低下。

    基于上述情况,人们就在想,有没有其他什么方式能让人更加的关注应用程序本身,底层多余的操作系统和环境我可以共享和复用?换句话来说,那就是我部署一个服务运行好后,我再想移植到另外一个地方,我可以不用再安装一套操作系统和依赖环境这就像集装箱运载一样,我把货物一辆兰博基尼跑车(好比开发好的应用APP),打包放到一容器集装箱里,它通过货轮可以轻而易举的从上海码头(CentOS7.2环境)运送到纽约码头(Ubuntu14.04环境)。而且运输期间,我的兰博基尼(APP)没有受到任何的损坏(文件没有丢失),在另外一个码头卸货后,依然可以完美风骚的赛跑(启动正常)。

    img

    Linux Container容器技术的诞生(2008年)就解决了IT世界里“集装箱运输”的问题。Linux Container(简称LXC)它是一种内核轻量级的操作系统层虚拟化技术。Linux Container主要由Namespace和Cgroup两大机制来保证实现。那么Namespace和Cgroup是什么呢?刚才我们上面提到了集装箱,集装箱的作用当然是可以对货物进行打包隔离了,不让A公司的货跟B公司的货混在一起,不然卸货就分不清楚了。那么Namespace也是一样的作用,做隔离。光有隔离还没用,我们还需要对货物进行资源的管理。同样的,航运码头也有这样的管理机制:货物用什么样规格大小的集装箱,货物用多少个集装箱,货物哪些优先运走,遇到极端天气怎么暂停运输服务怎么改航道等等... 通用的,与此对应的Cgroup就负责资源管理控制作用,比如进程组使用CPU/MEM的限制,进程组的优先级控制,进程组的挂起和恢复等等。

    img

    二、容器技术的特点

    容器的特点其实我们拿跟它跟硬件抽象层虚拟化hypervisor技术对比就清楚了,我们之前也提到过,传统的虚拟化(虚拟机)技术,创建环境和部署应用都很麻烦,而且应用的移植性也很繁琐,比如你要把vmware里的虚拟机迁移到KVM里就很繁琐(需要做镜像格式的转换)。那么有了容器技术就简单了,总结下容器技术主要有三个特点:

    • 1. 极其轻量:只打包了必要的Bin/Lib
    • 2. 秒级部署:根据镜像的不同,容器的部署大概在毫秒与秒之间(比虚拟机强很多);
    • 3. 易于移植:一次构建,随处部署;
    • 4. 弹性伸缩:Kubernetes、Swam、Mesos这类开源、方便、好使的容器管理平台有着非常强大的弹性管理能力。

    img

    三、容器的标准化

    当前,docker几乎是容器的代名词,很多人以为docker就是容器。其实,这是错误的认识,除了docker 还有coreos。所以,容器世界里并不是只有docker一家。既然不是一家就很容易出现分歧。任何技术出现都需要一个标准来规范它,不然各搞各的很容易导致技术实现的碎片化,出现大量的冲突和冗余。因此,在2015年,由Google,Docker、CoreOS、IBM、微软、红帽等厂商联合发起的OCI(Open Container Initiative)组织成立了,并于2016年4月推出了第一个开放容器标准。标准主要包括runtime运行时标准和image镜像标准。标准的推出,有助于替成长中市场带来稳定性,让企业能放心采用容器技术,用户在打包、部署应用程序后,可以自由选择不同的容器Runtime;同时,镜像打包、建立、认证、部署、命名也都能按照统一的规范来做。

    两种标准主要包含以下内容:

    1. 容器运行时标准 (runtime spec)

    a). creating:使用 create 命令创建容器,这个过程称为创建中

    b). created:容器创建出来,但是还没有运行,表示镜像和配置没有错误,容器能够运行在当前平台

    c). running:容器的运行状态,里面的进程处于 up 状态,正在执行用户设定的任务

    d). stopped:容器运行完成,或者运行出错,或者 stop 命令之后,容器处于暂停状态。这个状态,容器还有很多信息保存在平台中,并没有完全被删除

    1. 容器镜像标准(image spec)

    a). 文件系统:以 layer 保存的文件系统,每个 layer 保存了和上层之间变化的部分,layer 应该保存哪些文件,怎么表示增加、修改和删除的文件等;

    b). config 文件:保存了文件系统的层级信息(每个层级的 hash 值,以及历史信息),以及容器运行时需要的一些信息(比如环境变量、工作目录、命令参数、mount 列表),指定了镜像在某个特定平台和系统的配置。比较接近我们使用 docker inspect

    四、容器的主要应用场景

    容器技术的诞生其实主要解决了PAAS的层的技术实现。像OpenStack、Cloudstack这样的技术是解决IAAS层的问题。IAAS层和PAAS层大家估计也听得很多了,关于他们的区别和特性我这里不在描述。那么容器技术主要应用在哪些场景呢?目前主流的有以下几种:

    1. 容器化传统应用 容器不仅能提高现有应用的安全性和可移植性,还能节约成本。

    每个企业的环境中都有一套较旧的应用来服务于客户或自动执行业务流程。即使是大规模的单体应用,通过容器隔离的增强安全性、以及可移植性特点,也能从 Docker 中获益,从而降低成本。一旦容器化之后,这些应用可以扩展额外的服务或者转变到微服务架构之上。

    2. 持续集成和持续部署 (CI/CD) 通过 Docker 加速应用管道自动化和应用部署,交付速度提高至少 13 倍。

    现代化开发流程快速、持续且具备自动执行能力,最终目标是开发出更加可靠的软件。通过持续集成 (CI) 和持续部署 (CD),每次开发人员签入代码并顺利测试之后,IT 团队都能够集成新代码。作为开发运维方法的基础,CI/CD 创造了一种实时反馈回路机制,持续地传输小型迭代更改,从而加速更改,提高质量。CI 环境通常是完全自动化的,通过 git 推送命令触发测试,测试成功时自动构建新镜像,然后推送到 Docker 镜像库。通过后续的自动化和脚本,可以将新镜像的容器部署到预演环境,从而进行进一步测试。

    3. 微服务 加速应用架构现代化进程。

    应用架构正在从采用瀑布模型开发法的单体代码库转变为独立开发和部署的松耦合服务。成千上万个这样的服务相互连接就形成了应用。Docker 允许开发人员选择最适合于每种服务的工具或技术栈,隔离服务以消除任何潜在的冲突,从而避免“地狱式的矩阵依赖”。这些容器可以独立于应用的其他服务组件,轻松地共享、部署、更新和瞬间扩展。Docker 的端到端安全功能让团队能够构建和运行最低权限的微服务模型,服务所需的资源(其他应用、涉密信息、计算资源等)会适时被创建并被访问。

    4. IT 基础设施优化 充分利用基础设施,节省资金。

    Docker 和容器有助于优化 IT 基础设施的利用率和成本。优化不仅仅是指削减成本,还能确保在适当的时间有效地使用适当的资源。容器是一种轻量级的打包和隔离应用工作负载的方法,所以 Docker 允许在同一物理或虚拟服务器上毫不冲突地运行多项工作负载。企业可以整合数据中心,将并购而来的IT资源进行整合,从而获得向云端的可迁移性,同时减少操作系统和服务器的维护工作。

    展开全文
  • 容器的实现原理

    千次阅读 2019-06-19 09:55:32
    容器的本质 容器的本质是一个进程。容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。 对于docker等大多数linux容器来说,cgroups技术是用来制造约束的主要手段,而namespace...

    容器的本质

    容器的本质是一个进程。容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。

    对于docker等大多数linux容器来说,cgroups技术是用来制造约束的主要手段,而namespace技术则是用来修改进程视图的主要方法。

    首先创建一个容器试试:

    docker run -it busybox /bin/sh
    / #
    / # ps
    PID  USER   TIME COMMAND
      1 root   0:00 /bin/sh
      10 root   0:00 ps
    

    从上面可以看到,docker里最开始执行的/bin/sh,这就是容器内部的第一号进程(pid=1),而这个容器一共只有2个进程,也就是说,docker隔离在了一个跟宿主机完全不同的世界当中。
    本来我们在宿主机上运行一个/bin/sh程序,操作系统会给它分配一个进程编号,pid=100,现在docker把这个/bin/sh程序运行在一个容器当中,使用一个“障眼法”,让它永远看不到其他的进程,让它误以为自己就是pid=1。
    这个就是linux的namespace机制。而namespace的使用方式也很简单,它实际上只是linux创建新进程的一个可选参数。我们知道,linux系统中创建线程的系统调用是clone();比如:

    int pid = clone(main_function, stack_size, SIGCHLD, NULL); 
    

    这个系统调用会为我们创建一个新的进程,并且返回它的进程号pid。而但我们调用clone创建新进程时,在参数中指定CLONE_NEWPID参数:

    int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL); 
    

    这个时候,新创建的这个进程将会“看到”一个全兴的进程空间,在这个进程空间里,它的pid就是1。

    namespace实现了容器间资源的隔离。linux使用6中namespace,分别对应6中资源:Mount, UTS, IPC, PID,Network和User。

    这些就是linux容器最基本的实现原理。docker容器听起来很玄,实际上就是在创建容器进程时,指定了这个进程所需要启动的一组namespace参数。这样,容器就只能看到当前namespace所限定的资源、文件、设备、状态和配置等。而对于主机以及其他不想管的程序,它就完全看不到了。

    为了更好的理解容器的特性,这里讨论容器的底层实现技术。
    cgroup和namespace是最重要的两种技术。cgroup实现资源限制,namespace实现资源隔离。

    cgroup

    linux操作系统通过cgroup可以设置进程使用CPU、内存和IO资源的限额。前面提到的–cpu-shares,-m,–device-write-bps实际就是在配置cgroup。
    在/sys/fs/cgroup/cpu/docker目录中,linux会为每个容器创建一个cgroup目录,以容器的长ID命名。
    在这里插入图片描述

    namespace

    namespace实现了容器间资源的隔离。
    linux使用6中namespace,分别对应6中资源:Mount, UTS, IPC, PID,Network和User。

    Mount namespace

    Mount namespace让容器看上去拥有整个文件系统。

    UTS namespace

    UTS ns让容器拥有自己的hostname。容器的hostname默认是它的短ID,可以通过-h或 --hostname参数来设置。

    IPC namespace

    IPC namespace让容器拥有自己的共享内存和信号量,实现进程间通信。

    PID namespace

    Network namespace

    让容器拥有自己独立的网卡、ip、路由等资源。

    User namespace

    让容器能够管理自己的用户,host不能看到容器中创建的用户。

    展开全文
  • java容器都有哪些?

    千次阅读 2019-09-05 12:26:42
    什么是容器? 容器是指用以容纳物料并以壳体为主的基本装置。摘自: 百度百科 java容器类类库的用途是"保存对象"。摘自: “Thinking in Java”. Java集合类是一种特别有用的工具类,可以用于存储数量不等的对象,并可以...
  • C++ 中的容器类详解

    万次阅读 2018-08-23 12:00:12
    C++中的容器类包括“顺序存储结构”和“关联存储结构”,前者包括vector,list,deque等;后者包括set,map,multiset,multimap等。若需要存储的元素数在编译器间就可以确定,可以使用数组来存储,否则,就需要用到...
  • 容器

    2020-06-06 06:42:30
    容器API 两个对象equal时,两个对象的hashcode相等 Set 没有顺序且不可以重复 HashSet 哈希表(数组+链表) List 有顺序且可以重复(两个对象直接回想的equal,...
  • 容器和虚拟机的区别

    万次阅读 2017-09-29 00:01:03
    1.容器技术简介对于容器,它首先是一个相对独立的运行环境,在这一点有点类似于虚拟机,但是不像虚拟机那样彻底。在容器内,应该最小化其对外界的影响,比如不能在容器内把宿主机上的资源全部消耗,这就是资源控制。...
  • JAVA常见容器

    万次阅读 多人点赞 2019-02-13 14:59:23
    假设上面已经有了各个容器的继承关系,我们就顺着继承关系说一下各个接口或者类的特点吧。 Iterable 接口 Iterable是一个超级接口,被Collection所继承。它只有一个方法: Iterator<T&gt...
  • docker查看全部容器命令

    万次阅读 2017-11-23 18:42:38
    docker ps -a
  • docker常规操作——启动、停止、重启容器实例

    万次阅读 多人点赞 2018-07-02 22:33:03
    前几篇我们已经掌握了docker容器实例的运行,接下来我们就来了解一下关于容器实例的 启动、停止、重启。 一、启动一个已经停止的容器实例 docker start 容器ID或容器名 1. 先查看已经暂停的容器实例信息 2. ...
  • Docker 快速删除所有容器

    万次阅读 多人点赞 2017-11-08 14:01:38
    查看运行容器docker ps查看所有容器docker ps -a1.停用全部运行中的容器:docker stop $(docker ps -q)2.删除全部容器:docker rm $(docker ps -aq)3.一条命令实现停用并删除容器:docker stop $(docker ps -q) & ...
  • docker查看容器IP地址

    万次阅读 2018-07-19 19:31:21
    docker inspect 容器名称或 id 命令:docker inspect redismaster 结果:
  • Docker删除镜像和容器

    万次阅读 多人点赞 2019-06-04 17:24:42
    删除docker中的容器可以使用如下命令: docker rm 使用如下命令可以查看当前正在运行的容器 docker ps 对于已退出的容器,可以使用如下命令进行查看: docker ps -a 例如: 查看当前正在运行的容器: ...
  • 查看docker ps 主要有些参数要说一下 ...2. -a,查看所有容器包括停止状态的容器 3. -l,查看最新创建的容器 4. -n=x,查看最后创建的x个容器 列一下docker ps的结果 CONTAINER ID IMAGE COMMAND CREATED
  • 方法一:#显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID,sudo docker ps -a|grep Exited|awk '{print $1}'#查询所有的容器,过滤出Exited状态的容器,列出容器ID,删除这些容器sudo docker rm `docker...
  • 4.docker run 容器运行

    万次阅读 2019-05-08 13:48:06
    -t:在新容器内指定一个伪终端或终端。 -i:允许你对容器内的标准输入 (STDIN) 进行交互。 就运行了一个容器,就像一个虚拟机一样,我们可以进行交互。 exit:退出容器 docker ps:查看正在运行的容器 docker ...
  • docker容器的启动与停止

    万次阅读 2018-08-09 17:31:58
    第一种:通过镜像启动一个新的容器: (1)首先执行: sudo docker ps -a 查看本地docker容器的情况: 可以看到此时本地是没有容器的! (2)然后使用本地的镜像启动一个新的容器: 先执行: sudo docker images ...
  • 如何批量删除Docker中已经停止的容器   方法一: #显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID, sudo docker ps -a|grep Exited|awk '{print $1}' #查询所有的容器,过滤出Exited状态的容器,...
1 2 3 4 5 ... 20
收藏数 1,455,360
精华内容 582,144
关键字:

容器