Docker 是什么?Docker 基础概念和架构怎么理解?

文章导读
Previous Quiz Next 目前,Docker 在容器化技术市场中占有超过 32% 的市场份额,而且这一数字预计还将增长。一般来说,任何容器化软件都允许您在不启动整个虚拟机的情况下运行应用程序。
📋 目录
  1. A 什么是 Docker?
  2. B 为什么使用 Docker?
  3. C Docker 容器与虚拟机
  4. D Docker 架构
  5. E 结论
  6. F 常见问题解答
A A

Docker - 概述



Previous
Quiz
Next

目前,Docker 在容器化技术市场中占有超过 32% 的市场份额,而且这一数字预计还将增长。一般来说,任何容器化软件都允许您在不启动整个虚拟机的情况下运行应用程序。

Docker 使重复且耗时的配置任务变得多余。这允许在桌面和云环境中快速高效地开发应用程序。然而,要熟练使用 Docker,重要的是要清楚理解其底层架构和其他基础知识。

在本章中,让我们探索 Docker 的概述,并了解 Docker 的各种组件如何工作并相互交互。

什么是 Docker?

Docker 是一个开源平台,用于开发、交付和运行应用程序。它使应用程序与基础设施分离变得更容易,从而保证快速的软件交付。Docker 通过协调基础设施管理和应用程序处理来缩短代码创建与部署之间的时间。

应用程序被打包并在称为 container 的环境中运行,这些 container 是 Docker 生态系统中松散隔离的环境。由于这种隔离,单个主机上可以同时运行更多 container,从而提高安全性。由于它们轻量级,container 通过封装应用程序运行的所有要求,消除了对主机设置的需求。由于 container 在共享环境中保持一致,协作变得顺畅。

Docker 为我们提供了全面的工具和平台来管理 container 生命周期 —

  • 您可以使用 container 开发应用程序并支持其组件。
  • 您可以将 container 用作所有应用程序的分发和测试单元。
  • Docker 允许您将应用程序无缝且一致地部署到所有环境,无论是本地数据中心、云平台还是混合基础设施。

为什么使用 Docker?

快速的应用程序开发和交付

Docker 通过提供本地 container 的标准化环境来加速应用程序开发周期。这些 container 是 CI/CD 工作流的核心组成部分,确保快速且一致的应用程序交付。

考虑以下示例场景 —

  • 团队中的开发者在本地系统上编写程序。他们可以使用 Docker container 与队友分享工作。
  • 然后,他们可以使用 Docker 将应用程序部署到测试环境中,在那里运行自动化或手动测试。
  • 如果发现 bug,他们可以在开发环境中修复它,验证构建,然后重新部署到测试环境进行进一步测试。
  • 测试完成后,将应用程序部署到生产环境并将功能交付给客户就像将更新的 image 推送到生产环境一样简单。

响应式部署和扩展

由于 Docker 是一个基于 container 的平台,它促进了高度可移植的工作负载。这允许您在各种环境中无缝运行应用程序。其可移植性和轻量级特性允许动态工作负载管理。随后,企业可以根据需求实时扩展应用程序。

最大化硬件利用率

Docker 是传统虚拟机的成本效益更高的替代方案。这使得服务器容量利用率更高。它允许您创建高密度环境并执行更小的部署。这允许企业在有限资源下实现更多。

Docker 容器与虚拟机

虚拟机 (VMs) 和 Docker 容器是现代计算环境中两种广泛使用的技术,尽管它们有不同的用途和优势。为特定用例选择哪种技术,需要了解它们的差异。

Docker Overview

架构

Docker 容器 − Docker 容器轻量且可移植,它们共享主机 OS 内核。它们运行在主机 OS 之上,并封装应用程序及其依赖项。

虚拟机 − 另一方面,虚拟机在 hypervisor 之上模拟完整的硬件,包括 guest OS。每个 VM 运行自己的 OS 实例,与主机 OS 独立。

资源效率

