mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
6447 字
18 分钟
什么是容器?
2021-01-08

某互联网公司的运维团队曾经历过这样的噩梦:新版本上线,开发说”在我机器上能跑”,测试环境也通过了,可一部署到生产环境就崩溃,缺少系统依赖、路径不一致、端口冲突……每次发布都像拆盲盒。直到团队引入容器技术,用 Docker 把应用和运行环境一起打包成镜像,从开发、测试到生产环境完全一致,部署才终于从”惊险操作”变成了”例行公事”。

这个故事几乎每个运维人都经历过。但容器解决这个问题的方法,并不是”把环境打包”这么简单,它背后是一套完全不同于虚拟机的隔离哲学,而理解这套哲学,是理解整个云原生技术栈的起点。

一、容器不是”更轻的虚拟机”#

很多人把容器理解为”轻量级虚拟机”:启动更快、占用更少、密度更高。这个类比在直觉上说得通,但在技术上是错的,而且会误导你的架构决策。

1.1 虚拟机:硬件级强隔离#

虚拟机的隔离边界在硬件层。Hypervisor 利用 Intel VT-x / AMD-V 的 CPU 虚拟化扩展,让每个 VM 拥有独立的操作系统内核。Guest OS 执行特权指令时触发 VM Exit 陷入 Hypervisor,Hypervisor 仲裁后再通过 VM Entry 返回。这是一道硬件级的墙,即使 Guest OS 内核被攻破,攻击者仍被挡在 Hypervisor 之外。

代价是每个 VM 必须携带完整的操作系统:内核、init 系统、设备驱动、系统服务……一个 Ubuntu Server 镜像动辄数百 MB,启动需要经历完整的内核初始化流程,耗时秒到分钟级。

1.2 容器:内核级软隔离#

容器没有独立的内核。它和宿主机共享同一个 Linux 内核,隔离完全依赖两个内核特性:

  • Namespace:隔离”看到什么”:每个容器有独立的进程树、网络栈、文件系统挂载点、用户 ID 空间
  • cgroups:限制”能用多少”:CPU 时间、内存上限、磁盘 I/O、网络带宽都可以精确控制

创建容器本质上就是在 clone() 系统调用时设置 Namespace 标志位,进程进入新的隔离视图。没有硬件虚拟化的开销,没有内核初始化的等待,容器启动就是创建进程,毫秒级完成。

1.3 这个区别决定了架构选型#

维度虚拟机容器
隔离边界硬件级(VT-x + Hypervisor)内核级(Namespace + cgroups)
内核每个 VM 独立内核共享宿主机内核
隔离强度强:内核被攻破仍被挡住较弱:内核漏洞可能导致逃逸
镜像大小GB 级(含完整 OS)MB 级(仅应用 + 依赖库)
启动时间秒~分钟级毫秒~秒级
资源密度单机数十个 VM单机数百个容器
性能损耗5%~10%(硬件辅助后)<1%(接近原生)

这个对比表不是要分高下,而是要说明:容器和虚拟机解决的不是同一个问题。虚拟机解决的是”强隔离”:不同租户、不同安全域之间的硬边界;容器解决的是”高密度部署”:同一安全域内大量同质工作负载的编排效率。

金融、政务等安全敏感场景至今仍以 VM 作为租户边界,原因就在于此,共享内核意味着 Dirty COW(CVE-2016-5195)、runc 逃逸(CVE-2019-5736)这类内核漏洞可能让攻击者从容器逃逸到宿主机。这也是 gVisor(Google,用户态内核沙箱)和 Kata Containers(轻量级 VM 封装容器)等”安全容器”方案存在的原因,它们试图兼顾容器的轻量和 VM 的隔离性。

二、容器的技术根基:从 chroot 到 Namespace + cgroups#

容器不是 Docker 发明的。Linux 内核的隔离能力经历了二十年的演进,Docker 只是把它们整合成了工程师友好的工作流。

2.1 chroot:最早的”容器”(1979 年)#

chroot() 系统调用让进程拥有独立的根文件系统视图:进程以为 / 就是整个世界,看不到外面的文件。这是 1979 年 Version 7 Unix 就有的特性。

但 chroot 只隔离了文件系统。进程仍然能看到宿主机的进程、网络、用户,也能消耗无限资源。一个 chroot 进程可以轻松发起 DoS 攻击,占满宿主机的 CPU 和内存。

