什么是 Docker?

2024 年 6 月 6 日

作者

Stephanie Susnjara

IBM Think Content Contributor , Gather

Ian Smalley

Senior Editorial Strategist

什么是 Docker?

Docker 是一个开源平台,开发人员可以使用该平台构建、部署、运行、更新和管理容器。

容器是标准化的、可执行的组件,它将应用程序源代码与在任何环境中运行该代码所需的操作系统 (OS) 库和依赖项相结合。

值得注意的是,当人们谈论 Docker 时,他们通常指的是 Docker Engine(用于构建和运行容器的运行时)。Docker 也指 Docker, Inc.1,即销售商业版 Docker 的公司。它还与 Docker 开源项目2 有关,Docker, Inc. 和许多其他组织和个人都为该项目做出了贡献。

容器简化了分布式应用程序的开发和交付。随着组织转向云原生开发和混合多云环境,它们变得越来越流行。开发人员可以不使用 Docker,直接利用 Linux® 和其他操作系统内置的功能来创建容器,但 Docker 可以让容器化变得更快、更简单。截至本文撰写之时,Docker 报告称,每月有超过 2000 万开发人员使用该平台3。与包括 Kubernetes 在内的其他容器化技术一样,Docker 在现代软件开发,特别是微服务架构中发挥着至关重要的作用。

什么是微服务?

与传统的大型、紧密耦合的应用程序的单一方法相比,微服务提供了云原生架构框架。该框架中,许多较小、松散耦合且可独立部署的较小组件或服务组成单个应用程序。每个服务都可以使用 Docker 进行容器化,从而简化部署,并允许团队根据需要推出新版本和扩展应用程序。

高速公路鸟瞰图

在云端保持清醒头脑 


获取每周 Think 时事通讯,了解有关在 AI 时代优化多云设置的专家指导。

容器如何工作?

Linux 内核中内置的进程隔离和虚拟化功能使容器成为可能。这些功能包括控制组 (Cgroup) 和命名空间,前者用于在进程之间分配资源,后者用于限制进程对系统的其他资源或区域的访问或可见性。

利用容器,多个应用程序组件将能够共享单个主机操作系统实例的资源。这种共享方式类似于虚拟机管理程序支持多个虚拟机 (VM) 共享单个硬件服务器的中央处理器 (CPU)、内存和其他资源。

容器技术提供了虚拟机 (VM) 的所有功能和优势,包括应用程序隔离和经济高效的可扩展性,以及显著的其他优势:

  • 负载更轻:与虚拟机不同,容器不承载整个操作系统实例和虚拟机管理程序的有效负载。它们仅包含执行代码所需的操作系统进程和依赖项。容器大小以兆字节为单位(而某些虚拟机以吉字节为单位),可以更好地使用硬件容量,并且启动时间更短。

  • 生产效率更高:只需编写一次容器化应用程序,即可在任何地方运行。与虚拟机相比,容器的部署、调配和重启更快、更简单。

  • 更高的效率:在使用容器时,开发人员可以在同一硬件上运行的应用程序副本数是使用虚拟机时的数倍。这种效率可以减少云支出。

使用容器的组织声称还有许多其他好处,包括提高应用程序质量、更快地响应市场变化等。

AI 学院

利用混合云实现 AI 就绪

本课程由 IBM 资深思想领袖带领,旨在帮助企业领导者获得所需的知识,以便划分可以推动增长的 AI 投资的优先级。

为什么使用 Docker,为什么它如此受欢迎?

Docker 是应用最广泛的容器化工具,占有 82.84% 的市场份额。4Docker 如今非常流行,"Docker" 和“容器”可以互换使用。然而,在 Docker 于 2013 年以开源方式公开发布之前,第一批与容器相关的技术已经存在了数年,甚至几十年5

最值得注意的是,2008 年在 Linux 内核中实施了 LinuXContainers (LXC),从而完全实现了单个 Linux 实例虚拟化。虽然今天仍在使用 LXC,但有较新的 Linux 内核技术可用。Ubuntu 是一个现代的开源 Linux 操作系统,它也提供了该功能。利用 Docker,开发人员可使用简单的命令访问这些原生容器化功能,并通过节省人力的应用程序编程接口 (API) 自动执行这些功能。