Docker 容器 − 在资源利用方面,Docker 容器高度高效,因为它们共享主机 OS 内核,与 VM 相比需要更少的资源。

虚拟机 − VM 消耗更多资源,因为它们需要模拟整个操作系统,包括内存、磁盘空间和 CPU。

隔离性

Docker 容器 − 容器提供进程级隔离。这意味着它们共享相同的 OS 内核,但具有独立的 filesystem 和网络。这是通过 namespaces 和 control groups 实现的。

虚拟机 − 相比之下,VM 提供更强的隔离,因为每个 VM 运行自己的内核并拥有专属资源。因此,VM 更安全但也更重量级。

可移植性

Docker 容器 − 只要环境中安装了 Docker,容器就能在不同环境(开发或生产)中一致运行。这使得它们高度可移植。

虚拟机 − 由于底层硬件和 hypervisor 配置的差异,VM 比容器灵活性更低。不过,通过 disk images,它们在一定程度上是可移植的。

启动时间

Docker 容器 − 容器几乎瞬间启动,因为它们利用主机 OS 内核。因此,它们最适合微服务架构和快速扩展。

虚拟机 − VM 通常启动时间更长,因为它们需要启动整个 OS。这导致与容器相比启动时间更慢。

使用场景

Docker 容器 − Docker 容器最适合微服务架构、CI/CD 管道以及需要快速部署和扩展的应用程序。

虚拟机 − VM 更适合运行具有严格安全要求的遗留应用程序,在这些场景中需要强隔离。

Docker 架构

Docker 使用客户端-服务器架构。Docker 客户端与 Docker 守护进程通信,后者负责构建、管理和分发您的 Docker 容器。Docker 守护进程承担所有繁重的工作。

Docker 客户端也可以连接到远程 Docker 守护进程,或者守护进程和客户端可以在同一台机器上运行。它们通过 REST API、UNIX 套接字或网络接口进行通信。

Docker Architecture

Docker 守护进程

Docker 守护进程(也称为 dockerd)管理 Docker 对象,如 containers、images、volumes、networks 等。它监听 Docker API 请求来执行这些操作。为了管理 Docker 服务,它还可以与其他守护进程通信。

Docker 客户端

为了与 Docker 交互,大多数用户使用 Docker 客户端,如 CLI。在命令行中,当您运行 Docker 命令如 docker run 时,它会将命令发送给 dockerd 执行。Docker 客户端可以与多个守护进程通信。

Docker Desktop

Docker Desktop 是一种轻松访问 Docker 的方式。它是一个可以在 Windows、Mac 和 Linux 上运行的应用程序。它允许您执行所有 Docker 相关功能。Docker Desktop 集成了 daemon、client、compose、Kubernetes 等众多功能。

Docker Registries

Docker registry 存储 Docker images。最受欢迎的公共 Docker registry 是 Docker Hub,任何人都可以使用。默认情况下,Docker 在 Docker Hub 上查找 images。

当您执行 docker pull 或 run 命令时,dockerd 会从 registry 拉取所需的 images。docker push 命令也是如此。

Docker 对象

Docker 具有 images、containers、networks、volumes、plugins 等与之相关的其他对象,您将在整个 Docker 之旅中使用这些对象。让我们简要概述其中一些对象。

Images

Image 是一个只读模板,包含创建 Docker container 的指令。Image 通常从另一个 image 继承,并带有一些额外修改。例如,您可以创建一个基于 Ubuntu base image 的 Docker image,在其之上安装 Apache web server、您的应用程序以及特定于应用程序的一些配置。

您可以创建自己的 image,或者从 registry 使用他人创建的 image。要构建自定义 image,您可以使用 Dockerfile,其中包含构建 image 所需的所有指令和步骤。Dockerfile 中的一个指令就是 base image 之上的一个 image layer。

重新构建 Dockerfile 时,只有与已更改指令相关的 layer 会被重新构建。这就是使 Docker images 如此轻量、快速和小型的原因。

