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

Docker系列—简介

时间:2023-03-14 16:01:24 科技观察

1.OriginDocker最初是dotCloud创始人SolomonHykes在法国期间发起的一个公司内部项目。Apache2.0许可协议开源,主要项目代码维护在GitHub上。Docker项目后来也加入了Linux基金会,成立了OpenContainerConsortium(OCI)来推动。Docker自开源以来就受到了广泛的关注和讨论。到目前为止,它的GitHub项目已经有超过57000个star,超过10000个fork。甚至由于Docker项目的火爆,在2013年底,dotCloud决定更名为Docker。Docker最初是在Ubuntu12.04上开发和实现的;RedHat从RHEL6.5开始支持Docker;谷歌还在其PaaS产品中广泛使用Docker。Docker是使用谷歌推出的Go语言开发和实现的。基于Linux内核的cgroup、namespace等技术,以及OverlayFS等UnionFS,对进程进行封装和隔离,属于操作系统层面的虚拟化技术。由于隔离进程独立于宿主机和其他隔离进程,所以又称为容器。最初的实现是基于LXC。从0.7版本开始去掉了LXC,改用自研的libcontainer。从1.11版本开始,进一步进化为使用runC和containerd。runc是一个Linux命令行工具,用于根据OCI容器运行时规范创建和运行容器。containerd是一个管理容器生命周期的守护进程,提供了一组最小的功能来在节点上执行容器和管理图像。一个开源软件能否在商业上取得成功很大程度上取决于三件事——一个成功的用户案例、一个活跃的社区和一个好故事。点云之家的PaaS产品是基于docker构建的。维护时间长,用户量大。社区也很活跃。接下来,我们就来看看docker的故事吧。复杂的环境管理——从各种OS到各种中间件再到各种APP,一个产品要成为一个成功的开发者,开发者需要关心的东西太多了,而且很难管理。几乎所有现代IT相关行业都需要面对这个问题。云计算时代的到来——AWS的成功引导开发者将应用转移到云端,解决了硬件管理的问题。但是中间件相关的问题依然存在(所以openstackHEAT和AWScloudformation都在重点解决这个问题)。开发者思维的改变提供了可能性。虚拟化方式的变化——云时代,通过标准硬件来降低成本,通过虚拟化方式满足用户按需使用的需求,保证可用性和隔离性。但是无论是KVM还是Xen,在docker看来都是一种资源浪费,因为用户需要的是一个高效的运行环境,而不是操作系统。GuestOS是一种资源浪费且难以管理。更轻量级的LXC更加灵活和快速。LXC的移动性——LXC在linux2.6的内核中就已经存在了,只是一开始并不是为云计算而设计的。它缺乏标准化的描述方法和容器的可移植性,这决定了它构建的环境难以迁移和标准化管理(相对于像KVM这样基于镜像和快照的概念)。docker在这个问题上进行了实质性的创新。这是docker最独特的地方。面对以上问题,docker把交付运行环境想象成海运,OS就像货轮,基于OS的每一个软件就像一个容器。用户可以通过标准化的方式自由组装运行环境,容器的内容可以由User-defined确定,也可以由专业人员制作。这样,一个软件的交付就是一系列标准化组件的交付,就像乐高积木一样。用户只需要选择合适的积木组合,并在上面签上自己的名字即可(最后标准化的组件就是用户的app)。这是基于docker的PaaS产品的雏形。2.概述Docker是一个用于开发、交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,以便您可以快速交付软件。使用Docker,您可以像管理应用程序一样管理您的基础架构。通过利用Docker快速交付、测试和部署代码的方法,您可以显着减少编写代码和在生产环境中运行代码之间的延迟。Docker提供了在称为容器的松散隔离环境中打包和运行应用程序的能力。隔离和安全性允许您在给定主机上同时运行多个容器。容器是轻量级的,包含运行应用程序所需的一切,因此您不依赖于主机上当前安装的内容。您可以在工作时轻松共享容器,并确保与您共享的每个人都获得以相同方式工作的相同容器。Docker提供了管理容器生命周期的工具和平台:使用容器来开发您的应用程序及其支持组件。容器成为分发和测试应用程序的单元。准备就绪后,将应用程序作为容器或编排服务部署到生产环境中。无论您的生产环境是本地数据中心、云提供商还是两者的混合,这都是一样的。一个完整的Docker由以下几个部分组成:DockerClientClientDockerDaemondaemonprocessDockerImageMirrorDockerContainer容器3.ArchitectureDocker包括三个基本概念:Image(Image):Docker镜像(Image),相当于一个根文件系统.例如官方镜像ubuntu:16.04包含了Ubuntu16.04最小系统的完整根文件系统。容器:镜像和容器的关系就像面向对象编程中的类和实例。镜像是静态定义的,容器是镜像运行时的??实体。容器可以创建、启动、停止、删除、暂停等操作。Repository:Repository可以看作是存储镜像的代码控制中心。Docker使用客户端-服务器架构。Docker客户端与Docker守护进程对话,后者负责构建、运行和分发Docker容器的繁重工作。Docker客户端和守护进程可以在同一系统上运行,或者您可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程使用RESTAPI、UNIX套接字或网络接口进行通信。另一个Docker客户端是DockerCompose,它允许您使用由一组容器组成的应用程序。4.底层实现Docker的底层核心技术包括Namespaces、Controlgroups、Unionfilesystems和Linux上的Containerformat。我们知道,传统的虚拟机是通过运行宿主机中的hypervisor来模拟一套完整的硬件环境提供给虚拟机的操作系统。虚拟机系统看到的环境是相互限制和隔离的。这种直接的方式实现了对资源最完整的封装,但往往意味着系统资源的浪费。例如,如果宿主机和虚拟机系统都是Linux系统,运行在虚拟机中的应用程序实际上可以使用宿主系统中的运行环境。我们知道,在操作系统中,包括内核、文件系统、网络、PID、UID、IPC、内存、硬盘、CPU等,所有的资源都是由应用进程直接共享的。要实现虚拟化,除了内存、CPU、网络IO、硬盘IO、存储空间等方面的限制外,还需要对文件系统、网络、PID、UID、IPC等进行隔离。彼此。前者实现起来相对容易,而后者则需要宿主系统的深入支持。随着Linux系统的命名空间功能的完善实现,程序员已经可以实现上述所有需求,让某些进程运行在相互隔离的命名空间中。虽然大家共享一个内核和一些运行时环境(比如一些系统命令和系统库),但是彼此看不到,都认为自己是系统中的唯一。这种机制就是容器(Container),它使用命名空间来隔离权限,使用cgroups来分配资源。五、Docker与传统虚拟化方法的比较Docker项目的目标是实现一个轻量级的操作系统虚拟化解决方案。Docker基于Linux容器(LXC)等技术。Docker在LXC的基础上进行了进一步的封装,让用户无需关心容器的管理,操作更加简单。用户操作Docker容器就像操作快速、轻量级的虚拟机一样简单。下图比较了Docker与传统虚拟化方式的区别。可以看出,容器在操作系统层面实现虚拟化,直接复用本地主机的操作系统,而传统方式是在硬件层面实现。Docker在容器的基础上进行了进一步的封装,从文件系统、网络互联到进程隔离等,极大地简化了容器的创建和维护。这使得Docker技术比虚拟机技术更轻、更快。传统虚拟化Docker容器化6.为什么使用DockerDocker与传统虚拟化方式相比有很多优势。更高效地利用系统资源由于容器不需要硬件虚拟化和运行完整操作系统等额外开销,因此Docker对系统资源的利用率更高。无论是应用程序执行速度、内存消耗还是文件存储速度,都比传统的虚拟机技术更高效。因此,与虚拟机技术相比,一台相同配置的主机往往可以运行更多的应用程序。更快的启动时间传统的虚拟机技术启动应用服务往往需要几分钟时间,而Docker容器应用,由于直接运行在宿主内核上,无需启动完整的操作系统,可以实现秒级甚至毫秒级的启动时间。大大节省了开发、测试和部署的时间。一致的运行时环境开发过程中的一个常见问题是环境一致性。由于开发环境、测试环境、生产环境的不一致,导致部分bug在开发过程中没有发现。Docker镜像提供了除内核之外完整的运行环境,保证了应用运行环境的一致性,不会再出现“这段代码在我的机器上没问题”的问题。持续交付和部署对于开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,随处正常运行。使用Docker可以通过自定义应用镜像实现持续集成、持续交付和部署。开发者可以使用Dockerfile构建镜像并结合持续集成(ContinuousIntegration)系统进行集成测试,而运维人员可以直接在生产环境中快速部署镜像,甚至结合持续部署(ContinuousDelivery/Deployment)系统用于自动部署。而且,使用Dockerfile让镜像构建透明化,不仅让开发团队了解应用运行环境,也方便运维团队了解应用运行所需的条件,有助于更好地将镜像部署到生产中环境。更轻松的迁移由于Docker保证了执行环境的一致性,使得应用程序的迁移更容易。Docker可以运行在很多平台上,无论是物理机、虚拟机、公有云、私有云,甚至笔记本电脑,结果都是一样的。因此,用户可以轻松地将运行在一个平台上的应用程序迁移到另一个平台上,而不必担心由于运行环境的改变而导致应用程序无法正常运行的情况。更容易维护和扩展Docker使用的分层存储和镜像技术,使得应用中重复的部分更容易复用,也让应用的维护和更新变得更加容易。在基础镜像的基础上进一步扩展镜像也很简单。此外,Docker团队与各个开源项目团队一起维护了大量高质量的官方镜像,可以直接在生产环境中使用,也可以作为进一步定制的基础,大大降低了镜像制作成本应用服务。七。Featuresandlimitations1.Featuresdocker官网上提到了docker的典型场景:Automaticpackaginganddeploymentofapplications(自动化打包部署应用程序)Creationoflightweight,privatePaaSenvironments(创建轻量级私有PaaS环境)PAASenvironment)Automatedtestingandcontinuousintegration/deployment(自动化测试和持续集成/部署)Deployingandscalingwebapps,databasesandbackendservices(部署和扩展webapp,数据库和后台服务)由于其轻量级LXC-based与KVM相比,docker最明显的特点就是启动快,占用资源少。因此,对于构建隔离和标准化的运行环境,轻量级PaaS(如dokku),构建自动化测试和持续集成环境,以及所有可以横向扩展的应用(尤其是需要快速启动和停止以应对的Web应用)高峰和低谷)。①构建标准化的运行环境,现有的解决方案大多是在baseOS上运行一套puppet/chef或者image文件。缺点是前者对baseOS需要很多先决条件,而后者几乎不能修改(因为copyonwrite的文件格式在运行时在rootfs中是只读的)。而且后者文件体积大,环境管理和版本控制本身也是一个问题。②PaaS环境不言而喻。在其设计之初和dotcloud的案例中,都是作为PaaS产品的环境基础。③由于其标准化的构建方式(buildfile)和良好的RESTAPI,自动化测试和持续集成/部署可以很好的集成在③由于LXC的轻量级特性,启动速度快,docker只能加载每个容器变化的部分,所以资源占用小,在单机环境下可以和KVM等虚拟化方案相比可以更快,占用资源更少2.局限Docker不是万能的,不能替代虚拟化方式比如设计之初的KVM。简单总结几点:Docker是基于Linux64bit的,不能运行在32bitlinux/Windows/Unix环境下使用LXC是基于cgroup等linux内核函数,所以容器的guest系统只能成为linux基础。与KVM等虚拟化方案相比,隔离性还是有些欠缺,所有容器共享一部分运行时库网络。管理比较简单,主要是基于namespace隔离cgroupcpu和cpuset提供的CPU功能相比KVM等虚拟化方案很难衡量(所以dotcloud主要是按内存收费)Docker对磁盘的管理比较有限。进程停止时销毁,容器内日志等用户数据不便收集