Docker 与 LXC 的对比

与兼容性较差的老旧 LXC 相比,使用 Docker 有很多优势。

经改进的无缝容器可移植性

LXC 容器通常引用特定于计算机的配置,而 Docker 容器无需修改即可在任何桌面、数据中心云计算环境中运行。

更轻量、更精细的更新

借助 Docker,开发人员可以将多个进程组合到一个容器中。利用这种灵活性,可以构建一种应用程序,在关闭该应用程序的某个组件以进行更新或修复时,该应用程序仍然可以继续运行。

自动创建容器

Docker 可以根据应用程序源代码自动构建容器。

容器版本控制

Docker 可以跟踪容器映像版本,回滚到以前的版本以及跟踪版本构建者和构建方式。Docker 甚至可以只上传现有版本和新版本之间的增量(软件模块的部分版本)。

容器重复使用

开发人员可以访问包含数千个用户上传的容器的开源注册表。

如今,Docker 容器化也适用于 Microsoft Windows Server 和 Apple MacOS。开发人员可以在任何操作系统上运行 Docker 容器。所有领先的云服务提供商 (CSP),包括 Amazon Web Services (AWS)、Microsoft Azure、Google Cloud Services 和 IBM® Cloud,都提供特定服务来帮助开发人员构建、部署和运行使用 Docker 容器化的应用程序。

Docker 架构、术语和工具

Docker 使用客户端/服务器架构。以下是与 Docker 相关的核心组件以及其他 Docker 术语和工具的细分。

Docker 主机:Docker 主机是运行 Linux(或其他与 Docker 引擎兼容的操作系统)的物理机或虚拟机。

Docker Engine:Docker Engine 是一个客户端/服务器应用程序,由 Docker 守护进程、与守护进程交互的 Docker API 以及与守护进程对话的命令行界面 (CLI) 组成。

Docker 守护程序:Docker 守护程序是一种使用客户端命令创建和管理 Docker 映像的服务。从本质上讲,Docker 守护程序充当 Docker 实施的控制中心。

Docker 客户端:Docker 客户端提供访问 Docker API(一种 REST API)的 CLI,以通过 Unix 套接字或网络接口与 Docker 守护程序进行通信。客户端可以远程连接到守护进程,或者开发人员可以在同一计算机系统上运行守护进程和客户端。

Docker 对象:Docker 对象是 Docker 部署的组件,可帮助打包和分发应用程序。它们包括映像、容器、网络、卷、插件等。

Docker 容器:Docker 容器是 Docker 映像的实时运行实例。Docker 映像是只读文件,而容器是实时的短暂可执行内容。用户可以与它们交互,管理员可以使用 Docker 命令调整其设置和条件。

Docker 映像:Docker 映像包含可执行的应用程序源代码以及应用程序代码作为容器运行所需的所有工具、库和依赖项。当开发人员运行 Docker 映像时,它会成为一个(或多个)容器实例。

从头开始构建 Docker 映像是可能的,但大多数开发人员都是从公共存储库中提取这些映像。开发人员可以从单个基础映像创建多个 Docker 映像,并将共享其堆栈的共同点。

Docker 映像包含多个层,每个层对应于一个映像版本。每当开发人员对映像进行更改时,都会创建一个新的顶层,该顶层替换上一个顶层以作为当前映像版本。以前的层将被保存,以便进行回滚或在其他项目中重用。

每次通过 Docker 映像创建容器时,都会创建另一个新的层(称为容器层)。对容器所做的更改(例如添加或删除文件)将保存到容器层,并且这些更改仅在容器运行时存在。

这种迭代的映像创建过程提高了整体效率,因为多个活动容器实例可以从单个基础映像运行。这样做时,它们使用一个公共堆栈。

Docker build:Docker build 命令拥有构建 Docker 映像的工具和功能。

Dockerfile:每个 Docker 容器以一个简单的文本文件开始,其中包含如何构建 Docker 容器映像的指令。Dockerfile 可自动执行创建 Docker 映像的过程。它本质上是 Docker Engine 为构建映像而运行的 CLI 指令列表。Docker 命令列表庞大但已标准化:无论内容、基础设施或其他环境变量如何,Docker 操作的工作方式都是相同的。

