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

面试题|Docker的优缺点

时间:2023-03-21 22:36:00 科技观察

Docker解决问题:由于不同的机器有不同的操作系统,以及不同的库和组件,将一个应用程序部署到多台机器上需要进行大量的环境配置操作。Docker主要解决环境配置问题。它是一种隔离进程的虚拟化技术。隔离进程独立于主机操作系统和其他隔离进程。使用Docker,您可以将现有的应用程序部署到其他机器上,而无需修改应用程序代码,也不需要开发人员学习特定环境下的技术。与虚拟机的对比:虚拟机也是一种虚拟化技术。它和Docker最大的区别在于它是通过模拟硬件,在硬件上安装操作系统来实现的。启动速度启动虚拟机需要先启动虚拟机的操作系统,然后再启动应用程序。这个过程很慢;而启动Docker就相当于在宿主操作系统上启动了一个进程。占用资源虚拟机是一个完整的操作系统,需要大量的磁盘、内存和CPU资源。一台机器只能开几十个虚拟机。而Docker只是一个只需要打包应用程序和相关组件的进程,在运行时占用的资源非常少。一台机器可以启动上千个Docker。镜像和容器:镜像是一个静态结构,可以看作是一个面向对象的类,容器是镜像的一个实例。该镜像包含容器运行所需的代码和其他组件。它是一个分层结构,每一层都是只读的(read-onlylayers)。构建镜像时,会一层层构建,上一层是下一层的基础。图片的这种分层存储结构非常适合图片的复用和定制。在构建容器时,会在镜像的基础上增加一个可写层(writablelayer),用于保存容器运行过程中的修改。优点和缺点:1.易于部署。你一定还有印象。在我们刚开始学习编程的时候,搭建环境这一步往往要花费我们几个小时的时间,其中一个小问题可能需要很长时间才能解决。您还将从团队的其他成员那里获得有关设置环境的帮助。有了容器,所有这些事情都变得非常容易。你的开发环境只是一个或几个容器镜像的地址,你最多需要一个执行脚本来控制部署过程。或者进一步把你的环境镜像和镜像脚本放到一个git项目中,发布到云端,需要的时候拉取到本地。#gitclonehttps://github.com/my-project#sh./my-build-boot.sh目前我们团队基本都是用这个方案搭建本地开发环境,整理成内部技术文档,慢慢沉淀into团队的一项资产。2.部署安全当我们收到bug反馈的时候,我们心里的第一反应一定是“我的本地好”!这种情况的发生在于环境的不一致。我们在开发过程中的调试,往往不能保证在其他环境下的问题,却不得不为此付出代价。这真是一件令人痛心的事情。使用容器,这种情况很少发生。我们可以通过容器技术,让开发环境、测试环境、生产环境在版本、依赖等方面保持一致,从而保证代码在高度统一的环境中执行。测试环境的统一也可以解决CI流程的环境需求。在分布式技术和扩容需求越来越大的今天,如果运维能够使用容器技术来部署环境,不仅可以节省大量的部署时间,还可以减少很多手工配置环境带来的错误.3.隔离性好无论是开发还是生产,我们经常需要在一台机器上运行多个服务,每个服务需要的依赖配置都不一样。比如两个应用需要使用同一个依赖,或者两个应用需要的依赖之间会有一些冲突,这时候就容易出现问题。因此,最好在同一台服务器上隔离不同应用程序提供的不同服务。容器在这方面有着天然的优势。每个容器都是一个隔离的环境。如果您需要容器内的服务,容器可以自行提供所有服务。这种高内聚的性能可以实现问题服务的快速分离,在一些复杂的系统中可以实现快速故障排除和及时处理。(当然需要注意的是,这种隔离只是相对于服务器,虚拟机技术应该有更好的隔离)4.快速回滚容器之前的回滚机制,一般需要在之前版本的基础上重新部署application,并替换当前有问题的版本。在最初的时代,可能是一个完整的开发到部署的流程,往往需要很长的时间来执行这套流程。在基于git的环境中,可能是回滚一个历史提交,然后重新部署。这些相对于容器技术来说还不够快,而且可能会引起新的问题(因为是基于新版本的修改)。容器技术本质上是回滚的,因为每一个历史容器或者镜像都会被保存下来,替换一个容器或者历史镜像是非常快速和简单的。5.成本低这可能是最明显和最有用的优势。在容器出现之前,我们经常需要一台新的服务器或者一台虚拟机来构建一个应用程序。服务器的采购成本和运维成本非常高,虚拟机需要占用很多不必要的资源。相比之下,容器技术更小更轻。它只需要为容器提供构建应用程序所需的依赖项。这是容器技术快速发展的主要原因。6.更低的管理成本随着容器技术的不断普及和发展,后续的容器管理和编排技术也得到了发展。DockerSwarm、Kubernetes、Mesos等编排工具也在不断迭代更新,这让容器技术在生产环境中有了更多的可能性和更大的发展空间。随着大环境的发展,docker等容器的使用和学习成本也在不断降低,成为更多开发者和企业的选择。说了这么多优点,容器也有一些问题没有解决。上一代方案基本上是基于虚拟机技术的云方案,可以有效提高服务器使用效率,达到节约成本的目的。在此基础上,容器技术进一步优化了资源的利用率。但是,在选择服务资源架构场景时,还有一些问题是我们需要考虑的:1.隔离性基于Hypervisor的虚拟机技术在隔离性上优于容器技术,他们的系统硬件资源是完全虚拟化的,当一个虚拟机有一个系统级的问题,它通常不会波及到同一主机上的其他虚拟机。但是容器不同。容器共享相同的操作系统内核和其他组件,因此当攻击发生时,更容易通过底层操作系统影响其他容器。当然这个问题可以通过在虚拟机中部署容器来解决,但是这会带来新的问题,比如成本增加以及下面提到的问题:性能。2.性能无论是虚拟机还是容器,都采用了不同的技术对应用本身进行了一定程度的封装和隔离,为降低应用之间以及应用与应用之间的耦合做了大量的工作环境,但随机会出现较多的网络连接转发和数据交互,在低并发系统上不会太明显,往往不会成为应用瓶颈(可能分散在不同的虚拟机或服务器上),但是当同一个虚拟机或者服务器下的容器需要更高的并发支持,也就是并发问题成为应用瓶颈的时候,容器就会放大这个问题,所以并不是所有的应用场景都适合容器技术。3.存储解决方案容器的诞生并不是为了服务于OS的抽象。这是它和虚拟机最大的区别。这个基因意味着容器天生就是为应用环境做更多的努力,容器的伸缩也是基于容器。一个一次性的特性,与此相反,对持久存储解决方案的需求恰恰相反。docker容器提供的解决方案是利用volume接口,形成数据映射和传递,达到数据持久化的目的。但是这样也会造成资源的浪费和更多的交互。不管是映射到主机还是映射到网盘,都是退而求其次的方案。随着硬件技术和网络技术的迭代发展,容器技术的缺点会越来越不明显,而随着容器技术的发展和普及,相应的解决方案也会越来越多。所以总的来说,docker等容器技术会向我们的技术领域靠拢,走向更流行的趋势。也希望每一位热爱技术的人,都能更好的了解这些新技术,让它们更好的为我们服务。