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/data3.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/registry3.3 创建并启动registry 容器
docker-compose up -d4. 防火墙放行5000端口(Firewalld)
# 永久放行 TCP 5000端口
sudo firewall-cmd --permanent --add-port=5000/tcp
# 重新加载防火墙配置
sudo firewall-cmd --reload
# 查看是否生效
sudo firewall-cmd --list-ports5.添加基本认证
5.1 安装密码生成工具
sudo dnf install -y httpd-tools
mkdir -p /opt/registry/auth
htpasswd -Bc /opt/registry/auth/htpasswd admin5.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 -d6.配置Docker客户端信任
因为默认 Docker 客户端不信任 HTTP 协议,需要配置 insecure-registries,步骤如下:
编辑 /etc/docker/daemon.json:
{
  "insecure-registries": ["192.168.2.100:5000"]
}注意:这里不需要带协议头
保存后重启 Docker 服务:
sudo systemctl restart docker7.测试镜像推拉
登录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/alpine8.查看镜像列表
方法一:使用 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 服务。
 
 