Docker 文档:Docker 文档是指用于构建容器化应用程序的官方 Docker 资源、手册和指南库。

Docker Hub:Docker Hub 6是 Docker 映像的公共存储库,自称是世界上最大的容器映像库和社区7。它存储有超过 10 万个来自商业软件供应商、开源项目和个人开发人员的容器映像。Docker Hub 包括 Docker, Inc. 生成的映像、属于 Docker Trusted Registry 的认证映像以及数千个其他映像。

所有 Docker Hub 用户都可以随意共享他们的映像。他们还可以从 Docker 文件系统中下载预定义的基础映像,以作为任何容器化项目的起点。

还存在其他映像存储库,包括 GitHub 8。GitHub 是一种存储库托管服务,以应用程序开发工具和促进协作和沟通的平台而闻名。Docker Hub 用户可以创建一个能容纳很多映像的存储库。存储库可以是公共存储库,也可以是私有存储库,并且可以链接到 GitHub 或 BitBucket 帐户。

Docker Desktop:Docker Desktop 是一款适用于 Mac 或 Windows 的应用程序,包括 Docker Engine、Docker CLI 客户端、Docker Compose、Kubernetes 等。它还提供对 Docker Hub 的访问。

Docker 注册表:Docker 注册表是用于 Docker 映像的可扩展的开源存储和分发系统。它使开发人员能够通过使用标记进行识别来跟踪存储库中的映像版本。这种跟踪和识别是使用 Git(一种版本控制工具)完成的。

Docker 插件:开发人员使用插件来增强 Docker Engine 的功能。Docker Engine 插件系统中包含多个支持授权、卷和网络的 Docker 插件;也可以加载第三方插件。

Docker 扩展:利用 Docker 扩展,开发人员将能够在 Docker Desktop 中使用第三方工具来扩展其功能。开发人员工具的扩展包括 Kubernetes 应用程序开发、安全性、可观察性等。

Docker Compose:开发人员可以使用 Docker Compose 管理多容器应用程序,其中所有容器都在同一台 Docker 主机上运行。Docker Compose 创建一个 YAML (.YML) 文件,该文件指定在应用程序中包含哪些服务,并且可以使用一个命令部署和运行容器。由于 YAML 语法与语言无关,因此,可以在以 Java、Python、Ruby 和很多其他语言编写的程序中使用 YAML 文件。

开发人员还可以使用 Docker Compose 定义用于存储的持久卷,指定基础节点以及记录和配置服务依赖项。

Kubernetes 和容器编排

仅运行几个容器时,在 Docker Engine(业界事实上的运行时)中管理应用程序非常简单。然而,对于包含数千个容器和数百个服务的部署,如果没有容器编排工具,几乎不可能监控和管理容器生命周期。

虽然 Docker 包含自己的编排工具(称为Docker Swarm),但 Kubernetes 是行业标准。其他流行的容器编排平台包括 Apache Mesos 和 Nomad。

Kubernetes 是一个开源容器编排平台,源自 Google 为内部使用而开发的一个项目 Borg。Kubernetes 于 2014 年向公众推出,它可以安排和自动执行基于容器架构的管理所必需的任务,包括容器部署、更新、服务发现、存储配置、负载平衡、运行状况监控等。2015 年,Google 将 Kubernetes 捐赠给了 Cloud Native Computing Foundation (CNCF)9,这是一个开源、供应商中立的云原生计算中心。

此外,通过使用 Kubernetes 的开源工具生态系统(包括 IstioKnativeTekton),组织可以为容器化应用程序部署高生产率的 平台即服务 (PaaS)。该生态系统还为无服务器计算提供更快的入门途径。

Docker 和容器行业标准

在 Docker 捐赠了容器映像规范和运行时代码 runc 之后,开放容器倡议 (OCI) 10于 2015 年成立,它是一个 Linux 基金会项目,致力于围绕容器映像格式和运行时创建开放的行业标准。OCI 由 Docker、IBM 和 Red Hat® 等领先公司组成。它支持创新,同时帮助企业避免供应商锁定。

