news banner

相信只要是IT公司一定会遇到以下情境:

情境一:

开发人员(RD):我的程式写好并打包了,麻烦帮我安装到客户的电脑。

维运人员(SE):好的,已安装完毕。

这情境当然是最好的情境,可惜现实总是残酷的…

 

情境二:

维运人员(SE):我把你给的安装包放在客户的电脑安装,怎么跑不起来。

开发人员(RD):怎么可能!在我的电脑执行没问题呀!

这情境大家一定并不陌生,有可能开发人员可能漏包程序档案,也有可能是维运人员遗漏参数设定,最惨的情境是客户的电脑做了特殊的设定让所有人白忙一场…。许多公司往往会消耗大量的人力和时间在解决开发与维运之间的鸿沟。

 

2013年,Docker的出现迅速席卷全球IT界,容器技术不只打破传统开发者的开发思维,更推翻运维人员旧有的维运模式。IT巨头Amazon、Microsoft、Google、IBM、RedHat等纷纷表示支持容器技术,Microsoft甚至承诺要让Windows能支持和Linux同一套容器标准,目前Windows 10以及Windows Server 2016已经能顺利运行Docker,Docker几乎成为容器的标准。

事实上,容器技术的出现最早可追朔至1982年的Unix系统内建的chroot机制,1998年的FreeBSD jails、2005年的OpenVZ以及2008年的LXC(Linux Container)等在操作系统内建立孤立虚拟执行环境的作法,都可称为是容器的技术。

 

传统的虚拟化技术如虚拟机(Virtual Machine)(图一)往往需要在原本执行的实体操作系统(Host Operating System)上安装一个虚拟操作系统(Guest Operating System),虚拟机利用软件仿真出CPU和内存等功能,让虚拟操作系统(Guest Operating System)以为执行在实体的机器上。

 

Virtual Machine

图一:虚拟机(Virtual Machine)

 

传统虚拟机(Virtual Machine)安全性高,虚拟操作系统(Guest Operating System)之间彼此不知道彼此的存在,若Guest OS损毁也不会波及Host OS。但相对的缺点是需要消耗非常多的系统资源,常常一个虚拟机的执行就需要占据4 GB以上的内存以及20 GB以上的硬盘空间,建立虚拟机往往也需要花费数十秒至数分钟,等待虚拟机开机的时间也是非常漫长。此外,虚拟机与Host OS之间需要透过一层Hypervisor(注一)进行沟通,Hypervisor也需要消耗相当程度的系统资源。

 

相对于传统的虚拟机,容器直接将所需的链接库、环境直接打包成容器映像档。容器透过Linux Namespaces机制(注二)建立独立的程序执行环境,同时使用Linux Cgroups(注三)技术限制每个容器能使用的系统资源,这使得容器能共享Host OS的所有资源。LXC(Linux Container)便是将这些Linux技术加以封装成为Linux容器技术的基石。容器省去了Guest OS和Hypervisor这些多余的资源消耗(图二),专注在链接库的打包,启动速度也在不需要额外的Guest OS后只需要几毫秒就可启动完毕。LXC虽然可以建立及运行容器,但由于使用门坎较高、设定麻烦,没有得到太多的市场关注。

 

Virtual MachineDocker

图二:虚拟机(Virtual Machine)与Docker容器比较

 

Docker将原有的LXC重新封装使得更简易上手,只需要一行指令便可轻松建立Docker容器环境。同时结合了映像档管理(图三),使得链接库以及系统参数在打包后可以轻松移植,不再出现任何开发环境与执行环境不一致的问题。开发环境、测试环境、维运环境都在同一个容器的环境下运行,只要执行的计算机上有安装Docker,环境就可以享有快速移植、部署的方便性。搭配Docker Hub结合云端映像档的使用,让开发者能简单的共享Docker映像档,只要透过Docker Hub,大家都可快速下载映像文件并建立应用程序的容器。方便映像档管理、分享与重用使Docker迅速席卷整个IT界,改变开发与维运之间的鸿沟。

 

Docker cn

图三:Docker的映像档管理

 

Docker自出现以来,迅速累积庞大的生态圈(图四),几乎在Linux上常用的软件几乎都支持Docker,许多为容器而生的解决方案也纷纷出现,其中以容器编排(orchestration)工具如Google的Kubernetes、Mesosphere的Mesos和Docker公司的Docker Swarm最受瞩目,开发者可透过容器编排工具轻易的部署多几环境,建立自己内部的私有云。公有云方面,各家公司如Amazon的ECS(Amazon EC2 Container Service)、Microsoft Azure的Azure Container Service、Google的GKE(Google Container Engine)等也提供了方便客户直接运行容器的功能。

 

Docker的成功在于提供了更友好的用户接口,让每个人都可以使用到容器技术所带来资源隔离、快速启动的好处,以及透过Docker Hub共享映像档,方便使用者快速建立任何应用程序环境。各大IT巨头对容器化技术的高度投入也确保了容器是IT产业无法逆转的趋势,目前各大中小企业也纷纷开始导入容器化技术,减少不必要的资源浪费,让开发到部署变得高度流畅,IT公司导入容器技术可说是势在必行。

 

Docker 2

图四:Docker生态圈

 

*注一:Hypervisor用来执行与维护Guest OS的虚拟作业平台,如VMWare、Virtual Box、KVM等,负责管理Guest OS与Host OS之间的资源共享与通讯。

*注二:Linux Namespaces机制能将Linux环境彼此隔离,目前有Mount namespaces、UTS namespaces、IPC namespaces、PID namespaces、Network namespaces、User namespaces。这技术能使每个执行的程序以为自己在独立的环境下运作而不互相干扰。

*注三:Linux Cgroups用来限制每个执行的程序能使用多少的CPU、内存、硬盘IO等资源以避免每个容器使用过多资源导致系统资源不足。

 

参照:

图一:https://www.geekwire.com/2017/review-parallels-desktop-12-mac-shows-virtual-machine-matters/

图二:https://image.slidesharecdn.com/dockerfromscratch-160208083101/95/docker-from-scratch-9-638.jpg?cb=1454920342

图三:http://note.drx.tw/2016/07/virtualization-with-docker-container-basic-for-f2e.html

图四:http://collabnix.com/archives/740

 

作者:德鸿科技 研发部 Tony