对于小规模团队或PoC测试环境,使用Docker Registry搭建本地私有镜像仓库是一种常见方案。然而,单纯通过命令行管理镜像往往不够直观。是否存在开源的UI工具来对接并管理本地的Registry及其镜像呢?
答案是肯定的。在GitHub上,曾有两个Star数约3k的相关项目:Portus和docker-registry-ui。其中,Portus已于2023年4月停止维护。因此,本文将重点介绍 docker-registry-ui。这个项目旨在为本地私有Registry提供一个简单、完整的Web用户界面,极大地方便了开发者和运维人员进行镜像的可视化管理。

项目GitHub地址:https://github.com/Joxit/docker-registry-ui
docker-registry-ui的主要功能亮点包括:
- 直观展示和管理私有仓库中的镜像。
- 支持管理多个仓库。
- 支持批量删除镜像标签。
- 提供镜像检索功能。
- 可直接查看镜像的Dockerfile构建历史。
以下实战演练均在 Ubuntu 24.04 系统上完成,服务器IP为 192.168.56.13。
1、安装与配置 Docker 环境
由于Registry和docker-registry-ui均以容器化方式运行,因此首先需要安装并配置Docker环境。
# 1)添加 Docker 的官方 GPG 密钥
sudo apt-get update
sudo apt install curl apt-transport-https ca-certificates software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 2)添加 apt 源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
# 3)安装 Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 4)启动 Docker 服务
sudo systemctl start docker
接下来,配置Docker的日志、数据目录、镜像加速以及允许非安全HTTP访问私有仓库。
vim /etc/docker/daemon.json
将以下配置内容添加到文件中:
{
"storage-driver": "overlay2",
"log-opts": { # 日志大小和数量限制
"max-file": "2",
"max-size": "256m"
},
"data-root": "/data/docker", # 容器默认数据目录
"live-restore": true, # Docker守护进程重启不影响正在运行的容器
"insecure-registries": ["192.168.56.13:5000"], # 允许非安全访问的私有仓库地址
"registry-mirrors": [ # 国内镜像加速源
"https://docker.m.daocloud.io",
"https://docker.1panel.live",
"https://hub.rat.dev"
]
}
配置完成后,重启Docker服务使配置生效:
sudo systemctl restart docker
2、安装配置本地私有仓库 Registry
首先拉取并运行官方的Registry镜像。
# 拉取镜像
docker pull registry:2
# 启动本地镜像仓库容器
docker run -tid -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name local-registry registry:2
为了使Registry能与后续的UI工具(docker-registry-ui)完美配合,尤其是支持镜像删除等功能,需要修改其配置文件。
# 进入容器
docker exec -uroot -it local-registry /bin/sh
# 编辑配置文件 /etc/docker/registry/config.yml
配置文件关键部分修改如下(重点关注 delete 和 http.headers 部分):
version: 0.1
log:
fields:
service: registry
storage:
delete: # 启用镜像删除功能
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
# 以下配置为适配UI工具而添加,解决跨域等问题
Access-Control-Allow-Origin: ['http://192.168.56.13:8080']
Access-Control-Allow-Headers: ['Accept', 'Cache-Control']
Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE']
Access-Control-Expose-Headers: ['Docker-Content-Digest']
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
修改完成后,退出容器并重启该容器使配置生效:docker restart local-registry
至此,Docker及私有Registry已配置完成。可以通过命令查看运行状态。

现在,我们拉取一个测试镜像并推送到刚搭建好的私有仓库中,验证其功能。
# 从 Docker Hub 拉取 nginx 镜像
docker pull nginx
# 为镜像打上私有仓库的标签
docker tag nginx:latest 192.168.56.13:5000/nginx:mylocal
# 推送镜像至私有仓库
docker push 192.168.56.13:5000/nginx:mylocal
# 通过 Registry API 查看仓库中的镜像列表
curl -XGET http://192.168.56.13:5000/v2/_catalog
# 预期输出:{"repositories":["nginx"]}
# 查看指定镜像的标签列表
curl http://localhost:5000/v2/nginx/tags/list
# 预期输出:{"name":"nginx","tags":["mylocal"]}

3、安装配置 docker-registry-ui
Registry运行无误后,我们来部署其图形化管理界面。
3.1 拉取 UI 镜像
docker pull joxit/docker-registry-ui:main
3.2 启动 UI 容器
通过环境变量可以灵活配置UI的各项参数。运行以下命令启动容器:
docker run -d -p 8080:80 \
--env REGISTRY_TITLE='AI Cloud Private Docker Registry' \ # 设置UI主页标题
--env REGISTRY_URL=http://192.168.56.13:5000 \ # 设置要连接的私有仓库地址
--env SINGLE_REGISTRY=true \ # 简化界面,隐藏仓库管理菜单
--env DELETE_IMAGES=true \ # 启用镜像删除功能
--env SHOW_CONTENT_DIGEST=true \ # 展示镜像摘要(Digest)
--env SHOW_CATALOG_NB_TAGS=true \ # 显示每个仓库的镜像标签数量
--env TAGLIST_PAGE_SIZE=100 \ # 设置单页展示的标签数量
--env REGISTRY_SECURED=false \ # 设置无身份验证(如启用需配置true及认证信息)
--env CATALOG_ELEMENTS_LIMIT=1000 \
--env DOCKER_REGISTRY_UI_TITLE='Docker Registry UI AI-Cloud' \ # 浏览器标签页标题
--env THEME=dark \ # 设置页面主题,可选 dark, light, auto
--name docker-registry-ui \
joxit/docker-registry-ui:main
3.3 登录UI查看与管理镜像
如果容器启动成功,在浏览器中访问 http://192.168.56.13:8080,即可看到管理界面。主页会展示之前推送到Registry的 nginx:mylocal 镜像。

3.4 删除镜像
在UI中删除镜像非常简单直观。点击想要管理的镜像(如 nginx),进入其标签详情页。

选择要删除的标签(如 mylocal),点击删除按钮,在确认对话框中再次确认。

操作完成后,可以通过命令行验证镜像是否已被成功删除。
curl -XGET http://localhost:5000/v2/_catalog
curl http://localhost:5000/v2/nginx/tags/list

3.5 查询镜像详细信息
UI提供了丰富的镜像元信息展示。在镜像详情页,可以查看镜像的创建时间、系统架构、环境变量、作者信息以及构建历史层。


3.6 查询镜像Dockerfile
在镜像的历史详情页面,你还可以直接查看到构成该镜像的每一层所对应的Dockerfile指令,这对于学习镜像构建和排查问题非常有帮助。

至此,我们完成了从零搭建私有Docker镜像仓库,并为其配置了一个功能完善的图形化管理界面的全过程。
总结
在小规模开发测试或内部环境中,使用Docker Registry搭建私有仓库是性价比很高的选择。然而,纯命令行操作对新手不够友好,也缺乏管理的直观性。本文介绍的 docker-registry-ui 这款工具,恰好弥补了这一短板。它通过与Registry的API对接,提供了镜像的图形化展示、查询、删除及深度信息查看功能,两者结合堪称“珠联璧合”,极大提升了私有镜像仓库的管理效率和体验。这套组合方案尤其适合初创团队、运维人员以及对云原生技术栈有学习需求的开发者。
希望这篇实战指南能帮助你轻松搭建起自己的可视化私有镜像仓库。如果你想探索更多运维开发或云原生领域的实战技巧,欢迎访问 云栈社区 与广大开发者交流讨论。