作者:马涛 Wise2C
小贴士:Harbor是由VMware团队为企业用户设计的Registry Server开源项目,用户可以利用Harbor搭建自己的私有镜像仓库。即使你是harbor小白,也可以从本文快速从认识Harbor到利用Harbor搭建自己的企业级registry server。
Harbor实质上是对docker registry做了封装,扩展了自己的业务模块.下面展示一下docker registry和Harbor的架构图用以说明。
Harbor认证过程
1、docker daemon从docker registry拉取镜像。
2、如果docker registry需要进行授权时,registry将会返回401 Unauthorized响应,同时在响应中包含了docker client如何进行认证的信息。
3、docker client根据registry返回的信息,向auth server发送请求获取认证token。
4、auth server则根据自己的业务实现去验证提交的用户信息是否存符合业务要求。
5、用户数据仓库返回用户的相关信息。
6、auth server将会根据查询的用户信息,生成token令牌,以及当前用户所具有的相关权限信息 。上述就是完整的授权过程.当用户完成上述过程以后便可以执行相关的pull push操作。认证信息会每次都带在请求头中。
Harbor整体架构
Harbor认证流程
A、首先,请求被代理容器监听拦截,并跳转到指定的认证服务器。
B、 如果认证服务器配置了权限认证,则会返回401。通知docker client在特定的请求中需要带上一个合法的token。而认证的逻辑地址则指向架构图中的core services。
C、 当docker client接受到错误code。client就会发送认证请求(带有用户名和密码)到core services进行basic auth认证。
D、 当C的请求发送给ngnix以后,ngnix会根据配置的认证地址将带有用户名和密码的请求发送到core serivces。
E、 core services获取用户名和密码以后对用户信息进行认证(自己的数据库或者介入LDAP都可以)。成功以后,返回认证成功的信息。
从上面的docker registry 和 Harbor的架构图、流程图可以看出Harbor的扩展部分为core services。这部分实现了用户的认证, 添加了UI模块已经webhook。
Harbor安装有三种方式,这里以online的方式为例,另外两种有兴趣的童鞋可以参考Harbor的官方文档。
Harbor的安装
1、下载安装包
2、配置harbor.cfg文件
3、执行install.sh脚本安装并启动Harbor
用户可以到release页下载相关文件,解压tar xvf harbor-online-installer-<version>.tgz。
Harbor配置
e.g:
email_server =smtp.mydomain.com
email_server_port = 25
email_username= ample_admin@mydomain.com
email_password = abc
email_from = admin sample_admin@mydomain.com
email_ssl = false
默认情况下,Harbor是把镜像存储在本地文件系统中的。但是在生成环境中你可能会考虑到使用其他的存储方案来代替本地存储。比如S3、Openstack Swift、Ceph等等。那么这个时候你就需要更改templates/registry/config.yml中的存储配置部分。例如:
storage:
swift:
username: admin
password: ADMIN_PASS
authurl: http://keystone_addr:35357/v3/auth
tenant: admin
domain: default
region: regionOne
container: docker_images
详细配置可以参考Registry Configuration Reference
完成安装并启动
sudo ./install.sh
登录并创建自己的首个仓库试试(初始用户名/密码 admin/Harbor12345)
$docker login reg.yourdomain.com
$dockerpushreg.yourdomain.com/myproject/myrepo:mytag
Harbor的生命周期管理 你可以使用docker-compose来管理Harbor的生命周期,下面列举一些有用的常用的命令。
Stop Harbor:
$ sudo docker-compose stop
Stopping harbor_proxy_1 ... done
Stopping harbor_ui_1 ... done
Stopping harbor_registry_1 ... done
Stopping harbor_mysql_1 ... done
Stopping harbor_log_1 ... done
Stopping harbor_jobservice_1 ... done
Restart Harbor after stopping:
$ sudo docker-compose start
Starting harbor_log_1
Starting harbor_mysql_1
Starting harbor_registry_1
Starting harbor_ui_1
Starting harbor_proxy_1
Starting harbor_jobservice_1
移除docker container 但是保留相关镜像文件
sudo docker-compose rm
Going to remove harbor_proxy_1, harbor_ui_1, harbor_registry_1, harbor_mysql_1, harbor_log_1, harbor_jobservice_1
Are you sure? [yN] y
Removing harbor_proxy_1 ... done
Removing harbor_ui_1 ... done
Removing harbor_registry_1 ... done
Removing harbor_mysql_1 ... done
Removing harbor_log_1 ... done
Removing harbor_jobservice_1 ... done
详细信息可以参考Docker Compose command-line reference
持久化data和日志文件 默认情况下data是被存储在Harbor host机的/data目录.不管harbor container是删除还是重新创建这里的数据都是一致存在的。另外harbor的日志文件默认情况下是存在/var/log/harbor/目录下的。
自定义ngnix监听端口 修改docker-compose.yml文件。
1、替换80端口为任意存在未被占用的端口 e.g 8899
proxy:
image: library/nginx:1.11.5
restart: always
volumes:
- ./config/nginx:/etc/nginx
ports:
- 8899:80
- 443:443
depends_on:
- mysql
- registry
- ui
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "proxy"
2、修改templates/registry/config.yml文件
auth:
token:
issuer: registry-token-issuer
realm: $ui_url:8899/service/token
rootcertbundle: /etc/registry/root.crt
service: token-service
3、运行install.sh来更新并启动Harbor
$ sudo docker-compose down
$ sudo install.sh
HTTPS 协议的修改和自定义监听端口修改一样的操作
Wise2C ∣一个有用的公众号