容器技术的理解

1容器概述及原理

软件开发中使用的虚拟化技术一直以来都是硬件抽象级别的hypervisor技术,其能够支持在一台计算机上运行虚拟的操作系统,与宿主机进行隔离,最大程度的提供了虚拟化管理的灵活程度。但是,随着软件开发的繁复性增加,基于hypervisor的虚拟环境技术的弊端也越来越明显,对于每一个虚拟机都要安装一个操作系统和不必要的程序。而在软件开发的过程中,更关注的是应用本身,过度把精力用于配置依赖环境,使得开发效率低下。为了解决这个问题,容器技术就诞生了,实现了“构建一次,在各平台上运行” 。
1.1概述
容器技术(Linux Container即LXC)是一种是一种内核轻量级的操作系统层虚拟化技术,使用Linux的Namespace进行资源的隔离,Cgroups进行资源的管理。有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。
1.2原理
LXC使用的主要核心技术特性:
Kernel namespaces (ipc, uts, mount, pid, network and user)
Apparmor and SELinux profiles
Seccomp policies
Chroots (using pivot_root)
Kernel capabilities
CGroups (control groups)
1.2.1 Kernel namespaces
Nameapaces是Linux中的一种概念,允许进程修改操作系统的其他资源并且对于未在同一命名空间的进程不可见。通过pid、net、ipc、mnt、uts 等命名空间将容器的进程、网络、消息、文件系统和hostname 隔离开。使得容器中的进程看起来就像爱一个独立环境中运行一样。
1.2.2 Apparmor and SELinux profiles
AppArmor和SELinux都是Linux内核的安全模块。AppArmor允许系统管理员将每个程序与一个安全配置文件关联,从而限制程序的功能,通过它可以指定程序可以读、写或运行哪些文件,是否可以打开网络端口等。
1.2.3 Seccomp policies
在Linux系统里,大量的系统调用(systemcall)直接暴露给用户态程序。但是,并不是所有的系统调用都被需要,而且不安全的代码滥用系统调用会对系统造成安全威胁。通过seccomp,能够限制程序使用某些系统调用,这样可以减少系统的暴露面,同时是程序进入一种“安全”的状态。
1.2.4 Chroots (using pivot_root)
pivot_root的功能主要是把整个系统切换到一个新的root目录,而移除对之前root文件系统的依赖,这样就能够umount原先的root文件系统。
1.2.5 Cgroups
提供了对一组进程及将来的子进程的资源的限制,控制和统计的能力,这些资源包括CPU,内存,存储,网络等。通过Cgroups,可以方便的限制某个进程的资源占用,并且可以实时的监控进程的监控和统计信息。
1.3 与传统虚拟化技术的对比
传统虚拟化技术是一种基于硬件的抽象,宿主机上配置一台虚拟机,等于购买了一台新的计算机。静态分配硬件资源,无法实现硬件资源的最大化。特别是在进行集群开发的时候,服务器需要配置到多个机器上,每个机器的配置都要一步步的完成。而进行更新后,也要一台台的更新,而系统的配置是程序开发人员、测试人员和运维人员都需要完成的工作。工作量大且复杂,还会因为操作系统其他底层配置的不同而可能出现未知的问题。
容器技术则是基于操作系统的抽象,只对操作系统必要的接口、配置文件进行虚拟化,够构造了一种轻量的虚拟环境。极大地增加了配置效率。动态分配硬件资源,提高了资源利用率。但是由于其只对必要的配置文件进行虚拟化,所以无法实现在linux上运行windows系统。而hypervisor则没有这个限制。同时由于hypervisor是基于硬件的抽象,所以对于应用的隔离性更强,更加安全。

              虚拟机技术	            容器技术
  硬件资源分配	   静态          	动态
  启动时间	        慢	            快
  配置	           复杂              简单
 安全性	            高             	低
 集群数量	     几十个	            几百个

1.4 LXC安装容器
基于ubuntu18.04环境,安装一个 lxc容器。首先安装lxc容器服务:
sudo apt install lxc
检查核心是否能够支持lxc:
lxc-checkconfig
安装LXC工具,LXC的自动创建默认网桥接口lxcbr0,创建容器时,容器自动接入网桥。查看网桥:
ifconfig lxcbr0
下载能够创建容器的模板:
apt-get install lxc-templates
创建一个fedora的容器并且命名为myfedora:
lxc-create -n myfedora -t fedora
容器创建完成后可以看到默认的登录界面,然后在fedora系统中进行操作。也可以退出虚拟系统对容器进行管理,这里不进行赘述。

