You are on page 1of 5

Containers 101 Docker fundamentals.

md 2023/4/6

Containers 101 Docker fundamentals


Docker 于 2012 年作为一个开源项目启动,最初名为 dotcloud,用于构建单一应用程序 Linux 容器。从那时
起,Docker 已成为一种非常流行的开发工具,越来越多地用作运行时环境。很少有(如果有的话)技术像
Docker 一样迅速受到开发人员的欢迎。

Docker 如此受欢迎的一个原因是它实现了“一次开发,随处运行”的承诺。 Docker 提供了一种将应用程序及其


运行时依赖项打包到单个容器中的简单方法;它还提供了一个运行时抽象,使容器能够跨不同版本的 Linux 内
核运行。

使用 Docker,开发人员可以在他或她的工作站上制作容器化应用程序,然后轻松地将容器部署到任何支持
Docker 的服务器。无需为服务器环境重新测试或调整容器,无论是在云端还是在本地。

Also on InfoWorld:Kill snowflakes so the cloud can take their place

此外,Docker 提供了软件共享和分发机制,允许开发人员和运营团队轻松共享和重用容器内容。这种分发机制
与跨机器的可移植性相结合,有助于解释 Docker 在运营团队和开发人员中的受欢迎程度。

Docker components
Docker既是一个开发工具,也是一个运行时环境。要了解Docker,首先要了解Docker容器映像的概念。容器总
是以映像(Image)开始,并被视为该映像的实例。映像是容器在运行时应该是什么的静态规范,包括容器内
的应用程序代码和运行时配置设置。 Docker 映像包含只读层,这意味着一旦创建了映像,它就永远不会被修
改。

图 1 显示了容器映像的示例。此映像描述了带有 Apache 安装的 Ubuntu 映像。该映像由三个基本 Ubuntu 层


和一个更新层组成,顶部是一个 Apache 层和一个自定义文件层。

1/5
Containers 101 Docker fundamentals.md 2023/4/6

运行中的 Docker 容器是映像的实例化。从同一映像派生的容器在应用程序代码和运行时依赖性方面彼此相


同。但与只读的映像不同,运行中的容器在只读内容之上包含一个可写层(容器层)。运行时更改,包括对数
据和文件的任何写入和更新,都保存在容器层中。因此,共享同一底层映像的多个并发运行的容器可能具有截
然不同的容器层。

当一个正在运行的容器被删除时,可写容器层也会被删除,不会持久化。保留更改的唯一方法是在删除容器之
前执行显式 docker commit 命令。当你执行一个 docker commit 命令时,正在运行的容器内容,包括可写
层,被写入一个新的容器映像并存储到磁盘中。这成为一个新的映像,不同于实例化容器的映像。

图 2 描述了映像和运行中的容器之间的区别。请注意,每个正在运行的容器都可以有不同的可写层。

2/5
Containers 101 Docker fundamentals.md 2023/4/6

除了映像概念之外,Docker 还有一些不同于传统 Linux 容器的特定组件。

Docker守护进程。 Docker 守护进程也称为 Docker 引擎,是容器和 Linux 内核之间的一个薄层。


Docker 守护进程是管理应用程序容器的持久运行时环境。任何 Docker 容器都可以在任何启用 Docker
守护进程的服务器上运行,而不管底层操作系统是什么。
Dockerfile。 开发人员使用 Dockerfiles 构建容器映像,然后成为运行容器的基础。 Dockerfile 是一个文
本文档,其中包含组装容器映像所需的所有配置信息和命令。使用 Dockerfile,Docker 守护进程可以自
动构建容器映像。这个过程大大简化了创建容器的步骤。

更具体地说,在 Dockerfile 中,您首先指定基础映像以便开始构建过程。然后指定一系列命令,之后可以构建


新的容器映像。

Docker 命令行界面工具。 Docker 提供了一组 CLI 命令来管理基于映像的容器的生命周期。 Docker 命


令涵盖构建、导出和标记等开发功能,以及运行、删除、启动和停止容器等运行时功能。

您可以针对特定的 Docker 守护程序或Registry执行 Docker 命令。例如,如果您执行 docker -ps 命令,


Docker 将返回在守护进程上运行的容器列表。

