专家观点:Docker 架构优缺点大剖析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

在Docker问世后,其打包应用程式、快速部署的能耐,受到开发者的广大欢迎。在2015年,Docker进一步推出私有储存库功能Docker Registry,以及原生网路功能Docker Networking,让企业更容易自行架构Docker丛集。这些都让Docker逐渐成为正式环境的新选择。

在Docker受到一片好评下,着有《Docker源码分析》,大受到中国Docker社群好评的孙宏亮认为,Docker至少有3大缺点,还无法满足各种环境的需求。深入研究Docker原始码的他,也是中国Docker PaaS服务商DaoCloud参与第一线开发的软体工程师。

别于多数Docker开发者从应用程式面切入谈论Docker的角度,孙宏亮在2015 Container Summit上,则是选择从Docker的程式码设计架构,来剖析优缺点。

孙宏亮也指出,Container技术虽然已经发展许久,但是透过Docker独特的映像档设计,才使Container技术在近年发扬光大。

独特映像档设计让Docker爆红

Container技术最早可以追溯至1979年时推出的Unix V7,其中的chroot系统呼叫指令,透过更改程序的根目录,达到系统程序隔离的效果。而发展已经超过30年的Container技术,为何迟至2013年才因为Docker横扫全球IT业界,孙宏亮解释,因为Docker映像档的设计,使得Docker得以打破过去「程式码即应用」的观念。

传统上认为,软体开发结束后,所产出的成果即是程式码,或是能够编译执行的二元执行档。

而为了让这些程式码可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得以部署应用程式,不过,即便如此,仍然常常发生部署失败的状况。孙宏亮表示,Docker透过映像档,将作业系统核心外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。

而微软已经宣布,将在下一代的Windows Server 2016中内建Docker Engine,使得Windows Sever可以原生支援Docker。但孙宏亮也解释,目前Windows对Docker的支援,多数还是在API层。除了Windows作业系统与Linux在Kernel层差异很大外,Windows也有发展有自家的Container技术。

Docker映像档的设计,使得Docker得以打破过去「程式码即应用」的观念。透过映像档,将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。(图片来源/孙宏亮)

系统服务Docker化的障碍

虽然Docker透过了映像档设计,解决传统维运团队在部署上的问题。但是,在将系统服务Docker化、应用程式Docker化时,使用者仍然会碰到实际面的问题。

孙宏亮表示,当应用程式必须调度系统的服务,例如利用cron服务,将工作设定为自动化执行,或是执行syslog服务收集系统日志时,此时开发者就会碰到使用Docker的障碍。

例如,虽然可以使用Docker将cron服务打包,但是Docker化的cron服务,与传统Linux中cron服务间有很大的区别。孙宏亮表示,一旦将cron服务容器化后,原始的环境变数设定都会失效。所以使用者必须分析软体、Container的运行方式,才能满足使用的需求。另外,Docker与Linux Kernel的沟通能力薄弱,行程间沟通(inter-process communication,IPC)会被进行隔离。像是NFS伺服器接受客户端提出的请求后,会将需求再次传递给Linux Kernel,「使用者将这些功能容器化前,都必须再三考虑。」他表示。

并非任何应用程式都适合Docker化

而在应用程式Docker化的方面,虽然Docker的快速部署特性很吸引人,但是未必所有的应用程式都适合Docker化,像是MySQL,孙宏亮认为如果将其Docker化则存在一些弊端。例如,当使用者的资料需要进行额外备份,需要创造MySQL的资料库Container,可以透过Docker run指令,创建一个MySQL的Database Container,或是使用docker run指令,修改MySQL的环境变数。而这些环境变数会透过Docker Daemon、Docker Engine,用json的档桉格式储存在Docker Container中。

存在于Docker Container中的环境变数,对于Docker Engine并没有意义,但是对于使用Docker的用户则存在隐忧,如果被无关的第三方看见,使用者的Container可能会产生资安上疑虑。所以,孙宏亮认为,传统开发者在使用MySQL的思维,并不能无缝转移到Docker的世界中运作。

孙宏亮表示,在Docker问世后,Docker官方也宣称Docker的设计是以应用程式为中心(application-centric),希望使用者将心力集中在开发应用程式,而Docker官方也不特别鼓励使用者,将Docker视为取代VM,作为新一代运算单元的想法。他认为,当Docker用于打包网页应用程式,或是比较单纯的系统服务,可以达到很好的Docker化效果。不过,如果要将Docker的使用范围扩大,开始涉及到作业系统的基础运行层次,或是分散式系统在推动微服务时,使用Docker会产生一些问题。

共用Linux Kernel,让Docker安全性先天不足

而从技术面的角度切入,孙宏亮表示,Docker就是分配硬体资源、实现资源隔离的Container技术。而谈到资源隔离,他表示,一般人会联想到Container技术中最基本的观念,像是命名区域namespace及cgroup等技术。而Docker Container技术的火红,以前无法透过VM执行的功能,现在也可以透过Container实现。许多使用者因此也开始议论,是否可以利用Container技术取代VM。

