Docker 基础知识

2025-05-26

Docker 基础知识

介绍

Docker 是近年来最流行的软件工具之一,它彻底改变了软件安装和部署的流程。然而,解释 Docker 是什么以及 Docker 解决了什么问题一直颇具挑战性。

在这篇文章中,我回答了以下问题 -

快速笔记

整篇文章都基于我从 Stephen Grider 的 Udemy 课程中学到的概念。课程链接可以在这里找到。

为什么要使用 Docker?

在了解 Docker 是什么之前,让我们先尝试了解 Docker 想要解决的问题。

替代文本

上图详细说明了用户在计算机上安装软件时所涉及的步骤。用户在安装过程中遇到一些错误,并会反复执行上述工作流程图中所示的步骤。

通常,当用户尝试联系其他支持小组时,他会意识到安装过程和遇到的错误会根据底层操作系统和软件所依赖的库集而有所不同。而这正是 Docker 所解决的问题。

Docker 提供了一个环境(容器),允许用户安装和运行软件,而无需担心设置或依赖关系。换句话说,在 Windows、MacOS 或 Linux 操作系统中安装该软件的用户将体验到相同的行为,因此故障排除/调试将与底层操作系统无关。

什么是 Docker?

Docker 是一个围绕创建和运行容器的不同项目、工具和软件的平台或生态系统。

替代文本

那么,什么是 Docker 容器?为了回答这个问题,我们必须首先回顾一下操作系统的基本原理。

操作系统基础

下图简要概述了 Linux 操作系统。

替代文本

从该图可以看出,内核是运行的软件,它控制着计算机上运行的程序与连接到计算机的物理硬件之间的访问。

当用户通过软件发出命令时,例如通过 Spotify 播放一首歌曲,该命令会由软件程序通过系统调用传达给内核。每个程序都有一个唯一的系统调用来与内核通信。

内核接收命令并与硬盘/内存进行通信,找到软件所要播放的歌曲。

命名空间和控制组

从上面的例子,让我们假设一个假设场景,其中两个软件程序,比如 Photoshop 和 Spotify,需要不同版本的 Python 软件。

替代文本

可以通过称为命名空间的概念来实现根据请求软件拥有单独的 Python 版本。

命名空间

命名空间是将专用硬件资源分配给单个进程或一组进程的过程。

替代文本

在上面的例子中,可以使用命名空间对硬盘进行分段以安装特定版本的 Python 软件。

当软件发出与硬盘交互的调用时,内核会确定哪个进程正在发出系统调用,并根据软件运行所需的版本将该调用重定向到相应的段。下图解释了这一点。

替代文本

下图描述了如何使用命名空间来隔离网络、用户、主机名等资源。

替代文本

对照组

控制组 (cgroups) 用于限制或控制特定进程或一组进程可用的资源量。

替代文本

在上图中,使用控制组可以限制进程可用的内存、CPU、硬盘 I/O 和网络带宽。

注意:命名空间和控制组的功能特定于 Linux 操作系统。

Docker容器

现在我们已经建立了命名空间和控制组的概念,容器可以简单地解释为一个进程或一组进程,其中有一组专门分配给它的资源。

回到上面的例子,容器可以被描述为进程的逻辑分组。容器分配的资源如下所示。

替代文本

因此,本质上,容器是一种逻辑结构,它包含一个进程或一组进程,并为其分配了专用资源。下图对此进行了总结。请注意,容器内的部分硬盘、内存、CPU 和网络资源专用于进程。

替代文本

现在我们已经了解了什么是 Docker 容器,让我们来了解一下什么是 Docker 镜像以及 Docker 镜像和 Docker 容器之间的关系是什么。

Docker 镜像

Docker 镜像是一个文件系统快照,用于创建容器并运行其中定义的任何进程。

Docker 镜像可以被视为蓝图,而根据蓝图创建的实例则成为容器。

替代文本

下图详细解释了图像如何转变为容器的逐步过程。

替代文本

步骤 1 - 文件系统快照的内容(在本例中为 Photoshop 和 Python 相关文件)被复制到硬盘上。

步骤 2 - 执行文件系统中指定的“运行 Photoshop”命令。这将从硬盘内部运行应用程序,现在 Photoshop 已作为容器内的进程运行。

请注意,Photoshop 应用程序通过内核(位于容器外部)与分配给该应用程序的硬件资源进行通信。

结论

我希望本文能够帮助您理解 Docker、Docker 镜像和 Docker 容器的基础知识。Docker 生态系统中还有其他组件,例如 Docker 客户端、Docker 服务器、Docker Hub,它们也有助于创建、管理和部署 Docker 容器。

感谢您阅读这篇文章,请不要忘记通过 Twitter @skaytech与我联系。

如果您喜欢这个,您可能还会喜欢:

文章来源:https://dev.to/skaytech/docker-fundamentals-2ibi
PREV
“你为什么想为我们工作?”——面试问题(揭秘)引言 免责声明 我问这个问题的目的是什么? 调研公司 职位描述 X因素 异常值 结束语
NEXT
Webpack 基础介绍 简介 Webpack 是什么?Webpack 有什么用?安装 Webpack 配置文件 运行 Webpack Webpack DevServer 总结