Code前端首页关于Code前端联系我们

什么是 Docker?最清楚地解释这个概念的文章

terry 2年前 (2023-09-25) 阅读数 51 #后端开发

Docker是全球领先的软件容器平台,所以如果我们想要了解Docker的概念,我们需要从容器开始。

1 让我们从了解容器开始

1.1 什么是容器?

首先我们看一下容器比较官方的解释

容器的一句话总结:容器是将软件打包成标准化的单元,用于开发、交付和部署。

  • 容器映像是轻量级、可执行的独立软件包,其中包含运行软件所需的一切:代码、运行时、系统工具、系统库和设置。
  • 适用于基于 Linux 和 Windows 的应用程序的容器软件,可在任何环境中一致运行。
  • 容器提供软件独立性,不受外部环境差异(例如开发和登台环境之间的差异)的影响,从而有助于减少团队在同一基础设施冲突上运行不同软件所需的时间。

我们看一个比较通俗的容器解释

如果要用白话来形容容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具,衣柜可以放各种衣服和鞋架,里面可以装各种鞋子。我们现在所说的容器可以更加面向应用,比如网页、程序,甚至是系统环境。 Docker是什么?概念讲的最清楚的一篇文章

1.2 物理机、虚拟机和容器图解

虚拟机和容器的对比稍后会详细介绍。这里我们只是利用网上的图片来加深对物理机、虚拟机和容器的理解。 。

物理机Docker是什么?概念讲的最清楚的一篇文章

虚拟机:Docker是什么?概念讲的最清楚的一篇文章

容器:

Docker是什么?概念讲的最清楚的一篇文章

通过以上三个抽象图,我们可以类比大致总结:而不是容器虚拟化操作系统。容器共享同一组操作系统资源。虚拟机技术是将一组硬件虚拟化,然后在其上运行完整的操作系统。因此,容器的保温水平会稍低一些。


相信通过上面的讲解,大家对容器这个陌生但依然熟悉的概念有了初步的了解。我们来谈谈 Docker 的一些概念。

2 我们来谈谈 Docker 的一些概念

Docker是什么?概念讲的最清楚的一篇文章

2.1 什么是 Docker?

说实话,Docker 是什么并不容易说清楚。我通过四点来解释一下什么是Docker。

  • Docker 是全球领先的软件容器平台。
  • Docker使用Google推出的Go语言开发和实现,基于cgroup、namespace和❙Linux内核‽‽‽ ‽‽‽ 来自 AUFS FS类等该技术封装和隔离进程,是操作系统层面的虚拟化技术。 由于隔离进程独立于宿主机和其他隔离进程,因此也称为容器。 Docke 最初是基于 LXC 实现的。
  • Docker 可自动执行重复性任务,例如设置和配置开发环境,使开发人员能够专注于真正重要的事情:构建出色的软件。
  • 用户可以轻松创建和使用容器,并将自己的应用程序嵌入到容器中。容器还可用于版本控制、复制、共享和编辑以及管理通用代码。
Docker是什么?概念讲的最清楚的一篇文章