Containers

Docker container 是 Docker image 的运行实例。Docker 允许您创建、运行、停止、移动或删除 container。Docker container 基于关联的 image 以及启动 container 时提供的配置。当您停止或移除 container 时,未持久化到持久存储(如 volumes 等)的更改将丢失。

创建一个 Docker container 的示例命令是 −

docker run -i -t ubuntu /bin/bash

运行此命令时会发生以下情况 −

  • 如果您之前未在本地拉取过,Docker 会从 Docker Hub 拉取 Ubuntu image(通过内部执行 docker pull 命令)。
  • 然后通过内部执行 docker create 命令创建一个新的 container。
  • 作为最后一层,它为 container 分配一个可读写文件系统。它还会创建一个默认的网络接口。
  • 一旦 container 启动,它就会执行 /bin/bash 命令。-i 和 -t 标志以交互模式运行 container,并附加一个终端供您运行进一步命令。

Networks

借助 Docker networks,containers 可以相互通信。虽然 containers 默认是隔离的,但您可以使用 Docker 构建虚拟 networks,让 containers 安全地相互通信。这些 networks 的复杂程度可以从简单到复杂,不同的 driver 选项提供不同的功能。

对于基本连接,您可以使用默认的 bridge network,或者为您的应用创建自定义 networks。Docker networks 使构建多 container 应用程序变得简单,这些应用程序中的服务需要相互通信。

Storage

传统应用程序依赖于主机提供的存储系统。借助 volumes,Docker 提供了一种更灵活的方法。Volumes 是存储在 container 外部的数据目录。这确保了无论 container 是停止还是恢复,您的数​​据都是安全的。

对于持久存储需求,您可以从主机绑定挂载特定目录,或者创建 named volumes 来管理应用程序数据。Docker volumes 简化了数据管理,并通过将应用程序数据与 container 生命周期分离来确保持久性。

结论

总之,希望简化应用程序开发、部署和管理的企业会发现,Docker 的容器化技术是一个强大的选择。

Docker 的方法论加速了开发周期,促进了可扩展性和可移植性,并最大化了硬件资源的利用。通过使用 Docker 容器,企业可以提升软件交付过程的敏捷性、效能和成本效益。

常见问题解答

Q1. Docker 的核心概念是什么?

容器化是 Docker 背后的基本理念。它将您的程序及其所有依赖项编译到一个容器中,该容器是一个自包含的实体。此容器与其他容器隔离运行,确保在不同环境中行为一致。可以将其视为一个预配置的盒子,里面包含了应用程序正常运行所需的一切,无论它在哪里。

Q2. Docker 最适合用于什么?

Docker 是一个优秀的工具,用于更快地管理和部署应用程序开发。其轻量级容器便于更容易、更快的构建。

此外,它们支持应用程序在各种环境中的轻松扩展和迁移。而且,通过允许共享容器化应用程序,Docker 简化了团队协作。

Q3. Docker 的生命周期是什么?

Docker 容器的生命周期从创建 image 开始,image 作为蓝图。随后,使用此 image 启动容器实例。

容器可以根据需要启动、停止、暂停和重启。最后,一旦不再需要,容器可以被移除。

Q4. Docker 是 PaaS 还是 IaaS?

Docker 既不是基础设施即服务 (IaaS) 也不是平台即服务 (PaaS)。它专注于容器化、独特的应用程序打包和运行技术。

IaaS 提供虚拟化计算资源,而 PaaS 提供完整的开发和部署环境。Docker 与 IaaS 和 PaaS 解决方案都能很好地协作。

Q5. Dockerfile 是什么?

Dockerfile 是一个文本文件,包含创建 Docker image 的指令。它指定了 image 中必须存在的库、应用程序代码和操作系统。可以将其视为一本烹饪书,它指导 Docker 精确地包含哪些组件并执行哪些操作,以生成适用于您的应用程序的可工作容器 image。