Harbor部署(https)
Harbor使VMware公司开源的企业级Docker Registry项目,目标是帮助用户快速搭建一个企业级的Docker Registry服务。
Harbor是以Docker公司开源的Registry为基础,提供了管理UI、基于角色的访问控制、AD/LDAP集成、日志审核等企业用户需求的功能,同时支持中文。
Harbor的每个组件都是以docker容器的形式构建的,使用Docker compose可以对它进行部署。
逻辑架构如下:

Harbor将一组Docker原生Registry做成集群,在最前端采用nginx等负载均衡器进行分发,同时每个Registry都将目录mount到宿主硬盘上,宿主机磁盘可以选择用Ceph或者Glusterfs,甚至更简单的nfs分布式存储的方式来保证数据高可用。
Harbor安装
注意:在安装之前先安装好docker以及docker-compose(此处省略安装)
一、首先将安装包上传到服务器中,本例子中使用的为最新的离线安装包2.0.0,如图:

二、上传之后执行命令tar -xf +包名来解压文件,解压后内容如图:

上图中的镜像文件即为harbor使用的各个组件,可直接通过docker load -i harbor.v2.0.0.tar.gz来导入,无需再次从网络仓库拉取镜像。

导入后的镜像内容如下:

三、配置https, harbor默认工作方式是http,但是这只能在页面访问,默认harbor推送拉取镜像时走的是https,所以需要配置下https。
1、需要的文件如下:
- harbor.centos.com.crt:服务器端的证书文件
- harbor.centos.com.key:服务器端的秘钥
- ca.crt:客户端的证书文件
2、生成秘钥和自签名证书:
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
输入后需要填写一些基本信息,如图:

3、 生成证书签名请求(域名访问,就把common name的值写为域名):
openssl req -newkey rsa:4096 -nodes -sha256 -keyout harbor.centos.com.key -out harbor.centos.com.csr

4、 生成服务器证书:
openssl x509 -req -days 365 -in harbor.centos.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out harbor.centos.com.crt
5、最终得到的是这样的目录:

6、安装证书
创建文件夹:mkdir -p /etc/cert/harbor
将crt和key文件拷贝到harbor文件夹下,执行命令如下:
cp harbor.centos.com.crt harbor.centos.com.key /etc/cert/harbor
7、修改配置文件
将harbor.yml.tmpl复制一份,并重新命名为harbor.yml,编辑此文件,执行命令vim harbor.yml,如图:

8、安装并启动harbor
直接执行目录下的install.sh文件即可,如图:

执行后可以看到安装成功,如图:

9、此时通过https://harbor.centos.com访问即可看到登录界面(如果不能访问需要添加hosts文件进行域名解析),如图:

10、输入账号密码后(admin/admin12345),可以看到已经登录成功了,如图:

注意:
1、自己设置的域名和证书的名字要匹配,例如证书名字为harbor.centos.com.crt,那么设置域名也要设置为harbor.centos.com,证书名和域名都可以自定义,只要匹配即可
2、harbor.yml文件中的hostname要指定为域名
3、 生成秘钥和自签名证书的时候,common name位置可以设置为本机名
4、生成证书签名请求的时候,common name 要设置成域名
注意:因为harbor中涉及多个容器,因此启动的时候需要通过docker-compose统一启动,不要单独启动,否则可能会因为启动顺序问题导致容器出错,停止方法:docker-compose stop 启动方法:docker-compose up -d
推送镜像:
推送镜像之前首先需要先登录harbor服务器,执行命令docker login https://harbor.centos.com,如图:

注意:也要配置/etc/docker/daemon.json,如下:
{"insecure-registries": ["https://harbor.centos.com"]}
扩展:
现有如下需求(jenkins-k8s的ci/cd会用到):通过docker运行了一个容器,容器的基础镜像为alpine,里面同样安装了docker的二进制文件和kubectl二进制(离线方式将docker安装包复制进去,并放在环境变量下,并不启动),然后通过alpine里面的这个docker实现构建镜像,登录harbor仓库,并推送镜像,最后通过kubectl命令发布应用
前提要求:
- 宿主机的docker版本需要与alpine中安装的docker版本保持一致
- 宿主机的docker要能登录到harbor仓库
1、首先运行一个alpine容器,命令如下:
docker run -itd --name alpine alpine
2、将docker安装包拷贝到容器中,如下:
docker cp docker-20.10.8.tgz alpine:/tmp
3、进入容器中,解压,复制二进制文件到/usr/local/bin下,如下:
tar xf docker-20.10.8.tgz
cd docker && mv ./* /usr/local/bin
source /etc/profile
4、执行一下dockerd命令,将会在/var/run目录下生成如下文件,如图:


注:生成docker.sock的目的是为了后面的挂载使用
5、然后通过docker commit打包为新容器,不过docker commit会造成镜像臃肿,因此建议通过Dockerfile形式来构建容器,如下:
FROM alpine:latest
ADD docker-20.10.8.tgz /tmp
COPY kubectl /usr/local/bin
RUN cd /tmp \
&& rm -rf docker-20.10.8.tgz \
&& mv docker/* /usr/local/bin/ \
&& chmod +x /usr/local/bin/kubectl \
&& rm -rf /tmp/docker \
&& /usr/local/bin/dockerd;exit 0
docker build -t docker_20.10.8_kubectl_1.23.5 . //构建
6、运行容器,将本地dockre.sock挂载到容器中,覆盖之前的,执行命令如下:
#注意:启动alpine容器一定要指定--it参数,否器起不来
docker run -itd --name docker-kubectl -v /var/run/docker.sock:/var/run/docker.sock docker_20.10.8_kubectl_1.23.5
7、进入容器中,测试登录harbor已经成功,如图:

注:容器里面不用配置daemon.json,外层宿主机配置了就可以啦,里面实际通过docker.sock调用的外面


