Harbor 是一个开源的容器镜像仓库,主要用于安全地存储、管理和分发 Docker 镜像。它支持高效的镜像托管和分发,特别适用于跨云原生计算平台(如 Kubernetes 和 Docker)的环境。Harbor 提供了高安全性和高性能的解决方案,包括权限管理、日志审核、镜像复制等功能,能够满足企业级的应用需求。
Harbor 官网:https://goharbor.io/
1.安装前提
- docker-ce 20.10.10+
- docker-compose(v1.18.0+)或 docker compose v2
2.下载安装程序
前往 Harbor releases 页面,下载在线(online)或离线(offline)安装程序。下载完成后,使用 tar
命令提取安装程序包。
$ tar xzvf harbor-online-installer-v2.6.2.tgz
3.配置 HTTPS
3.1 生成证书颁发机构证书
- 生成CA证书私钥
$ openssl genrsa -out ca.key 4096
- 生成 CA 证书
$ openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=hub.gtdq.com Root CA" \
-key ca.key \
-out ca.crt
以上命令中
-subj
参数里的/C
表示国家,如:CN;/ST
表示省;/L
表示城市或者地区;/O
表示组织名;/CN
表示通用名称。
{: .prompt-info }
3.2 生成服务器证书
- 生成私钥
$ openssl genrsa -out hub.gtdq.com.key 4096
- 生成证书签名请求
$ openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=hub.gtdq.com" \
-key hub.gtdq.com.key \
-out hub.gtdq.com.csr
- 生成 x509 v3 扩展文件
$ cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=hub.gtdq.com
EOF
- 使用 v3.ext 文件为 Harbor 主机生成证书
$ openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in hub.gtdq.com.csr \
-out hub.gtdq.com.crt
完成后将得到如下文件:
/data/harbor/ssl/
├── ca.crt
├── ca.key
├── ca.srl
├── hub.gtdq.com.crt
├── hub.gtdq.com.csr
├── hub.gtdq.com.key
└── v3.ext
完成后将 hub.gtdq.com.crt 和 hub.gtdq.com.key 文件复制到 /home/harbor/ssl 目录下。
4.安装 Harbor
进入 Harbor 安装程序目录,复制 harbor.yml.tmpl
为 harbor.yml
文件,修改以下内容:
hostname: hub.gtdq.com
certificate: /data/harbor/ssl/hub.gtdq.com.crt
private_key: /data/harbor/ssl/hub.gtdq.com.key
harbor_admin_password: Harbor123456
修改完成后使用 install.sh
脚本安装并启动 Harbor。
$ ./prepare
$ ./install.sh
Harbor 安装完成之后可以通过 docker-compose 来管理,执行docker-compose ps
则可以查看到对应的容器状态。
如果没有 dns 需要手动配置 hosts。
$ echo '192.168.33.181 hub.gtdq.com' >> /etc/hosts
5.向 Docker 提供证书
由于自行签发的 CA 根证书不被系统信任,会出现如下错误:
$ docker login hub.gtdq.com
Username: admin
Password:
Error response from daemon: Get "https://hub.gtdq.com/v2/": context deadline exceeded
转换 hub.gtdq.com.crt 为 hub.gtdq.com.cert,供 Docker 使用
$ openssl x509 -inform PEM -in hub.gtdq.com.crt -out hub.gtdq.com.cert
再将服务器证书、密钥和 CA 文件复制到 Harbor 主机上的 Docker 证书文件夹中。
$ mkdir -p /etc/docker/certs.d/hub.gtdq.com
$ cp hub.gtdq.com.cert /etc/docker/certs.d/hub.gtdq.com
$ cp hub.gtdq.com.key /etc/docker/certs.d/hub.gtdq.com
$ cp ca.crt /etc/docker/certs.d/hub.gtdq.com
最后停止 Harbor 再重新启动 Docker。
$ docker-compose down
$ systemctl restart docker
$ docker-compose up -d
再次验证:
$ docker login hub.gtdq.com
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
6.通过 HTTP 连接到 Harbor
如果安装 Harbor 时使用 HTTP 而不是 HTTPS,则必须将 --insecure-registry
选项添加到 Docker 的 /etc/docker/daemon.json 文件中。
{
"insecure-registries" : ["harbor.gt.com:5000", "0.0.0.0"]
}
更新 daemon.json 后,重新启动 Docker。
$ systemctl daemon-reload
$ systemctl restart docker