Docker Registry(Docker 官方镜像仓库)的完整管理流程,包括镜像的推送 / 拉取、仓库配置、UI 管理、镜像清理等核心操作,下面为你梳理一套完整的 Docker Registry 管理指南,从基础使用到高级配置全覆盖:
一、先明确核心概念
Docker Registry 是 Docker 官方提供的基础镜像仓库服务,负责存储和分发 Docker 镜像,分为两种部署形态:
- 公共 Registry:如 Docker Hub(官方公共仓库),无需自建,直接使用;
- 私有 Registry:通过
registry:2镜像自建,用于存储内部私有镜像,也是我们管理的核心对象。
二、基础管理:镜像的推送(push)与拉取(pull)
这是 Registry 最核心的操作,前提是已启动私有 Registry 服务(最简部署):
# 启动私有 Registry 容器(默认存储在容器内,后续会优化为本地挂载)
docker run -d -p 5000:5000 --restart=always --name docker-registry registry:2
1. 镜像拉取(pull)
- 取公共 Registry(Docker Hub)镜像(默认行为,无需指定 Registry 地址):
# 格式:docker pull [镜像名]:[标签] docker pull nginx:latest docker pull ubuntu:20.04 - 拉取私有 Registry 镜像(必须指定私有 Registry 的 IP / 域名 + 端口):
# 格式:docker pull [私有Registry地址]:[端口]/[镜像名]:[标签] docker pull 192.168.1.100:5000/nginx:latest
2. 镜像推送(push)
注意:推送私有 Registry 前,必须先对镜像进行「标签重命名」,加上私有 Registry 的地址前缀,否则会默认推送到 Docker Hub(且大概率无权限)。
步骤如下:
- (可选)先拉取一个公共镜像作为测试:
docker pull nginx:latest - 对镜像进行标签重命名(核心步骤):
# 格式:docker tag [原镜像名]:[原标签] [私有Registry地址]:[端口]/[新镜像名]:[新标签] docker tag nginx:latest 192.168.1.100:5000/nginx:v1.0 - 推送到私有 Registry:
# 格式:docker push [私有Registry地址]:[端口]/[镜像名]:[标签] docker push 192.168.1.100:5000/nginx:v1.0 - 验证:推送成功后,可通过后续的 UI 工具查看镜像是否存在。
三、关键配置:优化私有 Registry 部署(避免数据丢失 + 开启核心功能)
默认启动的 Registry 存在两个问题:① 镜像存储在容器内,容器删除后数据丢失;② 禁用镜像删除功能,无法清理无用镜像。以下是优化配置:
1. 本地目录挂载(持久化存储镜像)
将 Registry 的镜像存储目录挂载到宿主机本地,确保容器删除后镜像数据不丢失:
# 1. 宿主机创建存储目录
mkdir -p /data/docker-registry
# 2. 启动 Registry 并挂载目录(-v 实现宿主机与容器目录映射)
docker run -d -p 5000:5000 --restart=always \
--name docker-registry \
-v /data/docker-registry:/var/lib/registry \ # 挂载存储目录(核心)
registry:2
/var/lib/registry:Registry 容器内默认的镜像存储目录,所有 push 进来的镜像都存在这里;- 后续宿主机
/data/docker-registry目录下会生成对应镜像的文件结构,直接备份该目录即可实现 Registry 数据备份。
2. 开启镜像删除功能
Registry 默认禁用删除功能,需通过环境变量开启,才能后续删除无用镜像释放磁盘空间:
# 停止并删除原有 Registry 容器(若已启动)
docker stop docker-registry && docker rm docker-registry
# 启动带删除功能的 Registry(添加 REGISTRY_STORAGE_DELETE_ENABLED=true)
docker run -d -p 5000:5000 --restart=always \
--name docker-registry \
-v /data/docker-registry:/var/lib/registry \
-e REGISTRY_STORAGE_DELETE_ENABLED=true \ # 开启镜像删除功能(核心)
registry:2
四、可视化管理:通过 UI 工具管理 Registry
纯命令行管理不够直观,推荐使用 Joxit Docker Registry UI(轻量易用),实现镜像的查看、删除、标签管理等可视化操作:
1. 快速部署 UI 容器(连接已启动的私有 Registry)
docker run -d -p 8080:80 --restart=always \
--name registry-ui \
-e REGISTRY_URL=http://192.168.1.100:5000 \ # 指向私有 Registry 地址(核心)
-e REGISTRY_TITLE="My Private Docker Registry" \ # 自定义 UI 标题
joxit/docker-registry-ui:latest
2. 访问与可视化操作
- 浏览器打开
http://192.168.1.100:8080(替换为你的服务器 IP),即可看到 Registry 中的所有镜像;- 查看镜像的所有标签、元数据(创建时间、大小等);
- 点击镜像标签后的「Delete」按钮,直接删除无用镜像 / 标签;
- 支持多 Registry 切换(若部署了多个私有 Registry)。核心操作:
五、高级管理:镜像垃圾回收(释放磁盘空间)
通过 UI 或 API 删除镜像标签后,Registry 仅标记该镜像为「已删除」,并未真正清理磁盘上的文件,需执行「垃圾回收」命令,才能彻底释放磁盘空间:
1. 执行垃圾回收命令
# 格式:docker exec -it [Registry 容器名] registry garbage-collect /etc/docker/registry/config.yml
docker exec -it docker-registry registry garbage-collect /etc/docker/registry/config.yml
2. 关键说明
- 垃圾回收会扫描
/var/lib/registry中的无用镜像文件,彻底删除未被引用的镜像层; - 可选:添加
--dry-run参数进行「模拟回收」,查看会删除哪些文件,不执行实际删除操作:
docker exec -it docker-registry registry garbage-collect --dry-run /etc/docker/registry/config.yml
- 建议:定期执行垃圾回收(如通过 crontab 定时任务),避免磁盘空间耗尽。
六、安全管理:开启 Basic 认证(防止匿名访问)
默认的私有 Registry 允许匿名推送 / 拉取,存在安全风险,需开启「用户名 + 密码」认证(Basic Auth):
1. 创建认证文件
# 1. 安装依赖工具(CentOS/Ubuntu 通用)
sudo yum install httpd-tools -y # CentOS/RHEL
# sudo apt install apache2-utils -y # Ubuntu/Debian
# 2. 创建认证目录并生成 htpasswd 文件(用户名:admin,可自定义)
mkdir -p /data/docker-registry/auth
htpasswd -Bc /data/docker-registry/auth/htpasswd admin
- 执行后会提示输入密码,重复输入两次即可(密码会被加密存储在 htpasswd 文件中);
- 若需添加多个用户,去掉
-c参数(避免覆盖原有文件):htpasswd -B /data/docker-registry/auth/htpasswd user2。
2. 重启 Registry 并启用认证
# 停止并删除原有 Registry 容器
docker stop docker-registry && docker rm docker-registry
# 启动带认证功能的 Registry
docker run -d -p 5000:5000 --restart=always \
--name docker-registry \
-v /data/docker-registry:/var/lib/registry \
-v /data/docker-registry/auth:/auth \ # 挂载认证文件目录
-e REGISTRY_STORAGE_DELETE_ENABLED=true \
-e REGISTRY_AUTH=htpasswd \ # 指定认证方式为 htpasswd
-e REGISTRY_AUTH_HTPASSWD_REALM="Docker Registry Realm" \ # 认证域(自定义)
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ # 认证文件路径
registry:2
3. 认证后操作
开启认证后,推送 / 拉取镜像前必须先登录 Registry:
# 登录私有 Registry(输入之前创建的用户名 admin 和密码)
docker login 192.168.1.100:5000
- 登录成功后,凭据会缓存到本地
~/.docker/config.json,后续操作无需重复登录; - 若需退出登录,执行
docker logout 192.168.1.100:5000。
总结
Docker Registry 管理的核心要点可概括为 5 点:
- 核心操作:镜像「标签重命名→push」、直接「pull」,私有仓库必须指定地址前缀;
- 数据安全:通过本地目录挂载实现镜像持久化,避免数据丢失;
- 可视化管理:使用 Joxit Docker Registry UI 简化镜像查看与删除;
- 磁盘清理:删除镜像标签后,执行垃圾回收命令彻底释放空间;
- 安全加固:开启 Basic 认证,防止匿名访问和镜像泄露。
按照以上流程配置后,即可搭建一套稳定、安全、易管理的私有 Docker 镜像仓库,满足中小团队的镜像存储与分发需求。
注意:本文归作者所有,未经作者允许,不得转载
