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)。它们之间的关系如下图所示:

Docker 三大核心概念关系图 镜像 (Image) 只读模板,定义环境 容器 (Container) 可写层,运行实例 仓库 (Repository) 镜像存储与分发 docker run docker pull docker push 核心工作流 1. 从仓库拉取镜像(docker pull) 2. 基于镜像创建并运行容器(docker run) 3. 在容器内修改后,提交为新镜像(docker commit) 4. 将新镜像推送至仓库(docker push)

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 执行环境的基础。