Docker 是一个开源的应用容器引擎,基于 Go 语言开发。它允许开发者将应用程序及其所有的依赖包打包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 操作系统的机器上。

容器 = CGroup + Namespace + Rootfs + 容器引擎。

容器就是利用 Linux 内核提供的 CGroup 和 Namespace 等技术,将一系列进程隔离在相互独立的环境中进行运行。

实际上,在现代的 Linux 发行版中,任何一组进程都是容器化的:

  • /proc/PID/cgroup 文件保存了进程所属的控制组。
  • /proc/PID/status 文件保存了进程的 Capability 信息。
  • /proc/PID/ns 保存了进程的命名空间。

容器运行时是实现容器的生命周期管理的工具:

  • 容器运行时分为低层(Low‑Level)运行时和高层(High‑level)运行时。
  • 低层运行时调整上述资源限制、安全限制和命名空间,并启动一组受限的进程。典型代表就是 runc。
  • 高层运行时(容器引擎)建立在低层运行时的基础之上,提供 Web API、镜像管理、
  • 容器生命周期管理功能。典型代表是 Containerd(以及基于 Containerd 实现的 Docker)、Podman、CRI‑O。

这个流程体现了 Kubernetes "上层编排调度 + 下层标准化运行时" 的架构设计特点。

kubelet → CRI‑O → runc → Linux 内核

kubelet → containerd → containerd‑shim → runc → Linux 内核

容器镜像是一个分层存储的归档文件(通常为 Tar 格式),包含运行容器所需的所有静态文件和元数据。其核心设计遵循开放容器倡议(OCI)标准,主要包含以下两部分

  • 文件系统层(rootfs):提供容器的根文件系统(rootfs),与宿主机的文件系统隔离,是容器内进程看到的文件系统视图。
  • 配置元数据(JSON 文件):定义容器的运行时行为,包括进程配置、安全权限、环境变量等。关键文件(OCI 标准)有 config.json,包含容器运行时配置;manifest.json,描述镜像的层级结构和配置文件的路径;layer.tar,每个文件系统层对应的压缩包,存储实际文件内容。

容器分为两大类,按照应用场景的不同:

  • 系统容器:专注于模拟系统的整个独立的用户环境,提供完整的交互体验。LXC、LXD、Incus。
  • 应用容器:专注于提供单个服务,容器内的 Rootfs 会进行高度裁剪。Docker、Podman。

为什么要用容器?

容器与虚拟机的技术对比:

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