2.2 FreeBSD Jail 与 Solaris Zones:更强的隔离(2000 年)#

chroot 的局限催生了更强的方案。FreeBSD Jail 在 chroot 基础上增加了进程隔离、网络隔离和资源限制;Solaris Zones 则提供了更完整的操作系统级虚拟化。

这些方案证明了一件事:不需要硬件虚拟化,也能实现可用的隔离。但它们各自为政,没有形成统一标准,也没有解决”如何方便地打包和分发应用”的问题。

2.3 Linux Namespace + cgroups:容器的技术基础#

Linux 走了自己的路,用两个正交的机制组合出灵活的隔离:

Namespace(隔离”看到什么”):

Namespace内核版本隔离的资源
Mount2.4.19 (2002)文件系统挂载点
UTS2.6.19 (2006)主机名和 NIS 域名
IPC2.6.19 (2006)System V IPC、POSIX 消息队列
Network2.6.24 (2008)网络接口、路由表、防火墙规则
PID3.8 (2013)进程 ID 空间
User3.8 (2013)用户/组 ID(容器内 root 可映射为宿主机普通用户)
Cgroup4.6 (2016)cgroup 视图
Time5.6 (2020)系统时钟偏移

cgroups(限制”能用多少”):

# CPU 限制:每 100ms 调度周期内最多使用 50ms(相当于 0.5 核)
echo 100000 > /sys/fs/cgroup/cpu/mycontainer/cpu.cfs_period_us
echo 50000 > /sys/fs/cgroup/cpu/mycontainer/cpu.cfs_quota_us
# 内存限制:最多使用 512MB(超出触发 OOM Kill)
echo 536870912 > /sys/fs/cgroup/memory/mycontainer/memory.limit_in_bytes
# 磁盘 I/O 限制:对 sda 写入速度限制为 10MB/s
echo "8:0 10485760" > /sys/fs/cgroup/blkio/mycontainer/blkio.throttle.write_bps_device

Namespace 和 cgroups 的组合是正交的:你可以只用 Namespace 不用 cgroups(隔离但不限资源),也可以只用 cgroups 不用 Namespace(限资源但不隔离视图)。容器是两者同时启用的结果。

Warning

关键结论:Namespace 隔离”视图”,cgroups 限制”资源量”,但内核本身是共享的。这是容器隔离相对 VM 更弱的根本原因,也是架构选型时必须考虑的约束。

三、Docker 的范式转变:不是技术,是工作流#

2013 年 Docker 开源时,Namespace 和 cgroups 已经存在多年,LXC 也已经提供了类似容器的功能。Docker 的最大贡献不是技术本身,而是把这些技术整合成了工程师友好的工作流,这才是它引发范式转变的原因。

3.1 Docker 解决的三个核心问题#

问题一:环境一致性。Dockerfile 声明式地描述镜像构建过程,docker build 产出不可变的镜像,docker run 在任何环境创建完全一致的容器实例。“在我机器上能跑”的问题从根本上被消除了,因为”我的机器”和”你的机器”运行的是同一个镜像。

问题二:应用打包与分发。Docker Registry(如 Docker Hub)让镜像分发像 git push/pull 一样简单。在此之前,应用部署需要手动安装依赖、配置环境、同步版本;Docker 之后,一条 docker pull 搞定一切。

问题三:分层复用。基于 OverlayFS 的分层镜像让多个容器共享相同的基础层,只各自存储变更内容。10 个基于 ubuntu:22.04 的容器,基础层只在磁盘上存一份,内存中的共享库页也由内核统一管理。

# Dockerfile 示例:每一层只存储变更
FROM ubuntu:22.04 # 基础层:所有容器共享
RUN apt-get update # 系统层:依赖更新
COPY app /opt/app # 应用层:仅应用代码
CMD ["python", "app.py"] # 启动命令:不产生新层

3.2 多阶段构建:镜像优化的关键#

一个常见的错误是把编译环境和运行环境塞进同一个镜像。多阶段构建解决了这个问题:编译阶段使用完整的 SDK 镜像,运行阶段只拷贝编译产物到一个精简的基础镜像:

# 编译阶段:完整的 Go SDK
FROM golang:1.21 AS builder
WORKDIR /build
COPY . .
RUN go build -o app
# 运行阶段:只有 5MB 的 Alpine
FROM alpine:3.18
COPY --from=builder /build/app /usr/local/bin/
CMD ["app"]

