Docker 私有镜像仓库 一:Docker Registry
在企业和个人开发中,搭建一套稳定可靠的 Docker 私有镜像仓库(Docker Registry)非常重要,能够极大地提升镜像管理效率和安全性。本文将详细介绍如何在 Rocky Linux 系统上,使用 Docker 官方 Registry 镜像快速搭建一个私有镜像仓库,并支持基本认证和 Docker Compose 启动方式。
1. 为什么要搭建 Docker 私有镜像仓库?
节省带宽和时间:将镜像保存在内网,拉取更快,避免重复下载外网镜像。
安全管理:限制访问权限,保护企业核心镜像不被外泄。
镜像版本控制:方便团队协作,控制镜像版本和发布流程。
2. 环境准备
操作系统:Rocky Linux
Docker 已安装并正常运行
有一定的 Linux 基础操作能力
3. 搭建 Docker Registry
3.1 创建镜像存储目录
mkdir -p /opt/registry/data
3.2 编写 docker-compose.yml 启动脚本
文件路径:/root/docker-compose.yml
version: '3'
services:
registry:
image: registry:2.8.2
restart: always
ports:
- "5000:5000"
volumes:
- /opt/registry/data:/var/lib/registry
3.3 创建并启动registry 容器
docker-compose up -d
4. 防火墙放行5000端口(Firewalld)
# 永久放行 TCP 5000端口
sudo firewall-cmd --permanent --add-port=5000/tcp
# 重新加载防火墙配置
sudo firewall-cmd --reload
# 查看是否生效
sudo firewall-cmd --list-ports
5.添加基本认证
5.1 安装密码生成工具
sudo dnf install -y httpd-tools
mkdir -p /opt/registry/auth
htpasswd -Bc /opt/registry/auth/htpasswd admin
5.2 修改 Compose 配置
version: '3'
services:
registry:
image: registry:2.8.2
restart: always
ports:
- "5000:5000"
volumes:
- /opt/registry/data:/var/lib/registry
- /opt/registry/auth:/auth
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: "Registry Realm"
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
重新启动:
docker-compose down
docker-compose up -d
6.配置Docker客户端信任
因为默认 Docker 客户端不信任 HTTP 协议,需要配置 insecure-registries
,步骤如下:
编辑 /etc/docker/daemon.json
:
{
"insecure-registries": ["http://192.168.2.100:5000"]
}
保存后重启 Docker 服务:
sudo systemctl restart docker
7.测试镜像推拉
登录docker
docker login --username=admin --password=*** http://192.168.2.100:5000
经过测试,协议头[http://]可有可无,
docker pull alpine
docker tag alpine <你的服务器IP>:5000/alpine
docker push <你的服务器IP>:5000/alpine
docker rmi <你的服务器IP>:5000/alpine
docker pull <你的服务器IP>:5000/alpine
示例:
docker pull alpine
docker tag alpine 192.168.2.100:5000/alpine
docker push 192.168.2.100:5000/alpine
docker rmi 192.168.2.100:5000/alpine
docker pull 192.168.2.100:5000/alpine
8.查看镜像列表
方法一:使用 Registry HTTP API v2
Docker Registry 提供了 RESTful API,可以通过如下命令查询:
1. 查看仓库中所有镜像(镜像名,不含 tag)
curl http://<registry-host>:5000/v2/_catalog
返回示例:
{
"repositories": [
"nginx",
"myapp",
"alpine"
]
}
2. 查看某个镜像的所有 tag
curl http://<registry-host>:5000/v2/<镜像名>/tags/list
例如:
curl http://<registry-host>:5000/v2/nginx/tags/list
返回示例:
{
"name": "nginx",
"tags": [
"latest",
"1.25.3-alpine"
]
}
🔐 如果你启用了认证(Basic Auth),记得加上 -u
参数:
curl -u admin:password http://<registry-host>:5000/v2/_catalog
方法二:使用开源工具增强管理体验(推荐)
Docker Registry 本身没有图形界面。如果你想更方便地查看镜像列表和 tag,可以用这些 UI 工具:
1. Docker Registry UI (Joxit)
启动方式(Docker Compose):
version: '3'
services:
registry:
image: registry:2.8.2
ports:
- "5000:5000"
volumes:
- /opt/registry/data:/var/lib/registry
environment:
# CORS 设置
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin: '[http://192.168.2.100:8080]'
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Methods: '[HEAD,GET,OPTIONS,DELETE]'
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Credentials: '[true]'
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Headers: '[Authorization,Accept,Cache-Control]'
REGISTRY_HTTP_HEADERS_Access-Control-Expose-Headers: '[Docker-Content-Digest]'
ui:
image: joxit/docker-registry-ui:latest
ports:
- "8080:80"
environment:
- REGISTRY_TITLE=My Private Registry
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
如果带密码认证配置如下:
version: '3'
services:
registry:
image: registry:2.8.2
restart: always
ports:
- "5000:5000"
volumes:
- /opt/registry/data:/var/lib/registry
- /opt/registry/auth:/auth
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: "Registry Realm"
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
# CORS 设置
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin: '[http://192.168.2.100:8080]'
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Methods: '[HEAD,GET,OPTIONS,DELETE]'
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Credentials: '[true]'
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Headers: '[Authorization,Accept,Cache-Control]'
REGISTRY_HTTP_HEADERS_Access-Control-Expose-Headers: '[Docker-Content-Digest]'
ui:
image: joxit/docker-registry-ui:latest
ports:
- "8080:80"
environment:
- REGISTRY_TITLE=My Private Registry
- REGISTRY_URL=http://127.0.0.1:5000
- DELETE_IMAGES=true
- SINGLE_REGISTRY=true
- REGISTRY_USER=admin # 指定用户名
- REGISTRY_PASS=*** # 指定密码(与 htpasswd 中一致)
depends_on:
- registry
添加防火墙:
# 永久放行 TCP 8080 端口
sudo firewall-cmd --permanent --add-port=8080/tcp
# 重新加载防火墙配置
sudo firewall-cmd --reload
# 查看是否生效
sudo firewall-cmd --list-ports
访问地址:
http://<你的主机>:8080
2. 使用 Harbor(更高级图形界面)
如果你有高阶需求(权限、项目隔离、镜像扫描、LDAP 集成等),可以用 Harbor 替代原始 Registry,我可以帮你配置完整 Harbor 服务。