2 docker技术

虽然容器技术极大地方便了程序运行的环境配置,但由于容器技术操作、配置和使用具有一定的难度,也很难实现配置的迁移部署。所以起初虽然容器技术已经存在,并没有受到企业和软件开发人员广泛的关注。
基于容器管理技术简化了容器管理和操作,使得容器被大范围的应用成为了可能。而云计算技术和微服务的发展,使人们认识到容器在云计算领域和微服务独特的作用,容器受到了越来越多企业的青睐。其中Docker是最流行的容器管理服务。Docker起源于dotCloud 公司,dotCloud 的创始人在 LXC 的基础上,对容器技术进行了简化和标准化,命名其为 Docker。旨在解决各种应用程序的运行环境的部署和发布问题。
2.1 docker 概述
Docker是一个能够把开发的应用程序自动部署到容器的容器管理技术。提供一个轻量快速的环境,能够十分简单的把开发者的环境快速部署到测试环境和生产环境。加强了开发环境和测试、生产环境的一致性,避免了因为环境配置而产生的各种问题,大大缩短了软件开发周期,并且使应用程序具有高度可移植性。
2.2 docker原理
Docker底层的核心技术和实现原理是LXC,也就是namespace和cgoups。但在lxc之上添加了自有的核心组件:客户端和服务器,镜像机制,registry库和docker容器。Docker搭建一个应用环境的步骤:通过客户端和服务器进行管理,使用命令,在公有镜像库或者私有镜像库中拉取镜像,构建容器,在容器即可运行应用程序和服务。
2.2.1Docker服务器
Docker是一个客户-服务器架构的程序,docker客户端可以向服务器发送请求,服务器完成工作返回结果。
2.2.2docker镜像
镜像是用来创建容器的。docker镜像由文件系统叠加而成。第一层是引导文件系统rootfs,第二层是root文件系统rootfs。这个root文件系统永远只能是只读状态。Docker还利用联合加载技术,在root文件系统上加入更多的用于软件开发的镜像。当使用docker命令创建一个容器的时候,docker会在镜像的最上层添加一个读写文件系统 。
想要对下层的文件进行读写操作时,会把下层的文件复制到读写系统,在进行修改,即当文件系统发生变化时,都会作用在这个文件系统上,底层的只读文件系统则不发生变化。这种机制被称为写时复制,是docker的强大的技术支持之一。通过这种机制我们可以快速构建一个自己的镜像,并运行包含自己的应用程序和服务的容器。
2.2.3docker registry
Docker 使用Registry用来存储和管理用戶私有的镜像。进行开发时,可以对私有镜像进行保密,或者只在自己团队的内部可见。而且私有的registry还可以受到防火墙的保护。

3 对于软件开发的应用

