Docker Registry and Image Pulling - Managing Container Images
2025/8/30大约 6 分钟
Docker 仓库与镜像拉取
Docker 仓库概述
Docker 仓库是存储和分发 Docker 镜像的服务。它类似于 Git 仓库,但存储的是 Docker 镜像而不是代码。仓库可以是公共的(如 Docker Hub)或私有的(企业内部仓库)。
仓库的结构
Docker 仓库采用分层存储结构:
Registry
├── Repository 1
│ ├── Tag 1
│ ├── Tag 2
│ └── Tag 3
├── Repository 2
│ ├── Tag 1
│ └── Tag 2
└── Repository 3
└── Tag 1- Registry:仓库服务,如 Docker Hub
- Repository:特定镜像的集合,如 nginx
- Tag:镜像的特定版本,如 latest、1.21
仓库类型
公共仓库
- Docker Hub:官方公共仓库
- Google Container Registry (GCR)
- Amazon Elastic Container Registry (ECR)
- Azure Container Registry (ACR)
私有仓库
- 企业内部搭建的仓库
- 云服务商提供的私有仓库服务
- 自建仓库服务
Docker Hub 详解
Docker Hub 是 Docker 官方提供的公共镜像仓库,包含了大量的官方镜像和社区贡献的镜像。
使用 Docker Hub
搜索镜像:
# 搜索镜像
docker search nginx
# 在 Docker Hub 网站上搜索
# https://hub.docker.com/search?q=nginx拉取镜像:
# 拉取最新版本
docker pull nginx
# 拉取指定版本
docker pull nginx:1.21
# 拉取特定平台镜像
docker pull --platform linux/arm64 nginx推送镜像:
# 登录 Docker Hub
docker login
# 标记镜像
docker tag myapp:1.0 username/myapp:1.0
# 推送镜像
docker push username/myapp:1.0官方镜像与社区镜像
官方镜像
- 由 Docker 官方或软件厂商维护
- 命名格式:
镜像名(如 nginx、redis) - 安全性和质量有保障
社区镜像
- 由社区用户维护
- 命名格式:
用户名/镜像名(如 jenkins/jenkins) - 需要评估质量和安全性
私有仓库搭建与管理
企业通常需要搭建私有仓库来存储内部镜像,以确保安全性和可控性。
使用 Docker Registry 镜像搭建私有仓库
# 运行私有仓库容器
docker run -d -p 5000:5000 --name registry registry:2
# 验证仓库运行
curl http://localhost:5000/v2/_catalog配置安全的私有仓库
生成证书:
# 生成自签名证书
mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt运行安全仓库:
docker run -d -p 443:443 --name registry \
-v $(pwd)/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2认证配置
使用 htpasswd 进行认证:
# 生成密码文件
mkdir auth
docker run --rm -it httpd:2 htpasswd -Bbn username password > auth/htpasswd
# 运行带认证的仓库
docker run -d -p 5000:5000 --name registry \
-v $(pwd)/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry:2镜像拉取机制详解
Docker 镜像拉取是一个复杂的过程,涉及多个步骤和优化机制。
拉取流程
- 解析镜像名称:将镜像名称解析为仓库地址
- 获取镜像清单:从仓库获取镜像的清单文件
- 下载层数据:并行下载镜像的各个层
- 验证完整性:验证下载层的完整性
- 注册镜像:将镜像注册到本地
并行下载优化
Docker 支持并行下载镜像层以提高拉取速度:
# 配置并行下载数
dockerd --max-concurrent-downloads=10镜像缓存机制
Docker 利用本地缓存避免重复下载:
# 查看镜像层
docker inspect nginx:latest
# 查看本地镜像
docker images镜像拉取策略
不同的拉取策略适用于不同的场景:
默认拉取策略
# 如果本地存在镜像则使用本地镜像,否则拉取
docker run nginx强制拉取策略
# 总是拉取最新镜像
docker pull nginx:latest
docker run nginx:latest条件拉取策略
# 仅在本地不存在时拉取
docker run --pull=missing nginx
# 总是尝试拉取
docker run --pull=always nginx
# 从不拉取,仅使用本地镜像
docker run --pull=never nginx镜像拉取优化
使用镜像加速器
对于国内用户,可以配置镜像加速器提高拉取速度:
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}拉取特定平台镜像
# 拉取 ARM64 平台镜像
docker pull --platform linux/arm64 nginx
# 拉取 AMD64 平台镜像
docker pull --platform linux/amd64 nginx分层拉取
Docker 会自动利用已存在的层:
# 如果已存在基础层,则只下载新增层
docker pull myapp:1.1 # 假设 1.0 的层已存在镜像验证与安全
内容信任机制
Docker Content Trust (DCT) 确保镜像的完整性和发布者身份:
# 启用内容信任
export DOCKER_CONTENT_TRUST=1
# 拉取签名镜像
docker pull username/myapp:1.0镜像扫描
使用安全工具扫描镜像漏洞:
# 使用 Docker Scan
docker scan nginx:latest
# 使用 Trivy
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy nginx:latest多架构镜像支持
现代 Docker 仓库支持多架构镜像,可以在不同平台间共享:
Manifest 列表
# 查看镜像的 manifest 列表
docker manifest inspect nginx:latest
# 创建多架构镜像
docker manifest create myapp:latest \
myapp:amd64 \
myapp:arm64
# 推送 manifest 列表
docker manifest push myapp:latest企业级仓库解决方案
Harbor
Harbor 是 VMware 开源的企业级 Registry 服务器:
主要特性:
- 基于角色的访问控制 (RBAC)
- 镜像复制
- LDAP/AD 集成
- 图形化用户界面
- 审计日志
- 漏洞扫描
部署 Harbor:
# 下载 Harbor
wget https://github.com/goharbor/harbor/releases/download/v2.3.0/harbor-offline-installer-v2.3.0.tgz
# 解压并配置
tar xvf harbor-offline-installer-v2.3.0.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml
# 编辑 harbor.yml 配置文件
# 安装 Harbor
./install.shJFrog Artifactory
JFrog Artifactory 是另一个企业级仓库解决方案:
主要特性:
- 多种包格式支持
- 高可用性
- 全球分布
- 安全扫描
- CI/CD 集成
镜像拉取故障排除
常见问题及解决方案
网络连接问题:
# 检查网络连接
ping registry-1.docker.io
# 配置代理
export HTTP_PROXY=http://proxy.company.com:8080
export HTTPS_PROXY=https://proxy.company.com:8080认证问题:
# 登录仓库
docker login registry.example.com
# 检查认证配置
cat ~/.docker/config.json证书问题:
# 配置不安全仓库(仅用于测试)
{
"insecure-registries": ["registry.example.com:5000"]
}磁盘空间不足:
# 清理未使用的镜像
docker image prune -a
# 查看磁盘使用情况
docker system df最佳实践
镜像命名规范
# 使用语义化版本
myapp:1.2.3
# 使用环境标签
myapp:prod
myapp:staging
# 使用 Git 提交哈希
myapp:git-a1b2c3d镜像拉取策略
# 在 CI/CD 中使用明确的标签
docker pull myapp:1.2.3
# 在生产环境中避免使用 latest 标签
docker run myapp:1.2.3 # 而不是 myapp:latest安全考虑
# 启用内容信任
export DOCKER_CONTENT_TRUST=1
# 定期扫描镜像
docker scan myapp:1.2.3
# 使用最小基础镜像
FROM alpine:latest # 而不是 ubuntu:latest通过本节内容,我们深入了解了 Docker 仓库的工作原理、镜像拉取机制以及相关的最佳实践。掌握这些知识对于高效、安全地管理 Docker 镜像是至关重要的,为后续章节中 Docker 的实际应用奠定了基础。
