1.简介
使用Docker搭建私人仓库,主要有两种主流方案:快速简单的官方Registry和功能丰富的企业级Harbor。你可以根据"快速体验"或"生产级管理"的需求来选择。·
2.快速部署Docker Registry
快速搭建Docker Registry,这是最直接的方案,几分钟就能跑起来一个私有仓库。
2.1.一键启动仓库
在准备好的服务器上,执行以下命令,Docker就会启动一个名为registry的私有仓库容器,并将数据持久化在本地目录(比如/opt/registry目录):
bash
docker run -d \
-p 1000:5000 \
--restart=always \
-e REGISTRY_STORAGE_DELETE_ENABLED=true \
-v registry-data:/var/lib/registry \
--name registry \
registry:2 # 标签(tag),表示使用Registry v2版本
注:registry:2这个镜像内部的HTTP服务固定监听在5000端口,你不能直接改镜像内部的监听端口(除非自己build一个新镜像并修改配置文件)。但你可以自由改变宿主机的端口,只要把容器内的5000映射到你想要的宿主机端口即可,比如1000。
2.2.配置Docker客户端信任(HTTP模式)
由于我们暂未配置HTTPS,需要让Docker客户端明确信任这个"不安全"的仓库地址。编辑或创建/etc/docker/daemon.json文件,加入你的仓库地址(例如192.168.1.100:1000):
javascript
{
"insecure-registries" : ["192.168.1.100:1000"]
}
保存后,重启Docker服务使配置生效:
bash
sudo systemctl restart docker
别忘了重启你的registry容器:
bash
sudo docker start registry
2.3.推送与拉取镜像
(1)加入仓库地址:编辑C:\Users\[username]\.docker\daemon.json文件,加入你的仓库地址(例如192.168.1.100:1000)。
(2)构建(build)镜像:如果你以为已经构建了,但其实没有(因为我源码在Win系统,所以在Win系统上有Dockerfile的目录下构建镜象,再上传到线上私有仓库)。
bash
cd C:\Projects\NetTest\Jayden.Test.WebApi
docker build -t jayden.test.webapi:latest .
or
cd C:\Projects\NetTest
docker build -t jayden.test.webapi:latest -f Jayden.Test.WebApi/Dockerfile .
(3)标记(Tag)镜像:给本地镜像打上仓库地址的标签 。
bash
docker tag jayden.test.webapi:latest 192.168.1.100:1000/jayden.test.webapi:latest
(4)推送(Push)镜像:将打好标签的镜像推送到私有仓库 。
bash
docker push 192.168.1.100:1000/jayden.test.webapi:latest
(5)拉取(Pull)镜像:在其他配置了同样"不安全"仓库地址的机器上,就可以拉取这个镜像了。
bash
docker pull 192.168.1.100:1000/jayden.test.webapi:latest
2.4.删除仓库镜象
(1)列出所有仓库与tag:
bash
# 列出所有仓库
curl -s http://192.168.1.100:1000/v2/_catalog
# 列出某个仓库的所有tag
curl -s http://192.168.1.100:1000/v2/你的镜像名/tags/list
# 示例
curl -s http://192.168.1.100:1000/v2/myapp/tags/list
(2)获取要删除的tag对应的digest
重要:要带特殊的Accept头,不然拿到的digest不对,删不掉的。
bash
curl -I -sSL \
-H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
http://你的registry地址:1000/v2/你的镜像名/manifests/你要删的tag
# 示例
curl -I -sSL \
-H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
http://192.168.1.100:1000/v2/jayden.test.webapi/manifests/v2
or
# 如果registry储存的是旧的v1 manifest,某些registry会直接404,则使用如下脚本
curl -I -v \
-H "Accept: application/vnd.oci.image.index.v1+json" \
http://192.168.1.100:1000/v2/jayden.test.webapi/manifests/v2
重点看响应头里的这一行:
Docker-Content-Digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,记下这个sha256:...的值(完整digest)
(3)执行删除(软删除)
bash
curl -sSL -X DELETE \
http://你的registry地址:1000/v2/你的镜像名/manifests/刚才拿到的完整digest
# 示例
curl -sSL -X DELETE \
http://192.168.1.100:1000/v2/jayden.test.webapi/manifests/sha256:575eda8a4c13a68e2e110fe99868a93fda39caf973e479ba16ef67d911adc821
(4)执行垃圾回收释放空间
bash
docker exec -it registry bin/registry garbage-collect /etc/docker/registry/config.yml
(5)查看仓库内容
bash
# 查看所有标签镜象
curl -s http://192.168.1.100:1000/v2/_catalog
# 查看特定标签镜象
curl -s http://192.168.1.100:1000/v2/jayden.test.webapi/tags/list
2.5.删除仓库
目前官方Registry v2没有直接的"删除整个仓库(repository)"API,最可靠的方式是:
(1)先删除该仓库下所有tag(manifest)。
(2)如果仓库变空了,直接在宿主机上物理删除目录(最简单粗暴)。
示例:
bash
# 进入registry容器内部查看有哪些仓库
docker exec -it registry ls /var/lib/registry/docker/registry/v2/repositories
# 假设要删的仓库叫jayden.test.webapi
docker exec -it registry rm -rf /var/lib/registry/docker/registry/v2/repositories/jayden.test.webapi
3.部署企业级Harbor
如果你的需求不止于存储,还需要管理,那么Harbor是更理想的选择。
3.1.下载与准备
访问Harbor的GitHub Releases页面,下载最新或指定版本的离线安装包(.tgz文件),离线包包含了所有必要的Docker镜像,适合网络环境受限的情况:
bash
# 创建downloads目录
mkdir -p /opt/downloads
# 下载Harbor离线包(请根据需要替换版本号)
wget /opt/downloads https://github.com/goharbor/harbor/releases/download/v2.14.2/harbor-offline-installer-v2.14.2.tgz
解压安装包:
bash
# 解压安装包
cd /opt/downloads
tar xvf harbor-offline-installer-v2.14.2.tgz -C /opt
3.2. 配置Harbor
Harbor的主配置文件是harbor.yml。首先从模板复制一份:
bash
cd /opt/harbor
cp harbor.yml.tmpl harbor.yml
mkdir -p /opt/harbor/data
mkdir -p /opt/harbor/logs
然后,使用文本编辑器(如vi)编辑harbor.yml文件,必须修改以下几项:
(1)hostname:修改为你的Harbor服务器的IP地址或域名。这是访问Harbor的入口地址。
(2)http:可以修改HTTP服务的端口,默认为80。
(3)https:生产环境强烈建议配置HTTPS。如果只是测试环境,可以将https 相关的部分注释掉。
(4)harbor_admin_password:修改管理员admin的登录密码。
一个最小化的配置示例(vi /opt/harbor/harbor.yml):
bash
# 关键配置项
hostname: 192.168.1.100 # 替换为你的实际IP或域名
# http 相关配置
http:
port: 8090
# 注释掉 https 部分以在测试环境禁用 HTTPS
# https:
# port: 443
# certificate: /your/certificate/path
# private_key: /your/private/key/path
# 管理员密码
harbor_admin_password: YourStrongPasswordHere # 修改为强密码
# The default data volume
data_volume: /opt/harbor/data
# The directory on your host that store log
location: /opt/harbor/logs
3.3.安装并启动Harbor
一切就绪后,运行安装脚本。脚本会自动加载镜像并启动所有服务:
bash
# 执行安装脚本
cd /opt/harbor
./install.sh
# 重启全部服务
docker compose down && docker compose up -d
安装过程需要几分钟时间,如果看到✔ ----Harbor has been installed and started successfully.---- 类似的提示,就表示安装成功了。
3.4.验证部署
打开浏览器,输入你在harbor.yml中配置的hostname(例如http://192.168.1.100:8090)。如果看到Harbor的Web登录界面,说明部署成功。
(1)用户名:admin
(2)密码:你在配置文件中设置的harbor_admin_password
3.5配置Docker客户端使用Harbor
为了让Docker命令能够与你的私有Harbor仓库交互,需要在所有需要使用此仓库的Docker客户端机器上进行以下配置。
3.5.1.配置insecure-registry(如果未配置HTTPS)
如果你没有为Harbor配置HTTPS证书,那么Docker客户端默认会拒绝与不安全的HTTP仓库通信。你需要将Harbor地址添加到Docker守护进程的insecure-registries配置中。编辑或创建/etc/docker/daemon.json 文件:
bash
vi /etc/docker/daemon.json
添加以下内容(请替换192.168.1.100为你的Harbor地址和端口):
bash
{
"insecure-registries": ["192.168.1.100:8090"]
}
保存文件后,重启Docker服务:
bash
systemctl daemon-reload
systemctl restart docker
3.5.2.登录Harbor
现在,你可以在客户端使用docker login命令登录Harbor了。
bash
docker login 192.168.1.100:8090 # 使用你的Harbor地址和端口
or
docker login http://192.168.1.100:8090
or
docker login -u admin http://192.168.1.100:8090
按提示输入用户名(admin)和密码。
3.5.3.推送镜像
登录成功后,就可以像使用Docker Hub一样使用你的私有仓库了。
bash
# 切换Jayden.Test.WebApi根目录
cd C:\Projects\NetTest
# 建立一个本地镜像,格式为:镜像名:标签
docker build -t jayden-test-webapi:v1 -f Jayden.Test.WebApi/Dockerfile .
# 标记一个本地镜像,格式为:Harbor地址/项目名/镜像名:标签
docker tag jayden-test-webapi:v1 192.168.1.100:8090/test/jayden-test-webapi:v1
# 推送镜像到 Harbor
docker push 192.168.1.100:8090/test/jayden-test-webapi:v1
若上述步骤无效,可尝试彻底清理本地Docker状态再重新推拉:
bash
docker system prune -a # 清除所有未使用的镜象、容器、快照
这里的test是Harbor中我新建一个公开项目,默认公开项目是library。你也可以在Web界面中创建更多的项目不同用户来管理不同的镜像集合。如下图所示:



3.5.4.拉取镜像
bash
# 从Harbor拉取镜像
docker pull 192.168.1.100:8090/test/jayden-test-webapi:v1
如下图所示:

参考资料:
Docker仓库管理:https://www.runoob.com/docker/docker-repository.html