3.1搭建环境
开发人员在开发的时候有一套配置好的开发环境。当开发完成后,开发人员会把代码打包发送运维人员到生产上部署。运维人员就需要搭建一个和开发环境一样的生产环境,过程非常的繁琐。搭建完成后还是可能因为两个环境细微的不同都有可能导致应用程序的部署失败。 在这样的部署模式下,如果想要实现集群服务,那么就有非常多的服务器要进行配置,需要在每一台服务器上进行相当复杂的操作。增大了运维人员的工作量。
Docker的出现颠覆了这种传统的模式。开发者在docker中进行开发,之后只需要把整个开发环境打包成一个镜像传给运维团队,运维团队就可以直接运行应用程序,不需要多余的配置。Docker镜像包含了所有的环境依赖关系,保证了开发与生产环境一致,对于开发和运维工作,Docker技术可以避免开发和运维工作上的互相推脱。
3.2应用于微服务
微服务是当下一个十分流行的概念,就是把应用程序的功能分成具体的一个个服务,每个服务高内聚,低耦合,互不影响。
与之相对就是传统软件开发的单块架构,单块架构一个应用中包含多个业务,它有一些十分明显的弊端:
第一,随着业务的增长,这个单块会越来越大,变得很复杂,启动的时间也会越来越长;
第二,如果其中某一个业务模块异常将会影响所有其他的业务模块,造成整个业务系统瘫痪;
有些功能业务压力大,有些功能业务压力小,因为捆绑在一起,都只能一起增加或减少,这样就会造成资源的浪费
微服务架构和容器技术的结合就可以很好的解决这三个问题,把功能按模块运行在不同的容器里,相互不影响,各用各的资源,可以根据实现的业务压力而来启动相应的实例数。
Docker能够实现一个Docker容器装载一个场景功能,让每个Docker中运行一个微服务,顺利实现微服务概念的现实转化。
3.3应用于持续集成和持续部署
持续集成就是指软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的类生产环境中。
持续部署是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。
持续集成和持续部署可以大大增加软件的开发效率。 Docker的在安全、可重复的环境中可移植性,跨平台的快速部署软件的方式都比较方便做持续集成和持续部署。
虚拟化让集群的管理和控制部署都更方便
现在大多都利用docker和jjenkins 联合的方法进行持续集成。
3.4传统IT诉求的演进
随着资源利用率,设备可维护性等问题的解决,人们对于资源的关注从基础iaas层开始向上发展,特别是微服务等概念的提出,大家都从一个大而全的应用演变成希望一个应用就只完成某个特定的功能,,更希望今天我们的开发是开箱即得,按需索取,并且 "build once,run everywhere,彻底解决应用的部署,分发,可用性,可运维性,监控等问题运维等问题,特别是线上线下的兼容性,我相信很多开发都遇到测试环境调通一到线上就挂的囧境,为什么—环境不一致导致,今天容器又天然就和微服务的理念是match的。
DevOps最佳实践
运维这个职位是个吃力不讨好的高危行业,干对了你是应该了,干错了第一个责任人就是你,运维本身不像研发没有实际产出,不出问题的时候大家不会感觉到你的存在,所以作为运维的职业如何在公司快速发展的业务过程中找到自我价值和定位是很多运维人在探索的方向,google最早对运维进行了重新定义,提出SRE的概念,并且结合devops在实际工作中的落地,取得了很好的效果,阿里在这条路上也进行了探索,并且觉得docker是最佳的落地方式,今天阿里也在做大规模的docker化,今天做docker化是为了解决我们环境不一致问题,提升我们的开发和发布效率,在阿里内部,docker和虚拟化根据各自处理场景的不通相互融合的非常好。
最底层的ECS服务可以是多种介质的异构,传统的kvm,最新的神龙裸金属服务器,GPU,FPA方案,上层可以直接对用户提供VM,也可以是容器,所以的容器服务都基于ECS来构建,最顶层的业务平台根据自身需求可以通过k8来进行容器的定义也可以通过paas平台直接调用api进行虚拟资源的弹性伸缩。
对性能的要求
传统部署在物理机上的高IO业务有服务化需求之后自然想到的就是docker+物理机,例如数据库服务,在未经优化的情况下,在虚拟机化上跑I/O业务性能将受损失。经过可靠的测试虚拟化对于物理硬件的损耗在优化的情况下也要有5%左右。
未来大部分业务系统将会变成虚拟机+Docker形式的组合,操作系统和Docker本身采用虚拟机镜像方式部署,软件、业务依赖组件,业务定义等与业务相关属性采用容器镜像,既实现安全隔离有提升资源的高利用率。

4在软件开发中应用前景分析

容器技术在软件开发中具有轻量级、提高开发效率的优势,但其就安全性,隔离性相对与传统虚拟机较差。总的来说,容器技术还不成熟。而如今的serverless概念也对虚拟化技术提出了挑战。
在软件开发的过程中,常常容器是一种常常被称为操作系统虚拟化。
docker是一种轻量级的容器虚拟化技术,相对于我们熟悉的vm,更加轻便,启动速度更快。
使用虚拟机的时候,我们的计算机内存负荷往往很大,因为相当于我们在一台计算机的硬件上同时启动了两个系统。假如你在windows下通过VMmare安装了一个linux的虚拟机,如果电脑配置不够好的话,运行虚拟机的时候,就会发现windows环境下,你运行一两个网页,或者一两个程序就会很卡。同时一个电脑上打开两个虚拟机几乎是不可能的事情,这种虚拟化产品提供了虚拟的硬件。
对于docker来说就不会有这种问题,docker只虚拟必要的运行环境,能够实现对硬件资源的充分利用。但因此,它只能运行与底层主机相似的系统。所以说,局限性很大。
尽管有一些局限,但在超大规模的多租户服务部署、轻量级沙盒、对安全要求不太高的环境中,容器技术仍然十分流行。

参考资料:
—[1] 杨 保 华 , 戴 王 剑 , 曹 亚 仑 .Docker 技 术入 门 与 实 战 [M]. 北 京 : 机 械 工 业 出 版
社 ,2015:1-15.
[2] 高礼 , 高昕 .Docker 技术在软件开发过程中的应用研究 [J]. 软件 ,2016,37(03):110-113.

你可能感兴趣的:(记录)