Harbor的安装记录
系统规划
镜像仓库作为Kubernets集群的重要基础设施,必须考虑在内网的互联网隔离问题。
Docker虽然自带了Registry,但是不能提供细粒度的权限设置,此外,在大型集群中为了解决镜像拉取的性能瓶颈,经常需要解决多级镜像的同步问题,因此Harbor已经成为事实标准,为此本文研究了如何在内网离线安装Harbor。
基线版本的信息如下:
- Centos=7.8
- Docker-CE=19.03.12
- Docker-compose=1.21.2
- Harbor=v1.10.3
Harbor目前采用http方式,Admin URL:http://192.168.0.130:7350
Harbor用户数据的存放目录:/data/harbor
。为避免重装系统造成数据丢失,采用一个独立硬盘mount到/data。
Harbor Server的安装步骤
安装docker-ce、docker-compose
通过阿里云的镜像加速服务,yum安装docker-ce,详细操作方式参见Kubernetes集群的安装记录
docker-compose的标准安装方法是从docker.com下载,速度太慢无法忍受。
还好,阿里云提供了Docker-toolbox的下载地址。
注意:要手工改文件名,设置执行权限,并搬到PATH路径下。下载harbor安装包
这里是Harbor v1.10.3 下载地址,解压后放在目录
/root/harbor/
下。
离线方式的安装包有600M+,其中包含了全部所需的镜像文件,后续安装中通过docker load
方式直接读取压缩包,就不需要联网了。v1.10.2有个bug无法正常安装,表现是log容器启动时,爆出sudo权限过期,可能是基础镜像的问题)
配置并安装harbor
在启动目录
/root/harbor/
下,编辑Harbor配置文件harbor.yml
,关键信息如下:1
2
3
4
5hostname:192.168.0.130
http:
port:7350
# https:
data_volume: /data/harbor/运行命令
install.sh
,自动拉取压缩包的镜像文件,并生成docker-compose.yml
,这就是以后的部署配置。
最后,Harbor主目录的结构是这样的:1
2
3
4
5
6
7
8
9
10
11[root@dnsmasq harbor]# tree /root/harbor -L 2
/root/harbor ## Harbor Sever的主目录
├── common
│ └── config
├── common.sh
├── docker-compose.yml ## 最后生成的Depolyment配置文件
├── harbor.v1.10.3.tar.gz ## 离线安装的镜像文件包,docker save && docker load
├── harbor.yml ## 初始化安装的配置文件
├── install.sh ## 安装入口程序
├── LICENSE
└── prepare启动harbor并检查
通过
docker-compose up -d --build
启动Harbor,然后就可以通过浏览器访问http://192.168.0.130:7350
在浏览器界面,输入用户名和密码,就可以看见镜像仓库的具体信息了。
Client的使用方法
需要注意的是,Client的docker是独立的配置,如果不需要上传镜像,根本不用登录Harbor Server,直接设置mirror镜像就可以了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"insecure-registries": [
"192.168.0.130:7350"
],
"registry-mirrors": [
"http://192.168.0.130:7350"
]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker info
当然,注意由于私有仓库是http模式,需要显示设置insecure-registries的不安全访问方式。
修改配置文件后,还需要重启守护进程和docker.service,然后你就可以正常使用私有仓库Harbor了!!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost docker]# docker login http://192.168.0.130:7350 -u admin -p xxxxxx
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
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
[root@localhost docker]# docker tag python:3.7-slim 192.168.0.130:7350/library/python:3.7-slim
[root@localhost docker]# docker push 192.168.0.130:7350/library/python:3.7-slim
The push refers to repository [192.168.0.130:7350/library/python]
0c6163f2d025: Pushed
361df01300cf: Pushed
8f9ba0be9040: Pushed
0bd71a837902: Layer already exists
13cb14c2acd3: Layer already exists
3.7-slim: digest: sha256:e0f6a4df17d5707637fa3557ab266f44dddc46ebfc82b0f1dbe725103961da4e size: 1370
现在admin界面,就可以找到这个镜像了,以后就可以直接本地拉取了。

HTPPS访问的设置方法
可以采用基于IP地址的访问方式,但是更推荐采用域名方式,具体步骤参见harbor安装并配置https
主要包括以下环节:
- 生成证书颁发机构证书:ca.key,ca.csr
- 生成服务器证书: harbor.caogo.local.key, harbor.caogo.local.crt, v3.ext
- 提供证书给Harbor和Docker: 注意Docker默认使用.cert文件,而非.crt
- 部署或重新配置harbor: 编辑harbor.yml,运行install.sh进行设置,通过docker-compose启动
也可以参见Harbor配置HTTPS的官方文档
配置HTTPS方式后,客户端Docker访问Harbor就可以不需要设置unsecure-registries
参数了。
个人强烈推荐Http方式,而不是Https方式!!!
因为自签名证书需要客户端Docker配合导入证书,而真实域名证书受到ECS出口带宽限制,速度很感人!
自制的image push小工具(还要优化……)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cat > harbor-push.sh << EOF
#!/bin/bash
count=1
while read repo tag others # 从docker images的输出中获得镜像信息,注意剔除第一行
do
src_image=$repo":"$tag
dst_image=192.168.0.130:7350/library/$src_image
echo "$count: $src_image is pushing..." >& 2
echo docker tag $src_image $dst_image
echo docker push $dst_image
echo docker rmi $dst_image
count=$(($count + 1))
done
EOF
chmod a+x harbor-push.sh
docker images |tail -n +2 |./harbor-push.sh
手工启动和停止Harbor的操作方法
由于Harbor是采用docker-compose方式启动的,因此关机之前最好手工停止服务,输入:
cd /root/harbor && docker-compose down
开机后,启动Harbor服务的方式也类似,执行命令:
cd /root/harbor && docker-compose up -d --build
通过Systemd设置Harbor开机自启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cat > /etc/systemd/system/harbor.service << EOF
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor
[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/docker-compose -f /root/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /root/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
EOF
重载Systemd并设置Harbor自启动
systemctl daemon-reload
systemctl enable harbor
systemctl status harbor