← 所有题目
什么是 Docker,它是如何工作的?
经常初级DevOps

什么是 Docker,它是如何工作的?

简短答案
Docker 是一个开放平台,用于将应用程序打包并作为容器运行: 共享主机 Linux 内核的隔离进程(通过命名空间和 cgroup) 而不需要完整的虚拟机。它使用客户端-服务器模型: docker 客户端通过 REST API 将命令发送到 dockerd 守护程序,该守护程序 构建镜像并从中运行容器。

为什么存在。 Docker 允许您将应用程序及其所有依赖项(库、配置、运行时)打包到单个工件(映像)中,并在开发人员笔记本电脑、CI 和生产中以相同的方式运行它。这解决了经典的“在我的机器上运行”问题。

容器与虚拟机。 VM 虚拟化硬件并提供带有自己内核的整个来宾操作系统。容器是一个使用主机内核的隔离进程。因此,容器更轻,启动只需几分之一秒,并且使用的资源更少。但容器不是轻量级虚拟机:它与主机内核绑定,并且其隔离边界比虚拟机弱。虚拟机具有硬件强制隔离,而共享内核中的漏洞可能会从容器中逃脱——这是速度和密度的权衡。主机必须与容器类型匹配:Linux 容器需要 Linux 内核,Windows 容器需要 Windows 内核。在 macOS 和 Windows 上,Docker Desktop 透明地运行小型 Linux VM(例如通过 WSL2),因此 Linux 容器共享该 VM 的内核,而不是操作系统的内核。

架构(客户端-服务器)。 根据 Docker 的文档:

  • docker 客户端是用户与 Docker 交互的主要方式;像 docker run 这样的命令被发送到守护进程。
  • dockerd 守护进程“承担构建、运行和分发容器的繁重工作”,并管理图像、容器、网络和卷等对象。
  • 客户端通过 UNIX 套接字或网络接口通过 REST API 与守护进程通信,因此它们可以在不同的计算机上运行。
  • 注册表存储图像;默认的公共是 Docker Hub。

镜像和容器。 一个方便的比喻:镜像就像一个类(或磁盘上的程序),而容器是它的一个实例(一个正在运行的进程);您可以从一个镜像启动多个容器。

  • 图像是一个只读模板,其中包含创建从层构建的容器的说明。它由 Dockerfile 定义;当您更改它时,只会重建更改的图层。
  • 容器是图像的可运行实例。在图像的只读层之上,它添加了一个薄的可写层(写时复制);当容器被删除时,写入其中的任何内容都会丢失 - 这正是持久数据需要卷的原因。

隔离如何工作(在底层)。 dockerd 不直接调用内核 - 它将容器生命周期管理委托给 containerd,后者调用 OCI 运行时;在 Docker 中,默认值为 runc,但运行时是可插入的(crun、gVisor、Kata 等)。实际的隔离来自Linux内核特性:

  • 命名空间 隔离资源(根据 man7 页面,有 8 种类型:PID、网络、挂载、UTS、IPC、用户、cgroup、时间)。进程只能“看到”它自己的 PID、它自己的网络堆栈等等。
  • cgroups(控制组) 限制和计算资源使用情况(CPU、内存、I/O)。

常见后续操作。 图像图层被缓存; docker compose 运行多容器应用程序;数据通过卷持久保存(默认情况下容器是短暂的); OCI 标准化了图像格式 (image-spec)、运行时 (runtime-spec) 和注册表分发协议 (distribution-spec)——这三个规范保持了生态系统的互操作性。

Docker容器

立即下载,免费试用,解决你的任务!

下载 Windows 版
10 15 个免费积分 • 无需信用卡版本: 加载中…

免安装 - 下载即用。免注册 - 用 Google 登录。