基于角色的访问控制
Harbor是VMware公司的开源级的企业级DockerRegistry(仓库)项目,项目地址为 https://github.com/vmware/harbor.
Harbor的目标是帮助用户迅速搭建一个企业级的DockerRegistry服务。
Harbor以docker公司开源的registry为基础,提供了管理UI,基于角色的访问控制(Role Based Access Control),AD/LDAP集成,以及审计日志(Auditlogging)等企业用户需求的功能,同时还原生支持中文。
Harbor的每个组件都是以Docker容器的形式构建的,使用docker-compose来对它进行部署。用于部署Harbor的docker-compose模板位于/usr/local/bin/harbor/docker-compose.yml(自定义)
Docker harbor有可视化的web管理界面,可以方便管理Docker镜像,又提供了多个项目的镜像权限管理及控制功能
基于角色控制:用户与Docker镜像仓库通过"项目"进行组织管理,一个用户可以对多个镜像仓库在统一命名空间(projec)里有不同的权限
图形化用户界面:用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间
审计管理:所有这怒地镜像仓库的错都可以被记录追溯,用于审计管理
基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制。
支持LDAP认证:Harbor的用户授权可以使用已经存在的用户。
镜像删除和垃圾回收:image可以被删除并且回收image占用的空间。
简单的部署功能:harbor提供了online、offline安装,此外还提供了virtualappliance安装
harbor和docker registry的关系:harbor实质上是对docker registry做了封装,扩展了自己的业务模板。
UI:图形界面
Webhook:及时获取registry上image状态变化情况,在registry上配置 webhook,把状态变化传递给UI模块。
Token服务:复杂根据用户权限给每个docker push/p/ull命令签发token。Docker客户端向registry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向registry进行请求。
两台虚拟机:
harbor (harbor服务端,用于搭建私有仓库)
192.168.158.10 docker-ce、docker-compose(必须安装)、Harbor
client(客户端,用于远程访问私有仓库) 192.168.158.20 docker-ce
1.确保docker-compose已能使用
[root@server1 harbor]# mv docker-compose /usr/local/bin/
[root@server1 harbor]# chmod +x /usr/local/bin/docker-compose
[root@server1 harbor]# docker-compose -v
docker-compose version 1.21.1, build 5a3f1a3
2.将harbor-offline-installer-v1.2.2.tgz软件包上传到/root目录下,解压到/usr/local/目录下
tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
3. 配置 Harbor 参数文件
vim /usr/local/harbor/harbor.cfg
//5 hostname = 192.168.158.10
4.启动 Harbor
[root@server1 harbor]# cd /usr/local/harbor/
[root@server1 harbor]# ls
common docker-compose.yml harbor.v1.2.2.tar.gz NOTICE
docker-compose.clair.yml harbor_1_1_0_template install.sh prepare
docker-compose.notary.yml harbor.cfg LICENSE upgrade
[root@server1 harbor]# sh install.sh
5. 查看 Harbor 启动镜像
//查看镜像 docker images
//查看容器 docker ps -a
//查看compose编排的容器 docker-compose ps
6.打开浏览器访问 http://192.168.158.10的管理页面
默认的管理员用户名和密码是 admin/Harbor12345
配置文件59行默认的#harbor_admin_password = Harbor12345
此时可使用 Docker 命令在本地通过 127.0.0.1 来登录和推送镜像。默认情况下,
Register 服务器在端口 80 上侦听。
#登录harbor的字符界面
docker login -u admin -p Harbor12345 http://127.0.0.1
#先从官方公有仓库下载一个镜像
docker pull nginx
#添加标签,这个标签不能改,127.0.0.1代表本地地址,myimage指定项目,nginx:v1指定具体镜像名称和版本
docker tag nginx 127.0.0.1/myimage/nginx:v1
#上传镜像到私有仓库
docker push 127.0.0.1/myimage/nginx
#注意:在harbor服务器上登录、定制tag、上传镜像都需要使用127.0.0.1,若想要通过ip192.168.158.10,需要在配置文件中添加字段
[root@server1 harbor]# vi /usr/lib/systemd/system/docker.service
#合适位置添加,末尾
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.158.10
[root@server1 harbor]# vi /usr/lib/systemd/system/docker.service
[root@server1 harbor]# systemctl restart docker
Warning: docker.service changed on disk. Run 'systemctl daemon-reload' to reload units.
^C
[root@server1 harbor]# systemctl daemon-reload
[root@server1 harbor]# systemctl restart docker
[root@server1 harbor]# docker login -u admin -p Harbor12345 http://192.168.158.10
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@server1 harbor]# docker rmi 127.0.0.1/myimage/nginx:v1
Untagged: 127.0.0.1/myimage/nginx:v1
Untagged: 127.0.0.1/myimage/nginx@sha256:99d0a53e3718cef59443558607d1e100b325d6a2b678cd2a48b05e5e22ffeb49
[root@server1 harbor]# docker pull 192.168.158.10/myimage/nginx:v1
v1: Pulling from myimage/nginx
852e50cd189d: Pull complete
571d7e852307: Pull complete
addb10abd9cb: Pull complete
d20aa7ccdb77: Pull complete
8b03f1e11359: Pull complete
Digest: sha256:99d0a53e3718cef59443558607d1e100b325d6a2b678cd2a48b05e5e22ffeb49
Status: Downloaded newer image for 192.168.158.10/myimage/nginx:v1
192.168.158.10/myimage/nginx:v1
[root@server1 harbor]# docker push 192.168.158.10/myimage/nginx:v2
The push refers to repository [192.168.158.10/myimage/nginx]
7e914612e366: Layer already exists
f790aed835ee: Layer already exists
850c2400ea4d: Layer already exists
7ccabd267c9f: Layer already exists
f5600c6330da: Layer already exists
v2: digest: sha256:99d0a53e3718cef59443558607d1e100b325d6a2b678cd2a48b05e5e22ffeb49 size: 1362
详细步骤如下:
1、关闭所有容器
[root@server1 harbor]# pwd
/usr/local/harbor
[root@server1 harbor]# docker-compose down -v
[root@server1 harbor]# pwd
/usr/local/harbor
[root@server1 harbor]# ls
common docker-compose.yml harbor.v1.2.2.tar.gz NOTICE
docker-compose.clair.yml harbor_1_1_0_template install.sh prepare
docker-compose.notary.yml harbor.cfg LICENSE upgrade
[root@server1 harbor]# vi harbor.cfg
[root@server1 harbor]# ./prepare
[root@server1 harbor]# systemctl restart docker
[root@server1 harbor]# docker-compose up -d
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating harbor-adminserver ... done
Creating harbor-db ... done
Creating registry ... done
Creating harbor-ui ... done
Creating nginx ... done
Creating harbor-jobservice ... done
创建新用户 test-lisi,记住创建的密码,稍后使用 。
#首先退出已登陆的账号
[root@server1 harbor]# docker logout http://192.168.158.10
Removing login credentials for 192.168.158.10
#使用新的账户登录
[root@server1 ~]# docker login http://192.168.158.10
#改tag
[root@server1 harbor]# docker tag nginx:latest 192.168.158.10/myimage/nginx:v3
#tom上传镜像到私有仓库
[root@server1 harbor]# docker push 192.168.158.10/myimage/nginx:v3
The push refers to repository [192.168.158.10/myimage/nginx]
7e914612e366: Layer already exists
f790aed835ee: Layer already exists
850c2400ea4d: Layer already exists
7ccabd267c9f: Layer already exists
f5600c6330da: Layer already exists
v3: digest: sha256:99d0a53e3718cef59443558607d1e100b325d6a2b678cd2a48b05e5e22ffeb49 size: 1362