Docker私有仓库搭建与使用
一、环境说明(适配你的配置)
-
系统版本:Rocky Linux 9.4
-
虚拟机环境:VMware NAT 模式
-
服务端IP:192.168.93.128
-
网卡名称:ens160(无需桥接,纯NAT运行)
-
私有仓库端口:5000(镜像推拉)
-
Web管理端口:80(浏览器访问)
-
镜像存储路径:/opt/registry/data
-
核心要求:全程仅使用dnf命令,无yum相关操作
二、服务端部署(手动操作步骤)
1. 安装Docker与Docker Compose(纯dnf)
👉 可直接复制运行命令块
# 1. 卸载旧版本Docker(避免冲突)
sudo dnf remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine# 2. 安装dnf工具依赖
sudo dnf install -y dnf-utils# 3. 添加Docker官方仓库(纯dnf命令)
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 4. 安装Docker核心组件
sudo dnf install -y docker-ce docker-ce-cli containerd.io# 5. 启动Docker并设置开机自启
sudo systemctl enable --now docker# 6. 安装Docker Compose插件
sudo dnf install -y docker-compose-plugin# 7. 验证安装(查看版本)
docker --version
docker compose version
2. 部署私有仓库(Registry)+ Web管理UI
👉 可直接复制运行命令块
# 1. 创建仓库工作目录
sudo mkdir -p /opt/registry && cd /opt/registry# 2. 创建docker-compose.yml配置文件
sudo vi docker-compose.yml
在打开的文件中,粘贴以下完整配置(含跨域修复,无需修改):
👉 可直接复制粘贴配置
services:registry:image: registry:2container_name: registryrestart: alwaysports:- 5000:5000volumes:- ./data:/var/lib/registry # 镜像数据持久化environment:# 跨域配置,解决Web UI无法显示镜像问题- REGISTRY_HTTP_HEADERS_ACCESS-CONTROL-ALLOW-ORIGIN=["http://192.168.93.128"]- REGISTRY_HTTP_HEADERS_ACCESS-CONTROL-ALLOW-METHODS=["GET", "OPTIONS", "HEAD", "DELETE"]- REGISTRY_HTTP_HEADERS_ACCESS-CONTROL-ALLOW-HEADERS=["Authorization", "Accept", "Content-Type", "Origin"]- REGISTRY_HTTP_HEADERS_ACCESS-CONTROL-ALLOW-CREDENTIALS=[true]ui:image: joxit/docker-registry-ui:latestcontainer_name: registry-uirestart: alwaysports:- 80:80 # Web访问端口environment:- REGISTRY_TITLE=我的私有Docker仓库- REGISTRY_URL=http://192.168.93.128:5000 # 指向私有仓库API- NGINX_PROXY_PASS_URL=http://registry:5000
3. 启动私有仓库服务
👉 可直接复制运行命令块
# 后台启动服务(无日志输出)
sudo docker compose up -d# 查看容器运行状态(确认Up状态即为成功)
sudo docker compose ps
4. 服务端配置信任HTTP仓库
Docker默认仅信任HTTPS仓库,需配置信任自建HTTP仓库:
👉 可直接复制运行命令块
# 编辑Docker守护进程配置文件
sudo vi /etc/docker/daemon.json
粘贴以下配置(含国内镜像加速,提升公共镜像拉取速度):
👉 可直接复制粘贴配置
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"], # 国内加速源"insecure-registries": ["192.168.93.128:5000"] # 信任私有HTTP仓库
}
重启Docker使配置生效:
👉 可直接复制运行命令块
sudo systemctl daemon-reload
sudo systemctl restart docker
5. 测试镜像上传(验证仓库可用)
👉 可直接复制运行命令块
# 1. 拉取公共nginx镜像(测试用)
docker pull nginx# 2. 为镜像打私有仓库标签(必须符合仓库地址格式)
docker tag nginx 192.168.93.128:5000/my-nginx# 3. 上传镜像到私有仓库
docker push 192.168.93.128:5000/my-nginx
6. Web管理界面访问
在浏览器中输入以下地址,即可可视化管理私有仓库:
👉 可直接复制访问地址
http://192.168.93.128
成功访问后,可看到上传的my-nginx镜像,支持查看、删除等操作。
三、客户端配置(拉取私有仓库镜像)
所有需要拉取私有仓库镜像的客户端机器,都需执行以下配置(同样纯dnf环境适配):
👉 可直接复制运行命令块
# 1. 编辑Docker守护进程配置
sudo vi /etc/docker/daemon.json
粘贴以下配置(与服务端一致,仅需信任私有仓库):
👉 可直接复制粘贴配置
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],"insecure-registries": ["192.168.93.128:5000"]
}
重启Docker生效:
👉 可直接复制运行命令块
sudo systemctl daemon-reload
sudo systemctl restart docker
拉取私有仓库镜像测试:
👉 可直接复制运行命令块
# 拉取之前上传的my-nginx镜像
docker pull 192.168.93.128:5000/my-nginx# 可选:运行镜像验证
docker run -d --name test-nginx 192.168.93.128:5000/my-nginx
四、一键脚本(无需手动操作,直接运行)
1. 服务端一键部署脚本(install-registry.sh)
脚本功能:自动完成Docker安装、仓库部署、配置信任、防火墙放行,全程无需干预。
👉 可直接复制脚本内容
#!/bin/bashset -e # 脚本出错时自动退出echo "====================================="
echo " Docker 私有仓库一键部署脚本 "
echo " 适配 Rocky9.4 纯 dnf 命令 "
echo " 服务端IP:192.168.93.128 "
echo "====================================="# 1. 卸载旧版本Docker
echo "【1/12】卸载旧版本Docker..."
sudo dnf remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine &>/dev/null# 2. 安装dnf工具依赖
echo "【2/12】安装dnf-utils工具..."
sudo dnf install -y dnf-utils &>/dev/null# 3. 添加Docker官方仓库
echo "【3/12】添加Docker官方源..."
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo &>/dev/null# 4. 安装Docker核心组件
echo "【4/12】安装Docker引擎..."
sudo dnf install -y docker-ce docker-ce-cli containerd.io &>/dev/null# 5. 启动Docker并设置开机自启
echo "【5/12】启动Docker服务..."
sudo systemctl enable --now docker &>/dev/null# 6. 安装Docker Compose插件
echo "【6/12】安装Docker Compose插件..."
sudo dnf install -y docker-compose-plugin &>/dev/null# 7. 创建仓库工作目录
echo "【7/12】创建仓库存储目录..."
sudo mkdir -p /opt/registry && cd /opt/registry &>/dev/null# 8. 生成docker-compose.yml配置文件
echo "【8/12】生成仓库配置文件..."
sudo cat > docker-compose.yml <<EOF
services:registry:image: registry:2container_name: registryrestart: alwaysports:- 5000:5000volumes:- ./data:/var/lib/registryenvironment:- REGISTRY_HTTP_HEADERS_ACCESS-CONTROL-ALLOW-ORIGIN=["http://192.168.93.128"]- REGISTRY_HTTP_HEADERS_ACCESS-CONTROL-ALLOW-METHODS=["GET","OPTIONS","HEAD","DELETE"]- REGISTRY_HTTP_HEADERS_ACCESS-CONTROL-ALLOW-HEADERS=["Authorization","Accept","Content-Type","Origin"]- REGISTRY_HTTP_HEADERS_ACCESS-CONTROL-ALLOW-CREDENTIALS=[true]ui:image: joxit/docker-registry-ui:latestcontainer_name: registry-uirestart: alwaysports:- 80:80environment:- REGISTRY_TITLE=我的私有仓库- REGISTRY_URL=http://192.168.93.128:5000- NGINX_PROXY_PASS_URL=http://registry:5000
EOF# 9. 启动私有仓库服务
echo "【9/12】启动私有仓库容器..."
sudo docker compose up -d &>/dev/null# 10. 配置Docker信任私有仓库
echo "【10/12】配置仓库信任..."
sudo cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],"insecure-registries": ["192.168.93.128:5000"]
}
EOF# 11. 重启Docker使配置生效
echo "【11/12】重启Docker服务..."
sudo systemctl daemon-reload &>/dev/null
sudo systemctl restart docker &>/dev/null# 12. 放行防火墙端口(80、5000)
echo "【12/12】放行防火墙端口..."
sudo firewall-cmd --add-port=80/tcp --permanent &>/dev/null
sudo firewall-cmd --add-port=5000/tcp --permanent &>/dev/null
sudo firewall-cmd --reload &>/dev/nullecho "====================================="
echo " 部署完成!✅"
echo "-------------------------------------"
echo " 私有仓库地址:192.168.93.128:5000"
echo " Web管理地址:http://192.168.93.128"
echo " 镜像存储目录:/opt/registry/data"
echo "====================================="
脚本使用方法:
👉 可直接复制运行命令块
# 1. 创建脚本文件
sudo vi install-registry.sh# 2. 粘贴上面的脚本内容,保存退出# 3. 赋予脚本执行权限
sudo chmod +x install-registry.sh# 4. 运行脚本(全程自动,无需手动操作)
sudo ./install-registry.sh
2. 客户端一键配置脚本(client-config.sh)
脚本功能:自动配置客户端Docker信任私有仓库,无需手动编辑配置文件。
👉 可直接复制脚本内容
#!/bin/bashset -eecho "====================================="
echo " Docker 客户端一键配置脚本 "
echo " 适配 Rocky9.4 纯 dnf 环境 "
echo " 私有仓库:192.168.93.128:5000 "
echo "====================================="# 1. 编辑Docker守护进程配置
echo "【1/3】配置Docker信任私有仓库..."
sudo cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],"insecure-registries": ["192.168.93.128:5000"]
}
EOF# 2. 重启Docker服务
echo "【2/3】重启Docker使配置生效..."
sudo systemctl daemon-reload &>/dev/null
sudo systemctl restart docker &>/dev/null# 3. 测试仓库连通性
echo "【3/3】测试仓库连通性..."
if docker pull 192.168.93.128:5000/my-nginx &>/dev/null; thenecho "配置成功!✅ 可正常拉取私有仓库镜像"
elseecho "配置完成!⚠️ 请确认服务端仓库已启动且镜像存在"
fiecho "====================================="
脚本使用方法:
👉 可直接复制运行命令块
# 1. 创建脚本文件
sudo vi client-config.sh# 2. 粘贴上面的脚本内容,保存退出# 3. 赋予脚本执行权限
sudo chmod +x client-config.sh# 4. 运行脚本
sudo ./client-config.sh
五、常用管理命令
👉 可直接复制运行命令块
# 1. 启动/重启私有仓库
sudo cd /opt/registry && docker compose up -d# 2. 停止私有仓库
sudo cd /opt/registry && docker compose down# 3. 查看容器运行状态
sudo docker compose ps# 4. 查看私有仓库所有镜像(服务端)
sudo docker exec registry registry catalog# 5. 删除私有仓库中的镜像(需先在Web界面删除,再清理存储)
sudo rm -rf /opt/registry/data/docker/registry/v2/repositories/my-nginx# 6. 查看Docker日志(排查问题)
sudo journalctl -u docker -f# 7. 重启Docker服务
sudo systemctl restart docker
六、注意事项(重点)
-
HTTP仓库必须配置insecure-registries:Docker默认仅支持HTTPS仓库,未配置会报「http: server gave HTTP response to HTTPS client」错误,服务端和所有客户端都需配置。
-
区分两个配置项:
-
registry-mirrors:用于加速公共镜像(如Docker Hub),不能填写私有仓库地址;
-
insecure-registries:专门用于信任HTTP私有仓库,必须单独填写。
-
-
修改daemon.json后必须重启Docker:不重启配置不生效,会持续报错。
-
防火墙配置:服务端需放行80(Web)和5000(仓库)端口,测试环境可临时关闭防火墙(sudo systemctl stop firewalld)。
-
无需桥接网卡:VMware NAT模式下,直接使用服务端IP 192.168.93.128即可,无需额外配置桥接,避免网络冲突。
-
镜像数据安全:镜像存储在/opt/registry/data目录,请勿随意删除或修改,建议定期备份该目录。
-
Web UI跨域问题:必须在docker-compose.yml中配置跨域环境变量,否则Web界面无法显示镜像列表,若报错可重启容器(docker compose down && docker compose up -d)。
七、常见问题排查
-
报错:http: server gave HTTP response to HTTPS client
-
原因:未配置insecure-registries,Docker强制使用HTTPS访问HTTP仓库。
-
解决:按客户端/服务端配置步骤,添加信任并重启Docker。
-
-
Web界面无法显示镜像
-
原因:Registry容器未配置跨域响应头,或容器未正常启动。
-
解决:使用文档中完整的docker-compose.yml配置,重启容器。
-
-
客户端无法拉取镜像
- 排查步骤:① 客户端ping 192.168.93.128(测试网络连通);② telnet 192.168.93.128 5000(测试端口开放);③ 确认客户端已配置insecure-registries并重启Docker;④ 确认服务端仓库正常运行。
-
脚本运行报错:权限不足
- 解决:所有脚本执行前需赋予执行权限(chmod +x 脚本名),并使用sudo运行。
八、可选安全加固(添加账号密码认证)
默认仓库无认证,任何人可访问/上传,可添加账号密码保护:
👉 可直接复制运行命令块
# 1. 进入仓库目录
sudo cd /opt/registry# 2. 创建认证目录
sudo mkdir -p auth && cd auth# 3. 生成账号密码(替换admin/123456为自己的账号密码)
sudo docker run --rm --entrypoint htpasswd httpd:2 -Bbn admin 123456 > htpasswd# 4. 修改docker-compose.yml,添加认证配置
sudo vi /opt/registry/docker-compose.yml
修改后的registry服务配置(添加volumes和environment):
👉 可直接复制粘贴配置
registry:image: registry:2container_name: registryrestart: alwaysports:- 5000:5000volumes:- ./data:/var/lib/registry- ./auth:/auth # 挂载认证目录environment:- REGISTRY_HTTP_HEADERS_ACCESS-CONTROL-ALLOW-ORIGIN=["http://192.168.93.128"]- REGISTRY_HTTP_HEADERS_ACCESS-CONTROL-ALLOW-METHODS=["GET", "OPTIONS", "HEAD", "DELETE"]- REGISTRY_HTTP_HEADERS_ACCESS-CONTROL-ALLOW-HEADERS=["Authorization", "Accept", "Content-Type", "Origin"]- REGISTRY_HTTP_HEADERS_ACCESS-CONTROL-ALLOW-CREDENTIALS=[true]- REGISTRY_AUTH=htpasswd # 开启认证- REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm- REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd # 认证文件路径
重启服务生效:
👉 可直接复制运行命令块
sudo cd /opt/registry && docker compose down && docker compose up -d
客户端访问前需先登录:
👉 可直接复制运行命令块
docker login 192.168.93.128:5000 -u admin -p 123456
(注:文档部分内容可能由 AI 生成)
