Harbor 网络代理
有效配置
进入 harbor 安装目录:
cd /mnt/data/services/harbor
打开 docker-compose.yml 文件,能看到 registryctl 和 core 的设置:
registryctl:
image: goharbor/harbor-registryctl:v2.14.0
container_name: registryctl
env_file:
- ./common/config/registryctl/env
restart: always
core:
image: goharbor/harbor-core:v2.14.0
container_name: harbor-core
env_file:
- ./common/config/core/env
restart: always
他们的环境变量分别通过对应的 env 文件进行设置。
因此,修改这两个 env 文件:
sudo vi ./common/config/registryctl/env
sudo vi ./common/config/core/env
都加入如下的代理设置:
HTTP_PROXY=http://192.168.3.1:7893
HTTPS_PROXY=http://192.168.3.1:7893
http_proxy=http://192.168.3.1:7893
https_proxy=http://192.168.3.1:7893
NO_PROXY=127.0.0.1,localhost,192.168.0.0/16,10.0.0.0/16,core,registry,registryctl,harbor-core,harbor-registry,harbor-registryctl
no_proxy=127.0.0.1,localhost,192.168.0.0/16,10.0.0.0/16,core,registry,registryctl,harbor-core,harbor-registry,harbor-registryctl
注意:大写和小写各写一遍,以防 Go 语言底层网络库不兼容。
特别注意:7891是 socks5 端口,7890 是 http 端口,7893 是混合端口(http + socks5)
重启 harbor:
sudo docker compose down
sudo docker compose up -d
之后拉取镜像时代理就能生效。
特别注意:
如果未来某天重新运行了 ./prepare 脚本,./common/config/ 下的 env 文件可能会被还原。届时只需要重新把那几行 HTTP_PROXY 补回 ./common/config/registryctl/env 中并 docker compose restart 即可。
无效配置
试过其他方法,都无效,可能适用的场景不一样,先记录下来,以后有需要时可以再试试。
harbor.yml
安装目录下的 harbor.yml
# Global proxy
# Config http proxy for components, e.g. http://my.proxy.com:3128
# Components doesn't need to connect to each others via http proxy.
# Remove component from `components` array if want disable proxy
# for it. If you want use proxy for replication, MUST enable proxy
# for core and jobservice, and set `http_proxy` and `https_proxy`.
# Add domain to the `no_proxy` field, when you want disable proxy
# for some special registry.
proxy:
http_proxy:
https_proxy:
no_proxy:
components:
- core
- jobservice
- trivy
harbor.yml 的 proxy 覆盖范围:官方默认只把代理暴露交给了 core(核心服务)、jobservice(后台异步任务/复制任务)和 trivy(漏洞扫描工具)。
代理缓存(Proxy Cache)的实际执行者:当向 Harbor 的 Proxy Cache 项目发起 docker pull 时,真正去外网 upstream(如 ghcr.io)抓取镜像 Layer 文件的底层组件是 registry / registryctl 容器。在默认的 harbor.yml 中,registry / registryctl 压根没有被列入 components 列表中,所以不管在 harbor.yml 里填什么,处理缓存拉取的 registry 容器都完全感知不到代理!
另外这里也无法改动,想在 components 中增加 registry / registryctl 也是不可以的。
Harbor 官方对 harbor.yml 的格式有极严格的校验(Schema Validation)。在运行 ./prepare 脚本时,程序会硬编码检查 components 列表中的元素。
components 字段仅支持以下官方允许的组件:
- core
- jobservice
- trivy
docker 的代理
理论上,由于 Harbor 所有的容器都运行在机器的 Docker 引擎上,直接给宿主机的 Docker daemon 配置全局代理,也能确保所有 outbound(出站)网络访问都经过代理。
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf
写入以下内容:
[Service]
Environment="HTTP_PROXY=http://192.168.3.1:7893"
Environment="HTTPS_PROXY=http://192.168.3.1:7893"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/16,harbor-core,harbor-registry,core,registry"
重新加载 docker 并重启 harbor 服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
# 进入 harbor 目录重启 Harbor 容器集群
sudo docker compose down && sudo docker compose up -d
但实际测试后发现,修改 Docker 的 systemd 代理配置后 Harbor 依然不走代理,这是因为 Harbor 的网络容器使用了独立的 Docker Bridge/Overlay 网络,容器内部的应用程序(如 registry 和 core)并不会继承宿主机 docker.service 的环境变量。