最终镜像从数百 MB 压缩到几 MB,攻击面也大幅缩小,Alpine 没有 Go 编译器,没有源代码,攻击者能利用的东西少得多。

3.3 OCI 标准:Docker 的遗产#

Docker 推动 OCI(Open Container Initiative)规范统一了容器镜像格式(Image Spec)和运行时接口(Runtime Spec)。这意味着 containerd、CRI-O 等运行时可以替代 Docker 运行 OCI 标准镜像,Kubernetes 从 1.24 版本开始直接使用 containerd 而不再依赖 dockershim。

Docker 的商业命运并不重要,它确立的工作流和推动的标准,已经成为行业基础设施。

四、容器网络:为什么 bridge 是默认模式#

容器的网络模型是理解微服务通信和 Kubernetes 网络的基础。

4.1 五种网络模式#

模式原理什么时候用
bridge容器通过虚拟网桥 docker0 连接,经 NAT 访问外部开发测试、单机部署:最简单,所以是默认
host容器直接使用宿主机网络栈,无隔离需要极致网络性能(如高性能网关),但牺牲了隔离性
overlay跨主机封装(VXLAN),实现跨节点容器通信Docker Swarm / Kubernetes 跨节点通信
macvlan为容器分配独立 MAC 地址,直接出现在物理网络需要容器直接暴露在局域网(如遗留系统对接)
none禁用网络安全敏感任务、只需文件 I/O 的批处理

bridge 成为默认不是偶然:它在隔离性和便利性之间取得了最好的平衡:容器之间通过 docker0 互通,对外通过 NAT 访问,配置最简单。但 NAT 带来的端口映射和性能损耗,在跨节点场景下不可接受,这就是 overlay 和 CNI 存在的原因。

4.2 从 Docker 网络到 Kubernetes CNI#

Docker 的网络模型是单机视角:docker0 网桥只解决同一台主机上的容器互通。Kubernetes 需要跨节点通信,于是定义了 CNI(Container Network Interface)规范,让 Calico、Cilium、Flannel 等插件各自实现跨节点网络方案。

Cilium 基于 eBPF 将网络策略直接注入内核,是目前性能最佳的 CNI 方案之一。它不依赖 iptables(规则数量线性增长时性能急剧下降),而是用 eBPF 程序在内核网络路径上做 O(1) 的策略匹配。

五、容器存储:为什么容器是无状态的#

容器的文件系统是分层的:底层是只读的镜像层,顶层是可写的容器层。容器删除后,容器层的所有修改随之消失。这不是缺陷,而是设计选择。

5.1 为什么设计成无状态#

无状态是容器弹性伸缩的前提。如果容器的数据写在容器内部,水平扩展时新容器没有旧数据,缩容时被删除的容器带走数据。把状态外置到 Volume,容器本身变成可随时创建和销毁的”无状态计算单元”,这正是 Kubernetes Pod 调度和 HPA 弹性伸缩的基础。

5.2 存储驱动:overlay2 为什么是生产推荐#

驱动原理为什么 overlay2 胜出
overlay2OverlayFS 层叠加内核主线支持、性能好、Docker 默认、社区最活跃
devicemapper块设备映射历史遗留,thin provisioning 配置复杂
btrfs文件系统级 COW功能丰富但稳定性争议大,运维门槛高
zfs高级文件系统特性最强但内存占用大,生产环境经验少

overlay2 胜出的原因很简单:它是最小惊讶原则的体现:基于内核主线文件系统,行为可预测,问题可排查。生产环境选存储驱动,稳定性比特性丰富更重要。

5.3 数据的三种外置方式#

Kubernetes 把容器的状态外置为三种 Volume:

  • PersistentVolumeClaim(PVC):持久化数据(数据库文件、用户上传),生命周期独立于 Pod
  • ConfigMap:配置文件(nginx.conf、application.yaml),只读注入
  • Secret:敏感信息(数据库密码、TLS 证书),Base64 编码存储,RBAC 控制访问

六、容器安全:纵深防御,不是单一银弹#

容器安全不是”用 alpine 镜像就安全了”这么简单。共享内核意味着攻击面比 VM 大得多,需要多层防御。

6.1 镜像安全:最小化攻击面#

# 安全 Dockerfile 示例
FROM node:18-alpine # 最小基础镜像
RUN addgroup -S appgroup && adduser -S appuser -G appgroup # 非 root 用户
WORKDIR /app
COPY --chown=appuser:appgroup . .
USER appuser # 以非 root 身份运行

