Harbor 网络代理

为 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 的环境变量。