Docker - 架构



DevOps 和 SRE 团队最困难的任务之一是弄清楚如何在许多云和开发环境中管理所有应用程序依赖项和技术栈。为此,他们的流程通常包括在应用程序运行的任何位置保持应用程序正常工作,通常无需更改其大部分代码。

Docker 帮助所有工程师提高效率并降低运营开销,使任何开发人员在任何开发环境中都能创建强大可靠的应用程序。Docker 是一个用于构建、交付和运行软件程序的开放平台。

Docker 允许您将应用程序与基础设施分离,从而能够快速发布软件。Docker 允许您以与管理应用程序相同的方式管理基础设施。使用 Docker 的代码交付、测试和部署方法可以大大缩短从生成代码到在生产环境中运行代码之间的时间。

Docker 使用客户端-服务器架构。Docker 客户端与 Docker 守护进程通信,后者执行创建、执行和分发 Docker 容器的繁重工作。Docker 客户端与守护进程在同一主机上运行,或者我们可以远程链接 Docker 客户端和守护进程。Docker 客户端和守护进程通过 REST API 通过 UNIX 套接字或网络进行通信。

Docker Architecture 1

在本章中,让我们详细讨论 Docker 架构。

容器和虚拟机的区别

虚拟机 (VM) 旨在完成如果直接在主机环境中执行将存在风险的任务。VM 与系统其余部分隔离,因此虚拟机中的软件无法干扰主机计算机。

虚拟机是计算机文件或软件,通常称为客户机或在称为主机的计算环境中生成的镜像。

Docker Architecture 2

虚拟机可以像在单独的计算机上一样执行应用程序和程序,这使其非常适合测试其他操作系统(例如测试版)、创建操作系统备份以及安装软件和应用程序。主机可以同时运行多个虚拟机。

虚拟机包含多个基本文件,包括日志文件、NVRAM 设置文件、虚拟磁盘文件和配置文件。

服务器虚拟化是虚拟机可以非常有用的另一个领域。服务器虚拟化将物理服务器划分为多个隔离且唯一的服务器,允许每个服务器独立执行其操作系统。每个虚拟机都有其虚拟硬件,包括 CPU、RAM、网络端口、硬盘驱动器和其他组件。

另一方面,Docker 是一种软件开发工具和虚拟化技术,允许您利用容器轻松创建、部署和管理程序。容器是软件的轻量级、独立的可执行捆绑包,其中包含运行应用程序所需的所有库、配置文件、依赖项和其他组件。

换句话说,程序无论在哪里运行或在什么计算机上运行,执行方式都相同,因为容器在其整个软件开发生命周期中为应用程序提供了一个环境。

由于容器是分开的,因此它们提供了安全性,允许许多容器在同一主机上同时运行。此外,容器是轻量级的,因为它们不需要虚拟机管理程序的额外负载。虚拟机管理程序类似于 VMware 或 VirtualBox 的客户机操作系统,但容器直接在主机机器内核中运行。

我应该选择 Docker 还是虚拟机 (VM)?

比较 Docker 和虚拟机是不公平的,因为它们的目的不同。Docker 的确越来越受欢迎,但不能将其视为虚拟机的替代品。尽管 Docker 很受欢迎,但在某些情况下,虚拟机仍然是更好的选择。

在生产环境中,虚拟机优于 Docker 容器,因为它们运行自己的操作系统并且不会对主机计算机造成任何威胁。但是,出于测试目的,Docker 是最佳选择,因为它为软件或应用程序的完整测试提供了多个操作系统平台。

此外,Docker 容器还使用 Docker 引擎而不是虚拟机中的虚拟机管理程序。由于没有共享主机内核,因此使用 docker-engine 使容器变得紧凑、隔离、兼容、高性能密集型且响应迅速。

Docker 容器的开销很小,因为它们可以共享单个内核和应用程序库。组织主要采用混合方法,因为虚拟机和 Docker 容器之间的决策取决于交付的工作负载类型。

此外,只有少数数字业务组织依赖虚拟机作为其主要选择,而选择使用容器,因为部署耗时,并且运行微服务是它面临的最大障碍之一。但是,一些企业更喜欢虚拟机而不是 Docker,主要是那些希望为其基础设施提供企业级安全性的企业。

Docker 架构的组件

Docker 架构的关键组件包括:Docker Engine、Docker 仓库和 Docker 对象(镜像、容器、网络、存储)