一般的实体伺服器,只要具备Linux Kernel就可以运行Container,或是透过Hypervisor层,使用Linux Kernel上运作的虚拟机,运行Container。孙宏亮认为,以这样的角度看待,Linux Kernel是运作Container,所需满足的最重要条件,而无论是实体伺服器或是VM,都能达到上述的条件。不过,Container在实体机上运作,可以达到媲美裸机的效能,而在VM中运作时,则会产生效能折损。

而谈到Container的资源隔离,孙宏亮表示,一般使用者最直觉想到的不外乎是CPU、记忆体以及IO等运算资源。而他认为,「资源」的范畴应该不只如此。虽然Container可以透过cgroup、namespace做到运算资源的隔离,但是,「如果没有Linux Kernel,使用者也不可能运作Container。」他表示,如果将Linux Kernel也纳入资源的范畴,因为Container与作业系统同时共用Kernel,所以其实并没有实现资源隔离。但是,VM与VM之间,并不会共用作业系统核心。因此,VM的资源隔离性一定会比Container来得更好。

虽然Docker Container也会受到资源的隔离、控制,以及权限控制,但是由于跟Linux共用作业系统核心,进而会产生安全上的漏洞。为了解决这样的问题,孙宏亮表示,可以透过Linux的capability机制,加强权限的控管,使Container内部的root跟外部的root权限产生差异外,同时也让Container在系统管理的能力,与宿主主机进行区隔,藉此解决Container的安全问题。

在去年推出的Docker 1.9.0当中,Docker也加入了username space机制,孙宏亮表示,在安全性方面,这是Docker所达成的一个里程碑。只要透过namespace,让Container运作的时候,使用者可以拥有更多权限,同时也不会影响到宿主主机。


本文转自d1net(转载)

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
存储 Ubuntu Linux
Docker容器简介、优缺点与安装
Docker容器简介、优缺点与安装
|
Java Docker 容器
《阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库》电子版地址
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库
209 0
《阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库》电子版地址
|
数据库 Docker 容器
Docker的优缺点有哪些?
对比一下,同样要安装运行一个软件,用Docker和不用Docker的差异: 下载安装: Docker:pull一个image下来就可以了。 包管理:用发行版自带命令,直接apt-get或者yum install。但很多时候,需要同时下载安装依赖的库,不过发行版的包管理系统通常会帮你搞定——前提是不要跟你现在的包发生冲突,否则有你搞的。 源码编译:发行版仓库里面的有可能版本有点老,你需要用最新版的功能。怎么办?去官网/Github下载源码,编译安装——等等,不要说的那么轻巧,你有对应的编译环境么?没有的话要先安装配置好编译环境。你知道用什么命令什么参数编译么?你装好编译依赖的底层库了么?
196 0
|
NoSQL Java Docker
【直播回顾】阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库
Docker大规模集群快速部署Java应用,需要构建Docker镜像。 本次课程详细介绍如何制作Java Docker镜像,解析DockerFile核心参数,把Docker镜像推送到DockerHub和阿里云Docker仓库,以及安全保护机制。
7145 0
|
XML 数据格式 Docker
在 Windows 内核上运行 Docker 靠谱吗?专家六问六答帮你解惑!
上周三,我们为大家带来了新一期的网络研讨会。现场我们从观众那里得到了一些非常棒的问题,但是由于时间有限我们并没有在会上一一回答所有的问题。今天我将在这里为大家总结6个具有代表性的问题,供大家学习参考。
4578 0
|
Kubernetes Linux Docker
Windows 容器基础知识扫盲问答,权威 Docker 专家为您扫清认知障碍!
今天,我们将解答有关运行 Windows 容器的相关问题。
3034 0
|
Kubernetes Linux 虚拟化
《Docker容器:利用Kubernetes、Flannel、Cockpit和Atomic构建和部署》——第1章 使用Docker对应用进行容器化 1.1了解容器化应用的优缺点
本书不仅介绍什么是Docker以及Docker的工作方式,还揭示了特定用途下扩展Docker的若干方法。尽管一个容器的创建和部署是很简单的,但要让多个容器协同工作、访问其他容器的资源,以及访问运行容器的宿主机的资源,则需要更高的复杂性。本书给出了几种创建和部署这些复杂容器集的不同方法。
2528 0
|
新零售 供应链 安全
专访阿里云资深专家易立,Docker技术将改变现代软件供应链
4月26日的云栖大会·南京峰会上,阿里云资深专家汤子楠发布了飞天专有云敏捷版(Apsara Stack Agility),此前美国Docker公司首席执行官Ben Golub 在曾在DockerCon 2017上宣布过这个消息。
2542 0
|
4天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略