Docker添加镜像仓库与常用命令详解

一、Docker镜像仓库基础概念

Docker镜像仓库是存储和分发Docker镜像的中央存储库,分为公有仓库(如Docker Hub)和私有仓库(如Harbor、Nexus)。镜像仓库通过registry服务实现,支持镜像的上传(push)、下载(pull)和搜索功能。

1.1 镜像仓库的作用

  • 集中管理:统一存储团队或组织的镜像
  • 版本控制:通过标签(tag)管理不同版本
  • 加速分发:通过私有仓库减少网络依赖
  • 安全控制:限制镜像访问权限

1.2 镜像仓库类型

类型 示例 特点
公有仓库 Docker Hub 免费,公开访问
私有仓库 Harbor、Nexus 需认证,适合企业内部使用
第三方仓库 AWS ECR、阿里云CR 与云服务集成

二、添加Docker镜像仓库的完整流程

2.1 配置文件修改法

Docker默认从docker.io(Docker Hub)拉取镜像,添加其他仓库需修改/etc/docker/daemon.json文件:

  1. {
  2. "registry-mirrors": ["https://<mirror-url>"],
  3. "insecure-registries": ["<private-registry-ip>:5000"],
  4. "auths": {
  5. "<registry-url>": {
  6. "auth": "<base64-encoded-username:password>"
  7. }
  8. }
  9. }

操作步骤:

  1. 创建或编辑配置文件:

    1. sudo mkdir -p /etc/docker
    2. sudo nano /etc/docker/daemon.json
  2. 添加镜像加速器(以阿里云为例):

    1. {
    2. "registry-mirrors": ["https://<your-id>.mirror.aliyuncs.com"]
    3. }
  3. 添加私有仓库认证:

    1. echo '{"auths":{"<registry-url>":{"auth":"$(echo -n username:password | base64)"}}}' > auth.json
    2. sudo mv auth.json /etc/docker/
  4. 重启Docker服务:

    1. sudo systemctl restart docker

2.2 命令行临时配置

对于临时使用场景,可通过环境变量配置:

  1. export DOCKER_CONFIG=/tmp/docker-config
  2. mkdir -p $DOCKER_CONFIG
  3. echo '{"auths":{"<registry-url>":{"auth":"$(echo -n user:pass | base64)"}}}' > $DOCKER_CONFIG/config.json
  4. docker pull <registry-url>/image:tag

三、Docker镜像仓库核心命令

3.1 登录/登出仓库

  1. # 登录仓库(会保存认证信息到~/.docker/config.json)
  2. docker login <registry-url>
  3. # 登出仓库
  4. docker logout <registry-url>

安全建议

  • 避免在命令行直接输入密码,推荐使用交互式输入
  • 定期轮换认证凭证

3.2 镜像操作命令

3.2.1 标记镜像

  1. # 将本地镜像标记为仓库格式
  2. docker tag <local-image>:<tag> <registry-url>/<namespace>/<image>:<tag>

示例:

  1. docker tag nginx:latest my-registry.com/dev/nginx:1.21

3.2.2 推送镜像

  1. # 推送镜像到仓库
  2. docker push <registry-url>/<namespace>/<image>:<tag>

注意事项

  • 确保已登录对应仓库
  • 镜像名称必须包含仓库URL前缀

3.2.3 拉取镜像

  1. # 从仓库拉取镜像
  2. docker pull <registry-url>/<namespace>/<image>:<tag>

3.3 仓库搜索功能

  1. # 搜索Docker Hub中的镜像
  2. docker search <keyword>
  3. # 私有仓库搜索(需通过API实现)
  4. curl -X GET "https://<registry-url>/v2/_catalog" -H "Accept: application/json"

四、高级配置与最佳实践

4.1 自签名证书处理

对于使用自签名证书的私有仓库,需将证书添加到Docker信任链:

  1. # 1. 将证书复制到证书目录
  2. sudo mkdir -p /etc/docker/certs.d/<registry-url>
  3. sudo cp my-registry.crt /etc/docker/certs.d/<registry-url>/ca.crt
  4. # 2. 重启Docker
  5. sudo systemctl restart docker

4.2 多阶段构建与镜像优化

  1. # 示例:多阶段构建减少镜像体积
  2. FROM golang:1.18 AS builder
  3. WORKDIR /app
  4. COPY . .
  5. RUN go build -o myapp .
  6. FROM alpine:latest
  7. COPY --from=builder /app/myapp /usr/local/bin/
  8. CMD ["myapp"]

构建并推送:

  1. docker build -t my-registry.com/myapp:latest .
  2. docker push my-registry.com/myapp:latest

4.3 镜像清理策略

  1. # 删除所有悬空镜像
  2. docker image prune -f
  3. # 删除未被使用的镜像
  4. docker image prune -a -f
  5. # 按时间删除(保留最近7天的镜像)
  6. docker image prune -a --filter "until=720h"

五、常见问题解决方案

5.1 推送镜像失败

错误现象

  1. denied: requested access to the resource is denied

解决方案

  1. 确认镜像名称包含正确的仓库前缀
  2. 检查是否已登录对应仓库
  3. 验证仓库权限设置

5.2 证书验证失败

错误现象

  1. x509: certificate signed by unknown authority

解决方案

  1. 确认已正确配置证书(见4.1节)
  2. 对于开发环境,可临时禁用证书验证(不推荐生产环境使用):
    1. {
    2. "insecure-registries": ["<registry-url>"]
    3. }

5.3 拉取镜像超时

解决方案

  1. 配置镜像加速器(见2.1节)
  2. 检查网络连接和防火墙设置
  3. 对于国内环境,推荐使用以下加速器:
    • 阿里云:https://<your-id>.mirror.aliyuncs.com
    • 腾讯云:https://mirror.ccs.tencentyun.com

六、总结与建议

  1. 生产环境:优先使用私有仓库(如Harbor)进行镜像管理
  2. 开发环境:可配置镜像加速器提升下载速度
  3. 安全实践
    • 定期轮换认证凭证
    • 限制仓库访问权限
    • 使用TLS加密通信
  4. 性能优化
    • 采用多阶段构建减少镜像体积
    • 合理使用镜像标签进行版本管理

通过掌握上述Docker镜像仓库配置和操作命令,开发者可以更高效地管理容器镜像,提升CI/CD流程的可靠性。建议结合具体业务场景,制定适合团队的镜像管理规范。