云舒网络:容器系列二:容器的视角-设计交付和架构

前言:

我们要使用容器,自然就不能回避容器的设计生成过程,而生成之后就涉及到加载运行和管理,那么今天我们就从设计交付和架构这两个角度来说一下容器。

注:本期分享由代豪原创,云舒网络整理发布。

上篇的《容器起源》说了容器是什么,那么这次我们从两个视角谈谈容器。我们要使用容器,自然就不能回避容器的设计生成过程,而生成之后就涉及到加载运行和管理,那么今天我们就从设计交付和架构这两个角度来说一下容器。(注:由于目前容器中Docker应用比较广泛,以下内容中的容器默认为Docker。)

一.     设计交付运行角度

简述

Docker Image的设计者按Dockerfile的语法规则进行Docker Image的设计描述,描述完成后通过build命令生成Docker Image; 交付测试者时,测试者只需基于Docker Image进行加载测试即可。

使用过程

我们看容器的好处很多,那么使用容器的过程是怎样的呢?

首先,不能回避的是容器的设计,也就是用户用自己的需要设计容器。这里我们先看看传统的编译型语言的使用过程,一个程序员先写好代码,然后通过编译器把代码编译成机器指令,并按一定的系统规则组织起来形成执行文件(如Windows里的exe文件),然后交付给测试者,测试者测试完成通过后交付给使用者,使用者直接执行这个文件,而不用关心代码的设计编译和测试过程。

对应容器而言,也有个设计编译和测试使用过程;在容器设计过程有一个叫Dockerfile的东西,这个文件就相当于用户Docker的设计,在Dockerfile完成后build命令可以理解为编译过程,实际上就是通过Dockerfile的描述生成Docker镜像Image,然后把镜像交付给测试者,测试者测试通过后把镜像提交给使用者。其对应的阶段表格为:

阶段 开发 交付 运行
容器的形式 Dockerfile Docker Container
描述文件 Image 动态进程
镜像文件
执行的命令 build run,commit top,start,restart

上述表格可以理解为通过描述文件Dockerfile生成了镜像文件Docker Image,加载Docker Image运行就形成了动态进程容器Container。 一旦加载执行起来,容器进程的行为就需要跟Linux 内核进行交互了。容器进程基于Linux内核的支持,那么把这个因素考虑进去后我们可以把图画成这样。

从图上看到Container进程通过Libcontainer来进行跟Linux内核的交互,由于新版本的Docker不支持LXC了,因此只列了Libcontainer。Container执行需要Linux内核的支持,这里为简单起见只说一下两个基础的功能,空间的隔离和资源的限制。

1.)空间隔离

空间的隔离就是用了Linux 的Namespaces,也就是名字空间,这个功能的基本作用就是隔离,比如两个用户u1和u2,在不同的Namespace下运行是互相不可见的,一个具体的例子是u1的进程PID和u2的进程PID可以是相同的,如果是常规进程,那么同一个OS下两个进程PID是不相同的。

2.)资源限制

资源的限制用了Linux内核的Cgroups,这个功能是用来限制每个容器进程对资源使用量的,比如CPU,内存,IO等,这样避免一个容器进程占用资源过大而使其它资源进程受到影响。

有了Namespaces和Cgroups这两个非常基础的重要功能,空间的隔离使各个容器进程有了接近虚拟机的独立性,资源的限制使各个容器进程有了运行资源的”平等性”,这样基于容器的应用就具备了接近虚拟机的一些节本特性,同时看到容器实际上是强依赖Linux内核功能的,这一点上跟虚拟机大家各自的OS或内核独立又很大的不同,比如说内核的Bug和漏洞都会影响到各个容器进程,这些需要篇幅,这里就先不展开了。

这里看到容器进程的运行是依赖Linux内核的,那么这里就不能回避操作系统了,那么问题就来了:用什么样的操作系统来支持容器的运行?CentOS,Ubuntu是现在大家常用的,这里提一下CoreOS和Rancher OS,这两系统非常合适容器的支撑。为什么这么说呢?

