3. Docker镜像管理:镜像的拉取、查看、删除、导出导入、使用Docker Hub与私有仓库
Docker 镜像是容器化部署的核心构件,它本质上是一个轻量级、可执行的独立软件包,包含运行某软件所需的所有内容:代码、运行时、系统工具、系统库和设置。在 DAG 任务调度场景中,精确管理镜像版本、高效分发镜像至集群节点、以及保障镜像供应链安全,是维持调度系统稳定性的基石。本章将系统讲解镜像的完整生命周期管理操作。
3.1 镜像拉取与查看
镜像管理的第一步是从仓库获取目标镜像。Docker 默认从官方公共仓库 Docker Hub 拉取,但也可指定第三方或私有仓库地址。
3.1.1 拉取镜像
使用 docker pull 命令从仓库下载镜像到本地。语法格式如下:
# 从 Docker Hub 拉取官方镜像(默认 latest 标签)
docker pull nginx
# 拉取指定标签的镜像
docker pull nginx:1.25-alpine
# 从私有仓库拉取镜像
docker pull registry.example.com:5000/my-dag-scheduler:v2.1.0
# 拉取时指定平台架构(多架构镜像场景)
docker pull --platform linux/amd64 python:3.11-slim
最佳实践:在生产 DAG 调度环境中,始终使用明确的版本标签(如
v2.1.0),避免使用 latest 标签。这能确保调度集群所有节点运行完全一致的镜像版本,防止因隐式更新导致的非预期行为。
3.1.2 查看本地镜像
拉取完成后,使用 docker images 或 docker image ls 列出本地存储的镜像清单。
docker images
# 输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.25-alpine a6b72b8b8c9e 2 weeks ago 42.6MB
python 3.11-slim 7e3b7c7b9c1d 3 weeks ago 125MB
my-dag-scheduler v2.1.0 9f8e2d1c3a4b 5 days ago 890MB
常用查看选项:
| 命令 | 说明 |
|---|---|
docker images -a |
显示所有镜像(包含中间层镜像) |
docker images --digests |
显示镜像的摘要(Digest)值,用于精确版本校验 |
docker images --filter "dangling=true" |
仅显示悬空镜像(无标签、无引用的镜像层) |
docker image inspect nginx:1.25-alpine |
查看镜像的详细元数据(JSON 格式) |
3.2 删除镜像
随着 DAG 任务迭代,本地会积累大量历史镜像版本,占用磁盘空间。及时清理无用镜像是运维常态。
3.2.1 删除单个镜像
# 通过仓库名:标签删除
docker rmi nginx:1.25-alpine
# 通过镜像 ID 删除
docker rmi a6b72b8b8c9e
# 强制删除(即使有容器引用)
docker rmi -f a6b72b8b8c9e
3.2.2 批量清理策略
| 场景 | 命令 | 说明 |
|---|---|---|
| 删除所有悬空镜像 | docker image prune |
清理无标签、无引用的中间层镜像 |
| 删除所有未使用的镜像 | docker image prune -a |
清理未被任何容器引用的镜像 |
| 按时间过滤删除 | docker image prune -a --filter "until=24h" |
删除 24 小时前创建的未使用镜像 |
| 批量删除特定仓库镜像 | docker images | grep "my-dag" | awk '{print $3}' | xargs docker rmi |
通过管道组合命令批量操作 |
注意:执行
docker rmi 前,请确认没有正在运行的容器依赖该镜像。强制删除(-f)可能导致运行中的容器异常退出。在 DAG 调度集群中,建议先停止关联任务,再执行镜像清理。
3.3 镜像导出与导入
在离线环境或跨网络传输场景中,无法直接使用 docker pull。此时需要将镜像导出为 tar 归档文件,再导入到目标主机。
3.3.1 导出镜像
# 将镜像保存为 tar 文件
docker save -o dag-scheduler-v2.1.0.tar my-dag-scheduler:v2.1.0
# 同时导出多个镜像
docker save -o multiple-images.tar nginx:1.25-alpine python:3.11-slim
# 使用 gzip 压缩导出(推荐)
docker save my-dag-scheduler:v2.1.0 | gzip > dag-scheduler-v2.1.0.tar.gz
3.3.2 导入镜像
# 从 tar 文件加载镜像
docker load -i dag-scheduler-v2.1.0.tar
# 从 gzip 压缩文件加载
gunzip -c dag-scheduler-v2.1.0.tar.gz | docker load
# 验证导入结果
docker images | grep my-dag-scheduler
DAG 调度场景应用:当调度集群部署在隔离网络(如金融内网、工业控制网)时,可在有外网的构建机上执行
docker pull + docker save,将镜像打包后通过 U 盘或内部文件服务器传输,再在集群各节点执行 docker load。此流程确保镜像供应链在物理隔离环境中仍可安全交付。
3.4 使用 Docker Hub 与私有仓库
镜像仓库是镜像分发的中枢。Docker Hub 作为默认公共仓库,适合开源项目和个人学习;私有仓库则用于企业级 DAG 调度系统,保障镜像的私密性与可控性。
3.4.1 Docker Hub 操作
# 登录 Docker Hub(交互式输入用户名和密码)
docker login
# 登录指定仓库
docker login registry.example.com:5000
# 推送镜像到 Docker Hub
docker tag my-dag-scheduler:v2.1.0 yourusername/my-dag-scheduler:v2.1.0
docker push yourusername/my-dag-scheduler:v2.1.0
# 登出
docker logout
3.4.2 搭建私有仓库(Harbor / Registry)
企业级 DAG 调度通常使用 Harbor 或 Docker Registry 作为私有仓库。Harbor 提供基于角色的访问控制、镜像复制、漏洞扫描等高级功能。
# 快速启动 Docker Registry(仅用于测试)
docker run -d -p 5000:5000 --name registry registry:2
# 推送镜像到本地私有仓库
docker tag my-dag-scheduler:v2.1.0 localhost:5000/my-dag-scheduler:v2.1.0
docker push localhost:5000/my-dag-scheduler:v2.1.0
# 从私有仓库拉取
docker pull localhost:5000/my-dag-scheduler:v2.1.0
3.4.3 仓库对比
| 特性 | Docker Hub | Docker Registry | Harbor |
|---|---|---|---|
| 部署方式 | SaaS 服务 | 自托管(单容器) | 自托管(多组件) |
| 访问控制 | 公有/私有仓库 | 无内置认证 | RBAC + LDAP/AD |
| 镜像复制 | 不支持 | 不支持 | 支持跨地域复制 |
| 安全扫描 | 付费功能 | 不支持 | 内置 Clair/Trivy |
| 适用场景 | 开源项目、个人 | 小型团队、测试 | 企业级生产环境 |
3.5 镜像管理最佳实践清单
- 标签策略:采用语义化版本号(如
v2.1.0)加构建时间戳(如v2.1.0-20250315),确保镜像版本可追溯。 - 定期清理:在 CI/CD 流水线末尾执行
docker image prune -a --filter "until=72h",避免构建节点磁盘写满。 - 镜像签名:使用 Docker Content Trust(DCT)或 Harbor 的 Notary 服务,对镜像进行数字签名,防止篡改。
- 离线传输:对于跨网络传输,优先使用
docker save+gzip压缩,可减少 30%-50% 传输体积。 - 仓库认证:私有仓库务必启用 TLS 和基本认证,避免镜像泄露。Harbor 建议集成 LDAP 实现统一身份管理。
DAG 调度集成提示:在调度系统的配置管理中,将镜像仓库地址、认证凭据、镜像标签作为环境变量或配置项注入,避免硬编码。当需要回滚任务版本时,仅需修改镜像标签并重启容器,无需重新构建整个调度环境。