本节我们主要分析一下Harbor中docker-compose.yml文件,以了解Harbor整个系统的一个整体架构及工作状况。
1. docker-compose.yml文件
这里我们再给出Harbor的整个架构图:
上面各组件之间构建了一个内部网络harbor
, 相互之间通过harbor网络进行通信。各组件之间的依赖关系如下:
上面如果admin server要将相应的配置存放到数据库,其也需要依赖于mysql。
另外还有两个地方需要注意:
1) admin server、ui、job service之间交互会共用一个公共的secretkey, 其存放在/data/secretkey文件中
2) ui与registry之间,采用数字签名的方式来进行认证。ui采用private_key.pem对token进行数字签名,在registry后续接收到token后采用root.crt来进行校验。
2. 手动启动Harbor个组件
这里先首先停止Harbor所有组件,删除所有已有数据:
# cd /opt/harbor-inst/harbor/ && ls
bakup-harbor.cfg docker-compose.clair.yml docker-compose.yml harbor.cfg install.sh NOTICE
common docker-compose.notary.yml ha harbor.v1.4.0.tar.gz LICENSE prepare
# docker-compose down -v
# ls /data/*
# rm -rf /data/database
# rm -rf /data/registry
# rm -rf /data/*
# rm -rf /var/log/harbor*
# rm -rf common/config/
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
下面我们重新产生配置文件:
# ./prepare
Generated and saved secret to file: /data/secretkey
Generated configuration file: ./common/config/nginx/nginx.conf
Generated configuration file: ./common/config/adminserver/env
Generated configuration file: ./common/config/ui/env
Generated configuration file: ./common/config/registry/config.yml
Generated configuration file: ./common/config/db/env
Generated configuration file: ./common/config/jobservice/env
Generated configuration file: ./common/config/log/logrotate.conf
Generated configuration file: ./common/config/jobservice/app.conf
Generated configuration file: ./common/config/ui/app.conf
Generated certificate, key file: ./common/config/ui/private_key.pem, cert file: ./common/config/registry/root.crt
The configuration files are ready, please use docker-compose to start the service.
# ls common/config/
adminserver db jobservice log nginx registry ui
# ls /data/
secretkey
如下是启动Harbor时所需要的一些镜像:
如下在Harbor主目录下执行。
2.1 启动log组件
如上,我们运行起harbor-log组件了。其内部IP地址为172.17.0.2
。后续我们可以通过如下命令来停止并删除harbor-log容器:
# docker rm -vf harbor-log
2.2 启动mysql
如上所示,mysql已经正常启动起来了。
2.3 启动admin server
注意上面需要添加--add-host
选项来设置mysql的地址。
2.4 启动job service
2.5 启动registry、ui
这里registry与ui之间相互依赖: 启动registry时需要UI的地址,而启动UI时又需要registry的地址。因此这里我们采用一种取巧的办法: 一般用docker连续创建两个容器时,容器对应的ip地址一般也是连续且相邻的。接着上面harbor-jobservice
,我们下面先创建registry容器,然后再创建ui容器,这两个容器对应的IP根据经验应该分别为:
-
registry IP: 172.17.0.6
-
ui IP: 172.17.0.7
下面我们就采用--add-host
参数预先添加相应的主机名到创建容器命令中(注意这两者之间启动间隔必须控制在几秒中之内,否则可能导致失败):
2.6 启动nginx代理
到此为止,我们把整个harbor系统给部署完成了。我们先用docker 命令推送一个镜像到Harbor:
通过网页,我们可以看到镜像已经成功推送到了Harbor上。至此为止,我们基本完成了harbor系统的手动部署。
[参考]
-
harbor官网
-
vmware harbor
-
habor documents