2.2 Docker 思考

  • 容器
  • 标准化: ①传输方式 ② 存储方式 ③ API 接口 ‶‶ API 接口 ‶‶2
    • 轻量级

      在一个运行的多个 Docker 容器中在计算机上它可以共享机器操作系统的内核;它们可以快速启动,并且只需要少量的计算和内存资源。镜像是通过文件系统层创建的,共享一些通用文件。这可以最大限度地减少磁盘使用并更快地下载图像。

    • 标准

      Docker 容器基于开放标准,可以在所有主要版本的 Linux、Microsoft Windows 和任何基础设施上运行,包括虚拟机、裸机服务器和云。

    • 安全

      Docker 为应用程序提供的隔离不仅限于彼此隔离,还包括与底层基础设施的独立性。 Docker默认提供了最强的隔离,因此如果某个应用程序出现问题,也只是一个容器的问题,不会影响整个机器。

    2.4 为什么使用 Docker

    • Docker 镜像提供了除内核之外的完整运行环境,保证了应用程序运行环境的一致性,因此不会再出现“这段代码在我的机器上没问题”的情况。此类问题; - 一致的操作环境
    • 可以达到秒级甚至毫秒级的启动时间。这显着节省了开发、测试和部署时间。 ——更快的启动时间
    • 避免使用公共服务器,资源很容易受到其他用户的影响。——隔离性
    • 良好处理使用服务器时的集中突发负载; ——弹性伸缩、快速扩展
    • 在一个平台上运行的应用程序可以轻松迁移到另一个平台,而不必担心运行环境的变化导致应用程序出现故障。 ——轻松迁移
    • 使用 Docker,您可以通过定制应用镜像来实现持续集成、持续交付和部署。 ——持续交付和部署

    每当我们谈论容器时,我们就不得不将其与虚拟机进行比较。在我看来,这不是谁取代谁的问题,而是两者能够和谐共处。

    三种容器VS虚拟机

    简单来说:容器和虚拟机在资源隔离和分配方面有着类似的优势,但功能上有所不同,因为容器虚拟的是操作系统,而不是硬件。因此,集装箱更容易运输且效率更高。

    3.1两者对比表

    传统的虚拟机技术是虚拟出一套硬件,在上面运行一个完整的操作系统,然后在系统上运行所需的应用进程;而容器中的应用进程直接运行在主机内核上,容器没有自己的内核,也没有硬件虚拟化。因此,容器比传统虚拟机更轻。 Docker是什么?概念讲的最清楚的一篇文章

    3.2 容器和虚拟机 (VM) 总结​​

    Docker是什么?概念讲的最清楚的一篇文章
    • 容器是一种应用层抽象,用于将代码和依赖资源打包在一起。 多个容器可以在同一台计算机上运行,​​共享操作系统内核,但每个容器在用户空间中作为独立进程运行 。与虚拟机相比,容器占用的空间更少(容器镜像的大小通常只有几十兆),并且可以在瞬间启动。
    • 虚拟机 (VM) 是物理硬件层的抽象,用于将单个服务器变成多个服务器。 虚拟机管理程序允许多个虚拟机在一台计算机上运行。每个虚拟机都包含一整套操作系统、一个或多个应用程序、必要的二进制文件和库资源,因此 占用大量空间 。 VM 启动速度非常慢

    通过Docker官网我们知道了Docker的这么多优点,但是没有必要完全否定虚拟机技术,因为两者都有不同的使用场景。 虚拟机更擅长完全隔离整个运行环境。例如,云服务提供商经常使用虚拟机技术来隔离不同的用户。而Docker通常用于隔离不同的应用程序,例如前端、后端和数据库。

    3.3 容器和虚拟机可以共存

    在我看来,谁取代谁并不重要,但他们可以和谐共存。Docker是什么?概念讲的最清楚的一篇文章


    Docker 中有三个非常重要的基本概念。如果你理解了这三个概念,你就会理解整个 Docker 生命周期。 ? Docker的整个生命周期

    Docker是什么?概念讲的最清楚的一篇文章

    4.1镜像——特殊的文件系统

    操作系统分为内核和用户空间。对于Linux,根文件系统将在内核启动后挂载以提供用户空间支持。一个Docker镜像(Image)相当于一个根文件系统。

    Docker 镜像是一种特殊的文件系统。除了提供运行容器所需的程序、库、资源、配置和其他文件外,它还包含一些准备运行的配置参数(例如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,构建后内容不会改变。

    Docker 在设计时,充分利用了Union FS 技术,将其设计为分层存储架构。一个镜像实际上由多层文件系统组成。

    创建图像时,将逐层创建图像,前一层是下一层的基础。每一层创建后就不会再改变。对下一层的任何更改将仅反映在其自己的层上。  例如删除上一级文件,并不会真正删除上一级文件,而只是将当前级别的文件标记为已删除。当最终的容器启动时,虽然该文件将不可见,但实际上该文件将始终跟随图像。因此,在构建图像时需要格外小心。每个层应该只包含需要添加到该层的内容。在层施工完成之前应清除任何其他东西。

    分层存储的特性也使得图像的复用和定制变得很容易。您甚至可以使用以前创建的图像作为基础图层,然后继续添加新图层来自定义创建新图像所需的内容。

    4.2 容器(Container)——镜像运行时实体

    镜像(Image)和容器(Container)之间的关系与面向对象编程中类和实例的关系相同。图像是静态的定义。 容器是镜像运行时实体。容器可以创建、启动、停止、删除、暂停等

    容器的本质是进程,但与直接在宿主机上执行的进程不同,容器进程运行在自己独立的命名空间中。正如前面提到的,镜像使用分层存储,容器也是如此。

    容器存储层的生命周期与容器的生命周期相同。当容器死亡时,容器的原料层也会死亡。因此,当容器被删除时,存储在容器存储层中的任何信息都将丢失。

    根据 Docker 最佳实践要求,容器不应向其存储层写入任何数据并且容器存储层必须保持无状态。 所有文件写入操作都应使用卷或绑定主机目录。对这些位置的读写会跳过容器存储层,直接到主机(或网络存储)进行读写,其性能和稳定性更高。数据卷的生命周期与容器无关。如果容器死亡,数据卷不会死亡。因此使用数据卷后,可以随意删除容器并重新启动,而不会丢失数据。

    4.3 存储库 - 存储镜像文件的集中位置

    镜像创建后,可以轻松在当前主机上运行。但是,如果您需要在其他服务器上使用此镜像,我们需要一个集中的镜像存储和分发服务。 DockerRegistry就是这样一个服务。

    Docker 注册表可以包含多个存储库(Repository);每个存储库可以包含多个标签;每个标记都与图片相对应。所以: 镜像仓库是Docker用来集中存储镜像文件的地方,类似于我们之前使用的代码仓库。

    通常,存储库将包含同一软件不同版本的映像,并且标签通常用于标识软件的每个版本。我们可以通过使用格式:来确定该图像是该软件的哪个版本。如果未指定标签,则默认使用最新标签。

    以下是公共 Docker 注册表和私有 Docker 注册表的概念:

    公共 Docker 注册表 是向用户开放的注册表服务,允许用户管理镜像。这些公共服务一般允许用户免费上传和下载公共镜像,也可能为用户提供管理私有镜像的付费服务。

    最常用的公共Registry服务是官方的Docker Hub,它也是默认的registry,在hub.docker.com/上有大量高质量的官方镜像。在中国访问Docker Hub可能会很慢。国内也有一些云服务商提供类似Docker Hub的公共服务。例如石速云镜像库、网易云镜像服务、DaoCloud镜像市场、阿里云镜像库等。

    除了使用公共服务之外,用户还可以在本地创建私有的Docker注册中心 。 Docker官方提供了Docker注册中心镜像,可以直接作为私有注册中心服务使用。开源的DockerRegistry镜像仅提供了DockerRegistryAPI的服务器端实现,足以支持docker命令,不影响使用。但是,它不包含图形界面或图像维护、用户管理和访问控制等高级功能。


    Docker的概念基本讲解完了。最后,我们来谈谈:构建、运输和运行。

    最后五个词:构建、发布和运行

    如果您搜索 Docker 官方网站,您会发现以下单词:“Docker - 在任何地方构建、发布和运行任何应用程序” 。那么构建、交付和运行到底是做什么的呢? Docker是什么?概念讲的最清楚的一篇文章

    • Build(构建镜像):镜像就像一个容器,包含文件、运行环境等资源。
    • 船舶(运输镜像):主机与仓库之间的运输。这里的仓库就像是一个超级码头。
    • Run(运行镜像):运行镜像是一个容器,程序在容器中运行。

    运行Docker的流程是去仓库,将镜像下载到本地,然后使用命令将镜像运行到容器中。因此,我们常称Docker为dockworker或dockloader,与Docker的中文翻译porter如出一辙。

    六大总结

    本文主要详细讲解了Docker中的一些常见概念,但不涉及Docker安装、镜像的使用、容器操作等内容,希望读者通过阅读书籍和白皮书能够掌握这部分内容。

    作者:SnailClimb
    链接:https://juejin.im/post/5b260ec26fb9a00e8e4b031a
    来源来源:掘金作者商业转载请联系作者获得许可。非商业转载请注明来源。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门