(2)Docker搭建私人仓库

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

相关推荐
笨蛋不要掉眼泪2 小时前
从零构建微服务网关:Spring Cloud Gateway 核心原理与实战配置详解
java·微服务·云原生·架构
悠闲蜗牛�2 小时前
下一代API网关深度实践:基于Spring Cloud Gateway的云原生网关架构与治理平台
微服务·云原生·架构
Coder_Boy_2 小时前
以厨房连锁故事为引,梳理Java后端全技术脉络(JVM到云原生,总结篇)
java·jvm·spring boot·分布式·spring·云原生
白云偷星子2 小时前
云原生笔记1
笔记·云原生
AC赳赳老秦2 小时前
2026云原生AI规模化趋势预测:DeepSeek在K8s集群中的部署与运维实战
运维·人工智能·云原生·架构·kubernetes·prometheus·deepseek
cyber_两只龙宝12 小时前
Nginx--企业高性能web服务器高级配置详解
linux·运维·nginx·云原生
forestsea15 小时前
Spring Boot 4.0 + JDK 25 + GraalVM:下一代云原生Java应用架构
java·spring boot·云原生
江畔何人初16 小时前
kubernetes中configmap与secret的区别
linux·运维·云原生·容器·kubernetes
猫头虎18 小时前
[精选] 2025最新MySQL和PostgreSQL区别、迁移、安全、适用场景全解析
运维·数据库·mysql·安全·postgresql·云原生·容器