1. Docker 基础入门:发展史、核心概念与对比
1.1 Docker 发展史:从容器技术到行业标准
Docker 并非凭空诞生,而是建立在 Linux 内核容器技术(LXC、cgroups、Namespaces)之上。2013 年,dotCloud 公司(后更名为 Docker Inc.)开源了 Docker 引擎,将复杂的底层容器操作封装为简洁的 CLI 和 API,迅速引爆了 DevOps 和微服务领域。
| 年份 | 里程碑事件 | 影响 |
|---|---|---|
| 2008 | LXC(Linux Containers)发布 | 提供首个完整的容器管理用户空间工具集 |
| 2013 | Docker 0.1 开源 | 将 LXC 封装为“构建-运输-运行”三阶段工作流 |
| 2014 | Docker 1.0 正式版 + Docker Hub 上线 | 镜像仓库生态形成,社区爆发式增长 |
| 2015 | OCI(Open Container Initiative)成立 | 标准化容器运行时(runc)与镜像规范 |
| 2017 | Docker 拆分出 containerd + Moby 项目 | 核心运行时捐赠给 CNCF,成为 Kubernetes 默认 CRI |
| 2020+ | Docker Desktop / Docker Compose V2 普及 | 本地开发与 CI/CD 深度集成,DAG 任务调度首选容器化底座 |
关键认知:Docker 的成功不在于发明了容器,而在于定义了“镜像 + 分层文件系统 + 仓库”这一标准化交付模型,使得“一次构建,到处运行”从口号变为现实。
1.2 核心概念:镜像、容器、仓库
Docker 的三大核心概念构成了容器化工作流的闭环。理解它们之间的关系,是掌握 Docker 的基石。
- 镜像(Image):一个只读的、分层结构的模板,包含运行应用所需的完整文件系统、依赖、配置和元数据。镜像由 Dockerfile 构建,不可变。
- 容器(Container):镜像的运行实例。容器在镜像层之上添加一个可写层,拥有独立的进程、网络和文件系统隔离。容器可以被启动、停止、删除,状态默认不持久。
- 仓库(Registry):集中存储和分发镜像的服务。Docker Hub 是官方公共仓库,企业可搭建私有仓库(如 Harbor、Nexus)。
1.3 Docker 与虚拟机的核心区别
Docker 容器与虚拟机(VM)都提供资源隔离,但实现原理和性能特征截然不同。下表从多个维度进行对比:
| 对比维度 | Docker 容器 | 虚拟机 (VM) |
|---|---|---|
| 隔离级别 | 进程级隔离(Namespaces + cgroups) | 硬件级虚拟化(Hypervisor + 独立内核) |
| 内核 | 共享宿主机内核 | 每个 VM 包含完整 Guest OS 内核 |
| 启动时间 | 毫秒级(秒级启动) | 分钟级(需引导操作系统) |
| 镜像大小 | MB ~ 数百 MB(分层复用) | GB ~ 数十 GB(包含完整 OS) |
| 性能开销 | 接近原生(仅进程调度损耗) | 较高(Hypervisor 转换 + 内核冗余) |
| 资源密度 | 一台宿主机可运行数百容器 | 一台宿主机通常运行数台 VM |
| 可移植性 | 镜像跨平台运行(需内核兼容) | VM 镜像跨 Hypervisor 需转换 |
| 典型场景 | 微服务、CI/CD、DAG 任务调度 | 传统应用、多租户强隔离、Windows 应用 |
性能调优视角:在 DAG 任务调度场景中,容器化带来的“秒级启动 + 高密度部署”优势极为关键。每个 DAG 节点(如 Spark 任务、Python 脚本)可以独立封装为容器镜像,调度器按需拉起,任务完成后自动销毁,资源利用率远高于 VM 模式。
1.4 架构对比示意图:容器 vs 虚拟机
下图直观展示了两者在系统堆栈上的本质差异:
避坑提示:虽然容器共享宿主机内核,但这并不意味着“不安全”。在 DAG 任务调度场景中,如果任务需要运行不同内核版本或加载内核模块(如某些性能监控工具),容器化将受限。此时应评估是否使用 VM 或采用“Docker in Docker”等特殊方案。
1.5 小结:Docker 在 DAG 任务调度中的定位
Docker 容器化技术为 DAG 任务调度提供了三大核心价值:
- 环境一致性:镜像封装了任务的所有依赖,消除“在我机器上能跑”的尴尬。
- 快速弹性:秒级启动和销毁,适合 DAG 中大量短生命周期任务节点。
- 资源隔离:cgroups 限制 CPU/内存,防止单个任务耗尽集群资源。