虽然 Docker 是最知名、使用频率最高的容器技术,但更广泛的生态系统已经对 Containerd 和其他替代方案,包括 LXC、CRI-O、Podman 等进行了标准化。2017 年,Docker 将 Containerd 项目捐赠给了 CNCF。Containerd 是使用 runc 的行业标准容器运行时,是 Docker Engine 的核心容器运行时。

Docker 安全

容器化工作负载的复杂性需要实施和维护安全控制,以保护容器及其底层基础设施。Docker 容器安全实践旨在保护容器化应用程序免受安全漏洞、恶意软件和不法分子威胁等风险。

由于 Docker 容器彼此隔离且与主机系统隔离,因此在设计上具有固有的安全级别。但这种隔离并不是绝对的。Docker 安全性围绕着一个整体零信任框架,该框架涵盖容器的运行时、构建和编排。

Docker 和其他容器相关的安全需求增加了 DevSecOps 的普及度。这是一种安全方法,可在软件开发生命周期的每个阶段(从初始设计到集成、测试、交付和部署)自动集成安全实践。此外,Docker 安全最佳实践包括第三方容器安全工具和解决方案,包括扫描和监控,可以在安全问题影响生产之前检测它们。

Docker 用例

云迁移

Docker 的可移植性简化并加快了跨不同环境的云迁移过程,无论是将数据、应用程序和工作负载从本地数据中心迁移到基于云的基础架构,还是从一个云环境迁移到另一个云环境。

微服务架构(微服务)

根据 Statista 的数据,超过 85% 的全球大型企业在应用程序开发中使用微服务11。Docker 通过每个微服务的容器化以及独立扩展和管理来简化应用程序部署,从而消除了开发人员需要配置和管理特定环境的需求。

持续集成和持续交付 (CI/CD)

Docker 是持续集成持续交付 (CI/CD) 管道的理想选择,因为它为测试和部署应用程序提供了一致的环境,从而减少了部署过程中可能出现的错误。

DevOps

将微服务作为软件开发方法,同时结合 Docker,可为开发运维团队奠定坚实的基础。这样,他们将能够采用敏捷实践进行快速迭代和实验,这对于按照市场要求的速度交付软件和服务至关重要。

混合/多云部署

像 Docker 这样的轻量级容器化技术可以让应用程序在不同环境间轻松迁移。所有主要云服务提供商都提供与 Docker 相关的开发和管理服务,支持在混合云环境中运行 Docker,从而让本地部署、公有云私有云边缘设置实现统一。Docker 可以轻松部署在多云 IT 基础设施中,多云IT 基础设施是指来自多个云供应商的云服务。

容器即服务 (CaaS)

容器即服务 (CaaS) 使开发人员能够管理和部署容器化应用程序,以便轻松地大规模运行 Docker 容器。所有主要的 CSP 都在提供基础设施即服务 (IaaS)、软件即服务 (SaaS) 等的同时提供 CaaS,作为其云服务组合的一部分。

人工智能/机器学习 (AI/ML)

Docker 通过快速、简单、可移植的应用程序开发加速人工智能机器学习开发,加速创新并缩短上市时间。此外,Docker Hub 还拥有数百个 AL/ML 映像,可以进一步支持 AL/ML 开发团队。2023 年,Docker 推出了 Docker AI12,它能在开发人员编辑 Dockerfile 或 Docker Compose 文件时,为他们提供针对具体上下文的自动指导。

相关解决方案
IBM Red Hat OpenShift

Red Hat OpenShift on IBM Cloud 是一个完全托管的 OpenShift 容器平台 (OCP)。

探索 Red Hat OpenShift
容器解决方案

容器解决方案能够运行和扩展容器化工作负载,并实现安全性、开源创新和快速部署。

深入了解容器
云咨询服务

利用 IBM 的云咨询服务发掘新功能并提升业务敏捷性。了解如何通过混合云战略和专家合作共同制定解决方案、加快数字化转型并优化性能。

云服务
采取后续步骤

使用 IBM 的容器解决方案实现基础架构现代化。通过使用 IBM 的综合容器平台,跨环境灵活、安全、高效地运行、扩展和管理容器化工作负载。

深入了解容器解决方案 创建免费 IBM Cloud 帐户