最小镜像(alpine/distroless)的意义不只是体积小,更少的包意味着更少的 CVE。USER 指令确保即使容器被入侵,攻击者也没有 root 权限。只读根文件系统(readOnlyRootFilesystem: true)阻止攻击者写入后门。

6.2 运行时安全:限制爆炸半径#

即使容器被攻破,也要把损害控制在容器内部:

  • 资源限制resources.limits):防止失控容器吃掉宿主机资源
  • 只读根文件系统:阻止写入恶意文件
  • seccomp:限制容器可用的系统调用,减少内核攻击面
  • AppArmor:限制文件和网络访问权限

6.3 编排安全:Kubernetes 的多层防护#

Kubernetes 在编排层提供了额外的安全机制:

  • NetworkPolicy:控制 Pod 之间的网络访问(默认允许所有,需要显式限制)
  • RBAC:控制谁可以对 API Server 做什么操作
  • Pod Security Standards:定义 Privileged / Baseline / Restricted 三个安全级别
  • 审计日志:记录所有 API 操作,满足合规要求

这些机制不是选一个就够的,它们是纵深防御的不同层次。镜像安全减少被入侵的概率,运行时安全限制入侵后的损害,编排安全控制整个集群的访问边界。

七、容器编排:为什么需要 Kubernetes#

单机跑几个容器,docker run 就够了。但当容器数量达到数十、数百、数千,跨多台主机部署时,手动管理变得不可能,这就是编排系统存在的理由。

7.1 Kubernetes 解决的核心问题#

Kubernetes 不是”更高级的 Docker”。它解决的是声明式集群管理的问题:

  • 自愈:Pod 挂了自动重启,Node 挂了自动迁移
  • 弹性:根据负载自动扩缩 Pod 数量(HPA)
  • 服务发现:Service 提供稳定的访问端点,后端 Pod 变化对调用方透明
  • 滚动更新:零停机部署新版本,出问题自动回滚

7.2 为什么 Kubernetes 用 Pod 而不是容器#

Kubernetes 的最小调度单位是 Pod,不是容器。一个 Pod 可以包含多个容器,它们共享网络命名空间(同一个 IP、同一个端口空间)和存储卷。

这个设计选择的原因:有些辅助功能(日志收集 sidecar、代理 sidecar、初始化容器)需要和主应用容器紧密协作,它们必须共享网络和存储,但生命周期可以不同。Pod 是这种”超亲密容器组”的天然封装。

7.3 资源 Requests/Limits 与 cgroups 的映射#

Kubernetes 的资源声明直接映射到 cgroups:

resources:
requests:
cpu: "500m" # 调度依据:Node 上已分配 requests 之和不超过节点容量
memory: "256Mi"
limits:
cpu: "1000m" # → cgroups cpu.cfs_quota_us(运行时 CPU 上限)
memory: "512Mi" # → cgroups memory.limit_in_bytes(超出触发 OOM Kill)

由此衍生出三种 Pod QoS 等级(决定内存压力时 OOM Kill 的优先顺序):

QoS条件OOM 优先级
Guaranteedrequests == limits最后被 Kill
Burstablerequests < limits中间
BestEffort未设置 requests/limits最先被 Kill

不设 limits 的 BestEffort Pod 最先被杀,这不是 bug,是设计:没有声明资源需求的 Pod,在资源紧张时理应最先让步。

八、容器的边界:哪些场景需要格外谨慎#

容器不是银弹。理解它的边界,比理解它的能力更重要。但这个”边界”需要精确界定:很多 2018-2020 年间的”容器怀疑论”把 Kubernetes 默认配置的限制等同于容器技术的根本限制,这是不对的。下面的每条边界,我都会区分”默认配置下的现实”和”配置得当后的可能性”。

8.1 有状态服务 / 数据库#

默认配置下的现实:使用远程 PVC(如 Ceph、EBS)+ bridge 网络的容器化数据库,I/O 延迟和吞吐量确实不如裸机。远程存储的额外网络跳数和 CNI 的封装开销叠加起来,对 OLTP 高 QPS 场景影响明显(Percona 2023 年基准测试显示,默认配置下 OLTP 性能差距约 5-15%)。