我们已经知道容器共享内核的运行环境,这个操作系统有了基本的内核功能就可以了,实际上相对操作系统而言可以做得非常小,当然也可以自己拿通用的操作系统进行裁减,但并不是最优的方案,之所以提到CoreOS和Rancher OS,这两个OS不但体积小(Rancher OS 29兆左右,CoreOS 200多兆),而且针对容器的支持做了很多调整。比如Rancher OS,里面进程皆容器,System Docker 起了系统运行的各种必备功能,然后起了User Docker(Container)。 所以,CoreOS和Rancher OS可以认为是为容器而生的。

一.    Docker 架构

现在我们从另一个角度看一下容器:对于Docker的运行,是一个典型的客户机服务器C/S模型或架构,如下面的图:

图里列了三个常用的基本命令:build(建镜像),pull(从仓库拉镜像),run(运行Docker),不同的颜色代表了不同的命令执行的流程。我们看到所有的client命令都提交给了Docker Daemon, Docker Daemon 负责镜像(Image), 容器进程(Container),仓库(Registry)的协调和管理,Docker Daemon 里有Docker Engine和Docker Job的概念。 对于深入理解Docker Daemon,建议看一下Docker的Golang源代码,想省时间可以从MainDaemon或NewDaemon看起。

上述角度都是基于单个节点上的Docker(container)而言的,当有多个主机上运行Docker时,多节点上的Docker管理和协调就需要新的工具了,也可以理解为Docker集群的管理,有Swarm,Rancher,Kunbernets等,这里先不展开了。好的,今天的分享就暂告一个段落了,后续内容请继续关注!

__________________________________________________________________________________

 

温馨提示:

云舒网络携手Rancher Labs推出【Rancher | 实战群】,在线为您分享Docker技术干货,更有往期回顾精选期刊等你拿!

本群汇集了Rancher中国最强技术精英团队及业内技术派高人,宗旨是为了大家拥有更专业的平台交流Rancher实战技术,实时与Rancher创始团队面对面!同时欢迎各位分享自己的经验、疑难问题,我们将定期邀请分享嘉宾做各类话题分享及回顾,共同实践研究Docker容器生态圈。

对Rancher和Docker技术感兴趣、或对本文中细节需继续探讨的朋友,欢迎加入本群参与讨论!

加群方法:

1.关注【云舒网络】公众号

2.留言”我要加群”

QQ群号:216521218

时间: 2024-10-12 08:51:11

云舒网络:容器系列二:容器的视角-设计交付和架构的相关文章

云舒网络译:Rancher1.0正式版公布

编者注: Rancher Labs是一家容器技术基础设施提供商,总部位于美国硅谷,Rancher是一个高效易用的企业容器云平台. 云舒网络 http://www.cloudsoar.com/为Rancher Labs的战略合作伙伴及中国最强技术实施服务团队,在硅谷.中国.东南亚均设有研发和运营中心. 注:下面内容由云舒网络首家授权翻译.转载请注明出处! 原文链接: http://rancher.com/announcing-rancher-1-0-ga/ 中文版:http://www.cloud

云舒网络译:Rancher1.0正式版发布

编者注: Rancher Labs是一家容器技术基础设施提供商,总部位于美国硅谷,Rancher是一个高效易用的企业容器云平台. 云舒网络 http://www.cloudsoar.com/为Rancher Labs的战略合作伙伴及中国最强技术实施服务团队,在硅谷.中国.东南亚均设有研发和运营中心. 注:以下内容由云舒网络首家授权翻译,转载请注明出处! 原文链接: http://rancher.com/announcing-rancher-1-0-ga/ 中文版:http://www.cloud

Storm系列二: Storm拓扑设计

