1.安装
harbor下载地址
https://github.com/goharbor/harbor/releases
安装 Docker Compose:
必须安装。Harbor v2.x+ 推荐使用 Docker Compose V2。
shell
# 从 GitHub 直接下载 Docker Compose V2 二进制文件(推荐)
# 请根据你的架构选择正确的版本,通常是 x86_64
curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予可执行权限
chmod +x /usr/local/bin/docker-compose
# 创建符号链接以便在任意目录下使用
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 验证安装
docker-compose --version
解压 harbor
shell
sudo mkdir -p /opt/harbor
cd /opt
# 先复制过来
sudo cp /home/yantao/下载/harbor-offline-installer-v2.14.1-rc1.tgz /opt/
cd /opt
sudo tar xzvf harbor-offline-installer-v2.14.1-rc1.tgz
sudo rm harbor-offline-installer-v2.14.1-rc1.tgz
# 进入新的 harbor 目录
cd harbor
配置数据目录配置
shell
# 复制配置模板
sudo cp harbor.yml.tmpl harbor.yml
# 编辑配置
sudo vim harbor.yml
yml
hostname: localhost
http:
port: 80
harbor_admin_password: Harbor12345
# 修改数据目录到新位置
data_volume: /opt/harbor-data
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /opt/harbor-logs
然后下面是禁用https的部分
yml
#https:
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
#certificate: /your/certificate/path
#private_key: /your/private/key/path
# enable strong ssl ciphers (default: false)
# strong_ssl_ciphers: false
创建目录结构
shell
# 创建数据目录
sudo mkdir -p /opt/harbor-data
sudo chown -R 10000:10000 /opt/harbor-data
# 创建日志目录
sudo mkdir -p /opt/harbor-logs
sudo chown -R 10000:10000 /opt/harbor-logs
# 设置 harbor 目录权限
sudo chown -R $USER:$USER /opt/harbor
安装 Harbor
shell
# 在 /opt/harbor 目录中安装
cd /opt/harbor
sudo ./install.sh
shell
[Step 5]: starting Harbor ...
[+] Running 10/10
✔ Network harbor_harbor Created 0.0s
✔ Container harbor-log Started 0.6s
✔ Container harbor-db Started 0.9s
✔ Container redis Started 0.9s
✔ Container registryctl Started 0.8s
✔ Container harbor-portal Started 0.9s
✔ Container registry Started 0.8s
✔ Container harbor-core Started 1.0s
✔ Container nginx Started 1.2s
✔ Container harbor-jobservice Started 1.2s
✔ ----Harbor has been installed and started successfully.----
安装成功后的步骤
第1步:验证服务状态
bash
shell
# 检查所有服务是否正常运行
docker-compose ps
# 应该看到所有服务状态都是 "Up" 或 "healthy"
第2步:配置 Docker 客户端
bash
shell
# 编辑 Docker 配置
sudo vim /etc/docker/daemon.json
添加以下内容(因为使用的是 HTTP):
json
{
"insecure-registries": ["localhost"]
}
shell
# 测试登录 Harbor
docker login localhost
# 用户名: admin
# 密码: Harbor12345
安装后的操作
- 停止 Harbor :在
harbor目录下运行sudo docker-compose down。 - 重启 Harbor :在
harbor目录下运行sudo docker-compose up -d。 - 重新配置 :如果修改了
harbor.yml,需要运行sudo ./prepare更新配置,然后运行sudo docker-compose up -d重启服务。
比如修改80端口为8080
shell
sudo vim harbor.yml
shell
#你的修改
shell
# 重新生成配置
sudo ./prepare
# 重新启动服务
sudo docker-compose up -d
- 卸载 Harbor :在
harbor目录下运行sudo docker-compose down -v。注意:这会删除所有容器,但会保留存储在/data(或你配置的路径)的镜像数据。如果要彻底删除,需要手动删除该数据目录。
2.使用
登陆web
shell
localhost:80
新建项目
- 新建项目
- 项目名称 development
- 访问级别 公开
shell
# 也可以创建更多项目
production - 生产环境镜像
tools - 工具类镜像
base - 基础镜像
docker hub已经不行了,这是我曾经保存好的镜像
shell
yantao@ubuntu22:~/文档/镜像$ ls |grep nginx
nginx-latest.tar
加载本地镜像文件
shell
# 加载本地镜像文件
sudo docker load -i nginx-latest.tar
# 查看加载的镜像
docker images | grep nginx
WARNING: This output is designed for human readability. For machine-readable output, please use --format.
goharbor/nginx-photon:v2.14.1 51fa98e9c9f6 365MB 180MB U
nginx:latest 0d17b565c37b 213MB 56.7MB
推送镜像到 Harbor
shell
# 登录 Harbor(如果还没有登录)
docker login localhost
# 用户名: admin
# 密码: Harbor12345
# 标记镜像(推送到您创建的项目)
docker tag nginx:latest localhost/development/nginx:latest
# 推送镜像到 Harbor
docker push localhost/development/nginx:latest
拉取测试
shell
# 1. 删除本地镜像
docker rmi localhost/development/nginx:latest nginx:latest 2>/dev/null
# 2. 确认删除
echo "=== 删除后镜像列表 ==="
docker images | grep nginx || echo "没有 nginx 镜像"
# 3. 从 Harbor 拉取
echo "=== 开始从 Harbor 拉取镜像 ==="
docker pull localhost/development/nginx:latest
# 4. 验证拉取成功
echo "=== 拉取后镜像列表 ==="
docker images | grep nginx
# 5. 测试运行
echo "=== 测试运行镜像 ==="
docker run -d --name nginx-test -p 8080:80 localhost/development/nginx:latest
sleep 2
docker ps | grep nginx-test
# 6. 测试访问
echo "=== 测试访问 ==="
curl -s http://localhost:8080 | head -5
# 7. 清理
echo "=== 清理测试容器 ==="
docker stop nginx-test 2>/dev/null
docker rm nginx-test 2>/dev/null
重启脚本
restart-harbor.sh
shell
#!/bin/bash
# save as /usr/local/bin/restart-harbor.sh
cd /opt/harbor || exit 1
echo "Stopping Harbor..."
sudo docker-compose down
echo "Regenerating config..."
sudo ./prepare
echo "Starting Harbor..."
sudo docker-compose up -d
echo "Done."
----------------------------------
修改https
当然可以!以下是 Harbor 启用 HTTPS 并在 Kubernetes 节点安装证书 的完整、清晰、可复用的操作流程,适用于自建 Harbor + 私有 K8s 集群场景。
✅ Harbor 启用 HTTPS + Kubernetes 节点信任证书完整指南
环境假设:
- Harbor 服务器 IP:
192.168.31.130- Kubernetes 工作节点(worker)IP:
172.16.157.130(可能有多个)- 操作系统:CentOS / RHEL / AlmaLinux
- 容器运行时:containerd
第一步:在 Harbor 服务器生成带 SAN 的自签名证书
⚠️ 必须包含
Subject Alternative Name (SAN),否则 containerd 会拒绝连接!
bash
# 进入 Harbor 证书目录
cd /opt/harbor/certs
# 创建 OpenSSL 配置文件
cat > harbor.cnf <<EOF
[req]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
CN = 192.168.31.130
[req_ext]
subjectAltName = @alt_names
[v3_req]
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.31.130
EOF
# 生成私钥和证书
sudo openssl genrsa -out harbor.key 2048
sudo openssl req -x509 -new -nodes -key harbor.key \
-days 3650 -out harbor.crt \
-config harbor.cnf -extensions v3_req
# 验证 SAN 是否生效
openssl x509 -in harbor.crt -text -noout | grep -A1 "Subject Alternative Name"
# 应输出:IP Address:192.168.31.130
第二步:配置 Harbor 使用 HTTPS
编辑 /opt/harbor/harbor.yml:
yaml
hostname: 192.168.31.130
https:
port: 443
certificate: /your/path/to/certs/harbor.crt # 实际路径如 /opt/harbor/certs/harbor.crt
private_key: /your/path/to/certs/harbor.key
💡 如果之前是 HTTP,需取消注释
https块,并确保路径正确。
重新生成配置并重启:
bash
cd /opt/harbor
sudo ./prepare
sudo docker-compose down
sudo docker-compose up -d
验证 HTTPS 是否生效:
bash
curl -k https://192.168.31.130
# 应返回 Harbor 登录页 HTML 或 401(说明 HTTPS 正常)
第三步:将 Harbor 证书分发到所有 Kubernetes 工作节点
📌 只需在运行 Pod 的节点(worker nodes)上操作,主节点通常不需要
对每个工作节点(例如 172.16.157.130)执行:
1. 拷贝证书到节点
bash
# 在工作节点上执行(替换 yantao 为你的 Harbor 用户名)
scp yantao@192.168.31.130:/opt/harbor/certs/harbor.crt /tmp/harbor-ca.crt
2. 方法一(推荐):使用 containerd 的 certs.d 机制(最可靠)
bash
# 创建 registry 专属证书目录
sudo mkdir -p /etc/containerd/certs.d/192.168.31.130
# 放入证书
sudo cp /tmp/harbor-ca.crt /etc/containerd/certs.d/192.168.31.130/ca.crt
📁 路径格式:
/etc/containerd/certs.d/<registry-host>/ca.crt
3. 确保 containerd 启用了 config_path(关键!)
检查或编辑 /etc/containerd/config.toml:
toml
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
如果文件不存在,先生成默认配置:
bashsudo containerd config default | sudo tee /etc/containerd/config.toml
4. 重启 containerd
bash
sudo systemctl restart containerd
第四步:验证镜像拉取(在工作节点)
bash
crictl pull 192.168.31.130/development/nginx:latest
✅ 成功输出:Image is up to date for sha256:...
第五步:部署测试 Pod(在主节点)
yaml
# nginx-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-test
spec:
nodeName: 172.16.157.130 # 指定到已配置证书的 worker
containers:
- name: nginx
image: 192.168.31.130/development/nginx:latest
应用并观察:
bash
kubectl apply -f nginx-test.yaml
kubectl get pod nginx-test -o wide
✅ 状态应为 Running
🔒 补充建议
| 项目 | 建议 |
|---|---|
| 多个 worker 节点 | 编写脚本批量分发证书 |
| 使用域名 | 将 hostname 改为 harbor.local,并在 /etc/hosts 添加解析,证书 SAN 中加 DNS.1 = harbor.local |
| 安全性 | 生产环境建议使用正式 CA 签发证书(如 Let's Encrypt 内网 ACME) |
❌ 常见错误排查
| 错误信息 | 原因 | 解决 |
|---|---|---|
x509: certificate relies on legacy Common Name |
证书无 SAN | 重新生成带 SAN 的证书 |
certificate signed by unknown authority |
节点未信任证书 | 检查 certs.d 目录 + config_path + 重启 containerd |
connection refused |
Harbor 未启用 HTTPS 或防火墙阻断 | 检查 docker-compose ps 和 firewall-cmd --list-ports |
✅ 按照以上流程操作,即可实现 安全、稳定、可扩展 的 Harbor + Kubernetes 镜像拉取架构。
需要我提供 一键部署脚本模板 吗?
--------------------------
当然可以!以下是 Docker 客户端配置 HTTPS 访问自建 Harbor 私有仓库 的完整、清晰、可复用的操作步骤,适用于 Ubuntu/CentOS 等 Linux 系统。
✅ Docker 客户端配置 HTTPS 访问 Harbor(自签名证书)
前提 :Harbor 已启用 HTTPS(使用带 SAN 的自签名证书),地址为
https://192.168.31.130
🔧 步骤 1:从 Harbor 服务器获取证书
在 Docker 客户端机器 上执行:
bash
# 替换 yantao 为你的 Harbor 服务器用户名
scp yantao@192.168.31.130:/opt/harbor/certs/harbor.crt ./harbor-ca.crt
💡 确保证书包含 SAN(IP 地址):
bashopenssl x509 -in harbor-ca.crt -text -noout | grep "IP Address" # 应输出:IP Address:192.168.31.130
🔧 步骤 2:配置 Docker 专用证书目录(用于 /v2/ API)
bash
sudo mkdir -p /etc/docker/certs.d/192.168.31.130
sudo cp harbor-ca.crt /etc/docker/certs.d/192.168.31.130/ca.crt
📁 路径说明:
/etc/docker/certs.d/<registry-host>/ca.crt- 文件名必须是
ca.crt
🔧 步骤 3:将证书加入系统信任库(关键!用于 /service/token OAuth 接口)
bash
# 复制到系统 CA 目录
sudo cp harbor-ca.crt /usr/local/share/ca-certificates/harbor-192.168.31.130.crt
# 更新系统证书信任库
sudo update-ca-certificates
✅ 这一步确保 Docker 在请求 token 时也能验证证书。
🔧 步骤 4:重启 Docker 服务
bash
sudo systemctl restart docker
🔧 步骤 5:登录 Harbor(如果项目是私有的)
bash
docker login 192.168.31.130
# 输入用户名和密码(如 admin / your-password)
🟢 如果项目设为 Public,此步可跳过。
✅ 步骤 6:测试拉取镜像
bash
docker pull 192.168.31.130/development/nginx:latest
成功输出:
Status: Downloaded newer image for 192.168.31.130/development/nginx:latest
📝 补充说明
| 配置项 | 作用 |
|---|---|
/etc/docker/certs.d/... |
用于 Docker Registry v2 API(如 /v2/...) |
系统 CA 证书库 (update-ca-certificates) |
用于 OAuth token endpoint(/service/token)等通用 HTTPS 请求 |
docker login |
访问私有项目必需;公开项目无需登录 |
🚫 常见错误避免
- ❌ 只配
/etc/docker/certs.d/→ token 请求失败 - ❌ 证书无 SAN(仅 CN)→ TLS 验证失败
- ❌ 未重启 Docker → 配置不生效
- ❌ 使用 Snap Docker → 无法读取
/etc/docker/certs.d/(建议用官方 APT 安装)
🧩 一键配置脚本(可选)
bash
#!/bin/bash
HARBOR_IP="192.168.31.130"
HARBOR_USER="yantao"
# 1. 获取证书
scp ${HARBOR_USER}@${HARBOR_IP}:/opt/harbor/certs/harbor.crt ./harbor-ca.crt
# 2. Docker 证书
sudo mkdir -p /etc/docker/certs.d/${HARBOR_IP}
sudo cp harbor-ca.crt /etc/docker/certs.d/${HARBOR_IP}/ca.crt
# 3. 系统信任
sudo cp harbor-ca.crt /usr/local/share/ca-certificates/harbor-${HARBOR_IP}.crt
sudo update-ca-certificates
# 4. 重启 Docker
sudo systemctl restart docker
echo "✅ 配置完成!请运行 'docker login ${HARBOR_IP}'(如需)"
✅ 按照以上步骤操作,即可安全、稳定地通过 HTTPS 使用 Docker 拉取/推送 Harbor 镜像。