配置得当后的可能性hostNetwork + 本地卷(Local PV / hostPath bind mount)可以消除这两层开销。容器进程与宿主机进程在内核调度层面没有本质差异,cgroups 本身的 CPU/内存记账开销可忽略(<1%)。在这种配置下,VMware 和 Percona 的测试表明性能差距缩窄到 1-3%。

现实已经反驳了”数据库不该跑在容器里”这个论断。CloudNativePG(CNCF Sandbox,2024)已被 Tesla、IBM、Google Cloud、Azure、Ericsson、GEICO 等四十余家组织在生产环境使用;KubeBlocks 在快手管理着 10 万 Redis 实例;TiDB、CockroachDB、ClickHouse 都有成熟的 Kubernetes Operator,在 Petabyte 级规模上运行。

Note

更准确的表述:使用默认网络与远程存储的容器化数据库,I/O 性能可能不如精心调优的裸机部署。但配置得当(hostNetwork + Local PV)的容器化数据库可以达到与裸机相当的性能,且云原生数据库运维生态已非常成熟。

8.2 强安全隔离#

这是四个边界中最站得住脚的一条,但也不是一成不变的。

核心事实:容器共享内核,cgroups/namespace 是软件级隔离,确实弱于 VM 的硬件虚拟化(EPT、VT-x)。内核漏洞(如 Dirty COW CVE-2016-5195、Dirty Pipe CVE-2022-0847)确实可能导致容器逃逸。多租户 SaaS 的强租户边界、金融系统的监管要求,VM 或物理机仍是更保守的选择。

但原文忽略了安全容器的发展

方案隔离机制启动开销兼容性生产用户
Kata Containers轻量 VM,每容器独立内核~1-2s(Cloud Hypervisor)完整 Linux百度(函数计算、边缘计算)
gVisor用户态内核(Sentry 拦截 syscall)进程级,接近原生~98.3%(腾讯实测)Google(GKE Sandbox)、腾讯(百万级沙箱)
FirecrackermicroVM(<125ms 启动)<125ms完整 LinuxAWS(Lambda、Fargate)

Google 的 GKE Sandbox 用 gVisor 在共享 Kubernetes 集群上隔离租户工作负载,AWS Lambda 和 Fargate 用 Firecracker microVM 做沙箱,百度用 Kata Containers 跑函数计算。“应该用 VM 而不是容器”在 2026 年已经不再是唯一答案:安全容器方案可以保持容器接口,同时提供接近 VM 的隔离强度。

Note

更准确的表述:普通容器的隔离强度确实不适合强安全场景。但 Kata/gVisor/Firecracker 等安全容器可以在保持容器接口的同时提供接近 VM 的隔离强度。金融、政务等强监管场景仍倾向 VM 作为租户边界,但安全容器已经为多租户 SaaS 等场景提供了可行的中间路线。

8.3 GPU 密集型 AI 训练#

原文说”GPU 直通和容器化的组合在驱动兼容性、显存管理上仍有摩擦”。这个判断基本正确,但归因不够精确。

事实:大规模 AI 训练集群(Meta、OpenAI、xAI 的 10 万+ GPU 级别)确实不使用 Kubernetes 编排训练任务,而是用 Slurm + Enroot/Pyxis(NVIDIA 的轻量容器运行时)在裸金属上运行。但任务本身是容器化的,只是编排层不是 K8s。

“摩擦”的本质不是容器慢,而是 Kubernetes 的通用调度模型与 GPU 训练的物理特性不匹配:

  • ** Gang 调度**:256 卡训练任务需要所有 GPU 同时就绪,缺一不可。Slurm 天然支持;K8s 需要 Volcano/Kueue 扩展,尚未在 10 万+ GPU 级别验证
  • 拓扑感知:NCCL 训练对 GPU-NIC-NUMA 拓扑极其敏感。Slurm 可按 NVLink 域和交换机层级调度;K8s 默认调度是拓扑盲的
  • RDMA/InfiniBand:Slurm + Enroot 直接使用宿主机网络,零配置;K8s 需要 Multus CNI + RDMA device plugin + hostNetwork 的组合,配置复杂度远高
  • **DRA(Dynamic Resource Allocation)**在 K8s 1.35 达到 GA,GPU 整卡调度已成熟,但 MIG 分区、细粒度显存共享仍是 Alpha
Note