Storm系列二: Storm拓扑设计 在本篇中,我们就来根据一个案例,看看如何去设计一个拓扑, 如何分解问题以适应Storm架构,同时对Storm拓扑内部的并行机制会有一个基本的了解. 本章代码都在: [email protected]:zyzdisciple/storm_study.git 项目下的 user_behavior包下. 问题案例 有这样一种场景,在前端存在会话,我们会不断收到来自前端的消息,消息包含消息的发送时间,消息内容,结束标识, 消息的发送者, SessionId等其他信

【网络基础系列二】BOOTP、DHCP协议

BOOTP 含义:BOOT Protocol,引导协议 作用:引导无盘计算机或者第一次启动的计算机获取以下网络配置信息: 主机的IP地址.子网掩码 路由器(网关)的IP地址 DNS服务器IP地址 C/S协议: Client:UDP 68端口 Server:UDP 67端口 静态配置协议: 含义:BOOTP Server上预设了BOOTP Client的物理地址与IP地址的绑定. 注意:“静态”的含义并非是指获取方式的静态性,而是指BOOTP Client的物理地址和IP地址的绑定关系是初始化的时

【Qt编程】基于Qt的词典开发系列<二>--本地词典的设计

我设计的词典不仅可以实现在线查单词,而且一个重大特色就是具有丰富的本地词典库:我默认加入了八个类型的词典,如下所示: 由于是本人是通信专业,因此加入了华为通信词典.电子工程词典,又由于我喜爱编程,也加入了c语言基本函数词典.下面介绍如何设计本地词典: 词典类型的选择 当然是txt格式的最好了,因为我们可以用程序直接进行读取.可是网上词典一般都是用mdx格式.ld2格式的,我无法用Qt来直接读取.最终,经过不断摸索,网上查找,发现我们可以将mdx格式的词典通过软件转化为txt格式的! mdx词典的

跟着刚哥学习Spring框架--Spring容器(二)

Spring容器 启动Spring容器(实例化容器) -- IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化(加载启动),这样才可以从容器中获取Bean的实例并使用.  Bean是Spring管理的基本单位,任何的Java对象和组件都被当成Bean处理,容器还负责管理Bean与Bean之间的依赖关系.  两种类型的启动实现   1.BeanFactory:IOC容器的基本实现,是Spring框架的基础设施,面向Spring本身: -- Spring容器最基本的接口就是BeanF

零元学Expression Blend 4 - Chapter 8 用实例了解布局容器系列-「Grid」

原文:零元学Expression Blend 4 - Chapter 8 用实例了解布局容器系列-「Grid」 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的是Blend 4 里的布局容器大哥-「Grid」. ? 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的是Blend 4 里的布局容器大哥-「Grid」. ? ? ? 就是要让不会的新手都看的懂! ? ? ? <实至名归的容器大哥> Blend 4内的容器有很多种,比较常运用到的除了有Grid.Can

docker (2)---存储、网络(利用docker容器上线静态网站)

一.docker底层依赖的核心技术 1.命名空间 (Namespaces) 2.控制组 (Control Groups) 3.联合文件系统 (Union File System) 4.Linux 虚拟网络支持:本地和容器内创建虚拟接口 (1) 命名空间(Namespaces): 实现了容器间资源的隔离,每个容器拥有自己独立的命名空间 , 运行其中的应用就像是运行在独立的操作系统中一样 , 我们都可以看到文件系统,网卡等资源保证了容器之间互不影响,namesaces管理进程号 , 每个进程命名空间

实时音视频互动系列(上):又拍云UTUN网络详解

如何定义实时音视频互动, 延迟 400ms 内才能无异步感 实时音视频互动如果存在1秒左右的延时会给交流者带来异步感,必须将视频播放延迟限制在400ms以内,才能给用户较好的交互体验. 当延迟控制在400ms以内时,两个人音视频互动是实时的,不会有异步感存在,即实时音视频互动. 实时音视频互动产生延迟的原因 音视频互动的延迟是如何产生的? 我们先假设这样一个场景:位于北京的A客户端与位于广州的B客户端进行实时音视频互动. 该场景会有以下几个产生延迟的原因: 光的传输耗时 30ms: 网络处理耗时