Content distribution with Docker


除了运行时环境和容器格式之外,Docker 还提供了一种软件分发机制,通常称为Registry,用于促进容器内容
的发现和分发。

Registry的概念对于 Docker 的成功至关重要,因为它提供了一组实用程序来打包、运送、存储、发现和重用容


器内容。 Docker 公司运行着一个公共的、免费的Registry,称为 Docker Hub。

3/5
Containers 101 Docker fundamentals.md 2023/4/6

Registry。 Docker Registry是发布和存储容器映像的地方。Registry可以是远程的或本地的。它可以是公


开的,因此每个人都可以使用它,也可以是私有的,仅限于一个组织或一组用户。 Docker Registry附带
一组通用 API,允许用户构建、发布、搜索、下载和管理容器映像。
Docker Hub。 Docker Hub 是一个公共的、基于云的容器注册中心,由 Docker 管理。 Docker Hub 提
供映像发现、分发和协作工作流支持。另外,Docker Hub 有一套经过 Docker 认证的官方映像。这些是
来自 Canonical、Red Hat 和 MongoDB 等知名软件发行商的映像。您可以使用这些官方映像作为构建您
自己的映像或应用程序的基础。

图 3 描述了一个工作流,在该工作流中,用户构建映像并将其上传到Registry。其他用户可以从Registry中拉取
映像来制作生产容器并将它们部署到 Docker 主机,无论他们身在何处。

The immutability of Docker containers


Docker 容器最有趣的特性之一是它们的不变性和由此产生的无状态性容器。

正如我们在上一节中所述,Docker 映像一旦创建就不会更改。从映像派生的运行容器有一个可写层,可以临时
存储运行时的变化。如果容器在删除之前使用 docker commit 提交,可写层中的更改将保存到一个与之前的
映像不同的新映像中。

为什么不变性很好?不可变的映像和容器导致不可变的基础设施,不可变的基础设施有许多传统系统无法实现
的有趣好处。这些好处包括:

版本控制。 通过要求生成新映像的显式提交,Docker 强制您进行版本控制。您可以跟踪映像的连续版


本;回滚到以前的映像(因此回滚到以前的系统组件)是完全可能的,因为以前的映像被保留并且永远
不会被修改。
更清晰的更新和更易于管理的状态更改。 有了不可变的基础架构,您不再需要升级您的服务器基础架
构,这意味着无需更改配置文件、无需软件更新、无需操作系统升级等。当需要更改时,您只需制作新
容器并将其推出以替换旧容器即可。这是一种更加离散和易于管理的状态更改方法。

4/5
Containers 101 Docker fundamentals.md 2023/4/6

最小化漂移。 为避免漂移,您可以定期主动刷新系统中的所有组件,以确保它们是最新版本。与传统
的、庞大的软件相比,使用封装较小系统组件的容器更容易实现这种做法。

The Docker difference


Docker 的映像格式、广泛的容器管理 API 和创新的软件分发机制使其成为开发和运营团队的热门平台。
Docker 为组织带来了这些显着的好处。

最小的声明式系统。 如果 Docker 容器是小型的、单一用途的应用程序,则它们是最好的。这产生了最


小尺寸的容器,进而支持快速交付、持续集成和持续部署。
可预测的操作。 系统运行最头疼的一直是基础设施或应用程序看似随机的行为。通过强制您进行更小、
更易于管理的更新,并提供一种最小化系统漂移的机制,Docker 可以帮助您构建更可预测的系统。当漂
移被消除时,您可以保证无论您部署多少次,该软件将始终以相同的方式运行。
广泛的软件重用。 Docker 容器重用来自其他映像的层,这自然促进了软件重用。通过Registry共享
Docker 映像是大规模组件重用的另一个很好的例子。
真正的多云可移植性。 Docker 允许容器在不同的云平台、本地基础设施和开发工作站之间自由迁移,从
而实现真正的平台独立性。

Docker 已经在改变组织构建系统和提供服务的方式。它开始重塑我们对软件设计和软件交付经济学的思考方
式。在这些变化真正扎根之前,组织需要更好地了解如何管理 Docker 环境的安全性和策略。但这是另一篇文
章的主题。

5/5

You might also like