让我们讨论每个组件,以更好地了解 Docker 架构的不同组件如何相互交互。

Docker Engine

Docker Engine 是 Docker 平台的基础,它促进了容器生命周期的所有元素。它包含三个基本组件:命令行界面、REST API 和守护进程(处理作业)。

Docker 守护进程,通常称为“dockerd”,会持续侦听 Docker API 请求。它用于执行所有繁重的工作,例如创建和管理 Docker 对象(例如容器、卷、镜像和网络)。Docker 守护进程可以与同一主机或不同主机上的其他守护进程通信。例如,在 Swarm 集群中,主机机器的守护进程可以连接到其他节点上的守护进程以完成任务。

Docker API 允许应用程序控制 Docker Engine。它们可以使用它来查找有关容器或镜像的详细信息、管理或上传镜像以及执行创建新容器等操作。此功能可以使用 HTTP 客户端 Web 服务来实现。

Docker 仓库

Docker 仓库是存储设施或服务,使您能够根据需要存储和检索镜像。例如,仓库由 Docker 存储库组成,这些存储库将所有镜像保存在一个屋檐下。

公共仓库有两个主要组件:Docker HubDocker Cloud。私有仓库在组织中也很流行。与这些存储区域一起使用的最流行的命令是docker push、docker pulldocker run

Dockerhub 是官方的 Docker 仓库,包含多个官方镜像存储库。存储库是类似 Docker 镜像的集合,这些镜像可以通过 Docker 标记唯一标识。Dockerhub 为其用户提供了大量相关的官方和特定于供应商的镜像。其中一些是 Nginx、Apache、Python、Java、Mongo、Node、MySQL、Ubuntu、Fedora、Centos 等。

您也可以在 Dockerhub 上设置自己的私有存储库,并使用 Docker push 命令来存储您的自定义 Docker 镜像。Docker 允许您在本地机器上构建自己的私有 Docker 仓库。启动包含仓库镜像的容器后,您可以使用 Docker push 命令将镜像推送到此私有仓库。

Docker 对象

使用 Docker 时,您将创建和管理镜像、容器、网络、卷、插件和其他项目。本节简要总结了其中的一些内容。

Docker 镜像

镜像是一个只读模板,包含构建 Docker 容器的指令。在许多情况下,镜像是在另一个镜像的基础上构建的,并进行了一些小的修改。例如,您可以创建一个基于 Ubuntu 镜像的镜像,但其中包含 Apache Web 服务器、您的应用程序以及执行应用程序所需的配置信息。

您可以创建自己的镜像,也可以使用其他人创建并发布到注册中心的镜像。要构建您的镜像,请使用 Dockerfile,它使用简单的语法来定义生成和运行镜像所需的步骤。Dockerfile 中的每个指令都会在镜像中生成一个层。当您编辑 Dockerfile 并重新构建镜像时,只有修改过的层会被重建。这是镜像与其他虚拟化方法相比更轻量级、更小巧、更快的部分原因之一。

您可以使用 Docker build 命令从 Dockerfile 创建 Docker 镜像。

这里,"-t" 用于为镜像分配一个标签。末尾的点指定了 Dockerfile 所在的构建上下文,在本例中为当前目录。

$ docker build -t myimage .

Docker 容器

容器是镜像的运行实例。可以使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器。您可以将容器链接到一个或多个网络、附加存储或甚至从其现有状态构建新的镜像。

容器通常与其他容器和主机有效隔离。您可以控制容器的网络、存储和其他底层子系统与其他容器和主机隔离的程度。

容器由其镜像以及创建或启动时指定的任何配置参数定义。当容器被移除时,其状态中任何非持久性的更改都会消失。

在生成镜像时,容器可以完全访问您在 Dockerfile 中定义的资源。此类设置包括构建上下文、网络连接、存储、CPU、内存、端口等。例如,如果您希望访问安装了 Java 库的容器,您可以使用 Dockerhub Java 镜像和 Docker run 命令启动一个连接到它的容器。

您可以使用 Docker run 命令创建容器。这里,-it 标志以交互模式启动容器并将其与伪终端关联。/bin/bash 指定容器启动时要运行的命令。这将允许您访问容器的 bash。

$ docker run -i -t ubuntu /bin/bash

Docker 网络

Docker 网络是所有隔离容器之间进行通信的一种方式。Docker 中主要有四种网络驱动程序:

桥接网络 (Bridge)

