当前位置: 首页 > 科技观察

Docker架构的优缺点分析

时间:2023-03-13 18:05:52 科技观察

Docker出现后,其对应用程序进行打包和快速部署的能力受到了开发者的欢迎。2015年,Docker进一步推出了私有仓库功能DockerRegistry,以及原生网络功能DockerNetworking,让企业更容易搭建自己的Docker集群。这些都让Docker逐渐成为正式环境的新选择。在Docker的喝彩声中,被中国Docker社区推崇的《Docker源码分析》作者孙洪亮认为,Docker至少存在三大缺点,不能满足各种环境的需求。深入研究Docker源码,也是参与中国DockerPaaS服务商DaoCloud一线开发的软件工程师。与大多数Docker开发者从应用程序的角度谈论Docker不同,孙红良选择在2015年容器峰会上分析Docker代码设计架构的优缺点。孙洪亮还指出,虽然Container技术发展了很长时间,但正是通过Docker独特的镜像文件设计,Container技术在近几年才得以蓬勃发展。独特的镜像文件设计让Docker大受欢迎。容器技术最早可以追溯到1979年推出的UnixV7,其中的chroot系统调用命令通过改变程序的根目录来达到系统程序隔离的效果。至于发展了30多年的容器技术,为什么直到2013年Docker才席卷全球IT行业?孙红良解释说,因为Docker镜像文件的设计,Docker才得以打破以往“代码即应用”的观念。传统上认为,软件开发完成后,输出的是程序代码,或者是可以编译执行的二进制可执行文件。为了让这些代码能够顺利执行,开发团队还必须准备完整的部署文件,以便维护团队部署应用程序。然而,即便如此,还是经常出现部署失败的情况。孙红良表示,Docker通过镜像文件,将应用程序运行所需的系统环境自下而上地封装在操作系统核心之外,实现应用程序的无缝跨平台运行。并且微软已经宣布将在下一代WindowsServer2016中内置DockerEngine,让WindowsServer原生支持Docker。不过,孙洪亮也解释说,目前Windows对Docker的支持,大部分还停留在API层。Windows操作系统和Linux除了在Kernel层有很大的区别外,Windows还开发了自己的Container技术。Docker镜像文件的设计使Docker打破了以往“代码即应用”的观念。通过镜像文件,排除操作系统核心,自下而上封装运行应用程序所需的系统环境,实现跨平台应用程序的无缝运行。(图片来源/孙红亮)系统服务Docker化的壁垒虽然Docker通过镜像文件设计解决了传统维护团队的部署问题。但是,用户在对系统服务和应用进行docker化时,还是会遇到一些实际问题。孙洪良表示,当应用必须调度系统服务时,比如使用cron服务设置作业自动执行,或者执行syslog服务收集系统日志,开发者在使用Docker时就会遇到障碍。例如,虽然可以使用Docker来封装cron服务,但是Docker化的cron服务和传统Linux中的cron服务有很大的区别。孙红良表示,一旦cron服务容器化,原来的环境变量设置就会失效。因此,用户必须分析软件和Container的运行方式以满足使用需求。另外,Docker与LinuxKernel的通信能力较弱,进程间通信(IPC)会被隔离。例如,NFS服务器接受客户端的请求后,会再次将请求传递给LinuxKernel。“用户在将这些功能容器化之前必须三思,”他说。并非所有应用程序都适合Dockerization。在应用Docker化方面,虽然Docker的快速部署特性非常吸引人,但并不是所有的应用都适合Docker化,比如MySQL。孙红良认为,如果是Dockerized的话,会存在一些弊端。例如,当用户数据需要额外备份,需要创建MySQL数据库容器时,可以通过dockerrun命令创建MySQL数据库容器,也可以通过dockerrun命令修改MySQL环境变量。这些环境变量会通过DockerDaemon和DockerEngine以json文件格式存储在DockerContainer中。DockerContainer中的环境变量对于DockerEngine来说是没有意义的,但是对于使用Docker的用户来说却有隐忧。如果被无关的第三方看到,用户的Container可能会存在信息安全问题。因此,孙洪良认为,传统开发者使用MySQL的思维,无法无缝转移到Docker世界。孙宏亮表示,在Docker问世之后,Docker官方也宣称Docker的设计是以应用为中心(application-centric),希望用户专注于开发应用,而Docker官方并没有特别鼓励用户使用Docker呢被视为取代VM成为新一代计算单元的思想。他认为,当使用Docker来打包Web应用或者比较简单的系统服务时,可以达到很好的Docker化效果。但是,如果要扩大Docker的使用范围,开始涉及到操作系统的基础运行层面,或者分布式系统推广微服务的时候,使用Docker就会出现一些问题。共享LinuxKernel使得Docker在安全性上先天不足。从技术角度来看,孙红良表示,Docker是一种Container技术,分配硬件资源,实现资源隔离。说到资源隔离,他说大多数人会想到Container技术中最基本的概念,比如namespace、cgroup。随着DockerContainer技术的普及,以前不能通过VM实现的功能现在可以通过Container来实现。因此,很多用户开始讨论是否可以使用Container技术来替代VM。一般的物理服务器只要有LinuxKernel就可以运行Container,或者使用运行在LinuxKernel上的虚拟机通过Hypervisor层来运行Container。孙红良认为,从这个角度来看,LinuxKernel是Container运行最重要的条件,无论是物理服务器还是VM,都可以满足以上条件。但是,当Container运行在物理机上时,可以达到与裸机相当的性能,但是当运行在VM上时,性能就会受到影响。谈到Container的资源隔离,孙红良表示,普通用户最直观的想法无非就是CPU、内存、IO等计算资源。在他看来,“资源”的范围应该不止于此。虽然容器可以通过cgroups和命名空间来隔离计算资源,但“没有LinuxKernel,用户就无法操作容器”。同时,Kernel是共享的,所以实际上并没有实现资源隔离。但是,操作系统核心不在VM之间共享。所以VM的资源隔离肯定会比Container好。虽然DockerContainer也会受到资源隔离、控制、权限控制,但是由于与Linux共享操作系统核心,所以会存在安全漏洞。为了解决这个问题,孙宏亮表示,可以利用Linux能力机制来加强权限的控制,让Container内部的root权限与容器外的root权限不同,同时,容器管理系统的能力不同于宿主机。Segmentation就是用来解决Container的安全问题的。在去年推出的Docker1.9.0中,Docker也加入了用户名空间机制。孙红良表示,在安全方面,这是Docker实现的一个里程碑。只要通过命名空间操作容器,在不影响宿主机的情况下,用户可以获得更多的权限。