更准确的表述:大规模 AI 训练通常使用裸金属节点配合容器化环境(Slurm + Enroot),而非虚拟机嵌套容器。Kubernetes 的通用 GPU 调度在 Gang 调度、拓扑感知、RDMA 网络上仍需额外工具链支持(Volcano/Kueue/Multus),在 1-1000 GPU 规模可用,万卡以上 Slurm 仍是事实标准。

8.4 实时系统#

这是原文中最不准确的一条。

原文说”容器共享内核的调度延迟不可预测”。这个归因是错的。不可预测的根源是 Linux 默认的 CFS 调度器,而不是容器。裸机上的普通进程同样受 CFS 调度延迟、NUMA 平衡、内核抢占配置的影响。容器进程在内核调度层面与普通进程没有区别,namespace 本身不增加任何调度开销。

实现硬实时需要的是:PREEMPT_RT 内核(2024 年 11 月已合入 Linux 6.12 主线,不再需要外挂补丁)+ CPU 隔离(isolcpus)+ 禁用 IRQ 平衡 + SCHED_FIFO 实时优先级 + mlockall 防止页错误。这些与是否使用容器无关。

事实上,容器已经被用于实时场景

  • Apollo 自动驾驶平台用 Docker 容器作为主要开发和部署机制
  • ROS2 机器人系统有官方 Docker 支持,感知/规划模块在容器中运行
  • O-RAN 联盟架构明确支持容器化 5G RAN 工作负载(毫秒级延迟预算)
  • Red Hat OpenShift 提供 PREEMPT_RT 容器支持,用于电信和工业控制

cyclictest 基准测试表明,在 PREEMPT_RT + CPU 隔离 + 正确 cgroup 配置下,容器化与裸机的最大调度延迟差异在 1-3 微秒以内,容器本身不增加可测量的调度开销。

Note

更准确的表述:默认配置下的 Linux(无论是否使用容器)不适合硬实时场景。但通过 PREEMPT_RT 内核、CPU 独占、SCHED_FIFO 优先级、mlockall 等配置,容器可以满足实时需求。实时性的瓶颈在操作系统调度配置,而非容器本身。


容器技术的演进有一条清晰的线索:从 chroot 的”文件系统隔离”,到 Namespace + cgroups 的”视图隔离 + 资源限制”,到 Docker 的”打包分发工作流”,再到 Kubernetes 的”声明式集群编排”。每一步都在解决上一步留下的局限:chroot 不隔离进程,Namespace 不解决打包,Docker 不解决编排。

理解这条线索,比记住 bridge 和 overlay 的区别更重要。因为技术会变,Docker 可能被替代,Kubernetes 可能被演进,但”隔离什么、限制什么、如何打包、如何编排”这四个问题的答案,才是容器技术的本质。

参考资料#


支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

什么是容器?
https://blog.souloss.cn/posts/whatis/what-is-container/
作者
Souloss
发布于
2021-01-08
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

相关文章 智能推荐
1
什么是云计算?
技术科普 一位三年云计算从业者的行业解读,从虚拟化底层机制、容器隔离原理,到 IaaS/PaaS/SaaS 服务模型,再到公有云/私有云/混合云部署形态,全面解析云计算的本质与应用。
2
什么是微服务?
技术科普 微服务不是"把系统拆小",它是一种用隔离换独立性的架构取舍。从单体到微服务的演进不是技术升级,而是组织规模增长后对交付效率的必然诉求。理解拆分的代价,比理解拆分的好处更重要。
3
容器全景:从 chroot 到 OCI
容器运行时 从 1979 年的 chroot 到 2015 年的 OCI 标准,容器技术走过了三十多年的演进之路。本章梳理这条脉络,并辨析容器与虚拟机、容器进程与普通进程、镜像与容器与 Bundle 几组核心概念,为后续深入打下认知基础。
4
容器完整流程:docker run 背后
容器运行时 当你执行 docker run nginx 时,背后发生了什么?本章完整追踪从 Docker CLI 到容器进程启动的每一步,镜像拉取、OCI Bundle 生成、shim 启动、runc 创建、Namespace/Cgroup/OverlayFS 配置、容器进程执行,让你对 docker run 的每一步都了如指掌。
5
容器运行时深入系列导读
容器运行时 从 Linux 内核的 Namespace、Cgroup、OverlayFS 出发,深入 OCI 规范、runc 源码、containerd 架构与 shim 机制,再覆盖容器安全、网络、镜像构建三个运行时核心维度,建立从内核机制到工业实现的完整认知链。