这是容器的默认网络,无法与外部世界通信。当您的应用程序运行在独立容器上时,您会使用此网络,独立容器是指在网络中连接的多个容器,这些容器仅允许它们彼此通信,而不允许与外部世界通信。

主机网络 (Host)

此驱动程序使 Docker 能够与您本地机器上的资源无缝协作。它利用您机器的原生网络功能,在不同端点上的 Docker 应用程序之间启用低级 IP 隧道和数据链路层加密。

覆盖网络 (Overlay Network)

这是一种软件定义的网络技术,允许容器相互连接。要将其连接到外部主机,首先在一个主机上构建一个虚拟桥接,然后构建一个覆盖网络。您还需要设置覆盖网络并允许从一侧到另一侧的访问。通常,“none” 驱动程序表示网络已断开连接。

Macvlan

macvlan 驱动程序可用于为容器分配地址并使其行为类似于物理设备。它的特点是它使用容器的 MAC 地址而不是 IP 地址来引导容器之间的通信。当您希望容器看起来像物理设备时,例如迁移虚拟机时,请使用此网络。

Docker 存储

有多种方法可以安全地存储数据。例如,您可以将数据存储在容器的可写层上,并使用存储驱动程序。此方法的问题在于,如果您关闭或停止容器,则会丢失数据,除非您将其保存到其他位置。

在 Docker 容器中进行持久化存储时,有四种**方法**:

数据卷 (Data Volumes)

它们允许您创建持久性存储、重命名卷、列出卷以及查看与卷关联的容器。数据卷放置在容器的写时复制机制之外的数据存储上,例如 S3 或 Azure。

卷容器 (Volume Container)

卷容器是一种替代方案,其中一个专用容器承载一个卷,然后可以将其挂载或符号链接到其他容器。在这种方法中,卷容器独立于应用程序容器,允许在多个容器之间共享。

目录挂载 (Directory Mounts)

第三种选择是在容器中挂载主机的本地目录。在早期情况下,卷必须位于 Docker 卷文件夹中,而目录挂载可以来自主机计算机上的任何目录。

存储插件 (Storage Plugins)

存储插件允许 Docker 连接到外部存储源。这些插件使 Docker 能够通过将主机的驱动器映射到外部源来与存储阵列或设备协作。一个示例是允许您使用 Docker 安装的 GlusterFS 存储并将其映射到易于访问的位置的插件。

结论

总之,Docker 改变了开发人员和 IT 运维人员在跨多个环境处理应用程序依赖项和部署流程的方式。

Docker 的客户端-服务器架构有效地将应用程序与其底层基础设施解耦,简化了软件的开发、交付和执行过程。这种方法极大地减少了从代码开发到生产过渡所需的时间和精力,提高了软件开发流程的敏捷性和可扩展性。

Docker 容器的轻量级特性与其隔离特性相结合,为应用程序执行创建了一个稳定且一致的环境,而不管主机系统如何。

最终,Docker 的全面架构(包括 Docker Engine、注册中心、镜像、容器、网络和存储等组件)为企业提供了维护高性能、可靠和安全应用程序环境所需的工具。

虽然 Docker 和虚拟机有不同的用途和特性,但 Docker 的容器化技术非常适合现代的云原生应用程序和微服务架构。在 DevOps 操作中使用 Docker 的组织可以提高构建和部署软件的效率、灵活性和速度。

常见问题解答

问 1. Docker 架构的关键组件是什么?

Docker 架构由多个关键组件组成。Docker Engine 由 Docker 守护进程、REST API 和命令行界面 (CLI) 组成,它们共同管理容器的生命周期。Docker 镜像是用于生成容器的只读模板,其中包含程序及其依赖项。

容器是镜像的运行实例,充当应用程序的隔离环境。Docker 注册中心(如 Docker Hub)存储和分发镜像,使其易于访问。

Docker 网络使容器能够相互连接以及与其他系统连接,而卷等存储解决方案可确保数据在容器生命周期之外保持持久性。

问 2. Docker 是否可用于开发和生产环境?

是的,Docker 旨在用于开发、测试和生产环境,确保在所有阶段为应用程序提供一致的环境。Docker 使开发人员能够创建隔离的容器,这些容器复制了生产环境,确保程序一致地执行。

在测试期间,容器可用于建立可重复的测试环境,从而加快测试速度并减少由环境差异引起的问题。Docker 的编排技术(如 Docker Swarm 和 Kubernetes)通过处理容器的部署、扩展和管理,提高了其生产就绪性。

广告