1. Docker 基础入门
1.1 Docker 简介
Docker 是一个开源的容器化平台,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上。Docker 利用操作系统层面的虚拟化技术,实现了资源隔离与限制,从而解决了“在我机器上能跑”的环境一致性问题。
核心价值: Docker 通过镜像(Image)标准化应用交付,通过容器(Container)标准化应用运行环境,使得开发、测试、生产环境高度一致。
1.2 Docker 与虚拟机的区别
Docker 容器与传统虚拟机(VM)在架构和资源利用上存在本质差异。下表从多个维度进行对比:
| 对比维度 | Docker 容器 | 虚拟机(VM) |
|---|---|---|
| 虚拟化层级 | 操作系统层(共享宿主机内核) | 硬件层(Hypervisor 虚拟化硬件) |
| 启动速度 | 秒级(进程级启动) | 分钟级(需加载完整 Guest OS) |
| 资源占用 | 轻量(MB 级,仅包含应用及依赖) | 重量(GB 级,包含完整操作系统) |
| 隔离性 | 进程级隔离(cgroups + namespaces) | 完全隔离(独立内核与硬件虚拟化) |
| 性能损耗 | 接近原生(约 2-5%) | 较高(约 10-20%) |
| 可移植性 | 强(镜像标准,跨平台运行) | 弱(依赖特定 Hypervisor 格式) |
关键结论: 容器不是“轻量级虚拟机”,而是“隔离的进程”。共享宿主机内核是 Docker 高效的核心,但也意味着容器内无法运行与宿主机不同类型的操作系统(如 Linux 宿主机无法运行 Windows 容器)。
1.3 Docker 核心概念
Docker 体系由三大核心组件构成:镜像(Image)、容器(Container) 和 仓库(Repository)。它们之间的关系如下图所示:
1.4 核心概念详解
1.4.1 镜像(Image)
镜像是容器的只读模板,包含运行应用所需的完整文件系统、库、环境变量和配置。镜像采用分层构建(UnionFS),每一层代表一个 Dockerfile 指令。
- 分层结构: 基础层(如 Ubuntu)→ 依赖层(如 Python)→ 应用层(如代码)→ 配置层(如环境变量)。
- 不可变性: 镜像一旦构建,其内容只读;任何修改都会生成新的镜像层。
- 标识: 通过
repository:tag唯一标识,如nginx:1.25。
常见误区: 不要将镜像等同于 ISO 文件。镜像是分层增量存储,而非完整磁盘映像。拉取镜像时,仅下载本地不存在的层,大幅节省带宽和磁盘。
1.4.2 容器(Container)
容器是镜像的运行实例,在镜像只读层之上添加一个可写层(Container Layer)。容器拥有独立的进程、网络、文件系统命名空间。
- 生命周期: 创建(Created)→ 运行(Running)→ 暂停(Paused)→ 停止(Exited)→ 删除(Deleted)。
- 数据持久化: 容器删除后,其可写层数据丢失。持久化数据应使用卷(Volume)或绑定挂载(Bind Mount)。
- 资源限制: 可通过
--memory、--cpus等参数限制容器资源使用。
1.4.3 仓库(Repository)
仓库用于存储和分发 Docker 镜像。公共仓库(如 Docker Hub)和私有仓库(如 Harbor、AWS ECR)是镜像供应链的核心。
| 仓库类型 | 示例 | 适用场景 |
|---|---|---|
| 公共仓库 | Docker Hub, Quay.io | 开源项目、基础镜像获取 |
| 私有仓库 | Harbor, AWS ECR, GitLab Container Registry | 企业级镜像管理、安全合规 |
| 本地仓库 | docker registry:2 | 开发测试、离线环境 |
1.5 基础操作示例
以下命令演示了从拉取镜像到运行容器的完整流程:
# 1. 从 Docker Hub 拉取 Nginx 镜像
docker pull nginx:1.25
# 2. 查看本地镜像列表
docker images
# 3. 基于镜像运行容器(后台模式,映射端口 8080)
docker run -d --name my-nginx -p 8080:80 nginx:1.25
# 4. 查看运行中的容器
docker ps
# 5. 进入容器内部
docker exec -it my-nginx /bin/bash
# 6. 停止并删除容器
docker stop my-nginx
docker rm my-nginx
实践要点: 在任务调度 DAG 场景中,每个任务节点通常对应一个容器。理解镜像的不可变性和容器的短暂性,是设计可靠 DAG 执行环境的基础。