09 Dockerfile 私有仓库 harbor


Harbor 简介

真正生产环境,我们无法有效的管理Docker Regisry。官方提供了收费版的Registry,社区有开源版本的Harbor。

Harbor简介:
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。
作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。
Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。
另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

Harbor 特性

  1. 基于角色的访问控制 :用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
  2. 镜像复制 : 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
  3. 图形化用户界面 : 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
  4. AD/LDAP 支持 : Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
  5. 审计管理 : 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
  6. 国际化 : 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
  7. RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
  8. 部署简单 : 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。

Harbor 组件

  1. Proxy:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。

  2. Registry: 负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token, Registry会通过公钥对token 进行解密验证。

  3. Core services: 这是Harbor的核心功能,主要提供以下服务:

    • UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。

    • webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。

    • token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。

  4. Database:为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。

  5. Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。

  6. Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。

Harbor安装

1
https://github.com/goharbor/harbor/releases

离线安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 解压安装包,修改配置文件
[root@linux-node2 tools]# tar -xf harbor-offline-installer-v1.8.4-rc1.tgz
[root@linux-node2 tools]# cd harbor

# 修改主机名和管理员密码、数据库密码
vim harbor.yml
hostname: 10.0.0.102
harbor_admin_password: 123456
database:
password: 123456

#安装
./install.sh


[root@linux-node2 harbor]# vim harbor.yml
[root@linux-node2 harbor]# ./install.sh
  1. 从 1.8.0 后,harbor配置文件由原先的 harbor.cfg 改为 harbor.yml

hostname: 目标主机的主机名,用于访问Portal和注册表服务。它应该是目标计算机的IP地址或完全限定的域名(FQDN),
例如,10.0.0.102或reg.yourdomain.com。不要使用localhost或127.0.0.1作为主机名 - 外部客户端需要访问注册表服务
这里修改为我们的主机ip即可。

data_volume: 存储 harbor 数据的位置。这里可以修改为 /usr/local/workspace/harbor/data

harbor_admin_password:管理员的初始密码。此密码仅在Harbor首次启动时生效。之后,将忽略此设置,并且应在Portal中设置管理员密码。请注意,默认用户名/密码为admin / Harbor12345。

1
2
3
4
5
6
7
8
9
10
11
12
13
关于端口配置:

http:

port:你的http的端口号

https:用于访问Portal和令牌/通知服务的协议。如果启用了公证,则必须设置为https。请参阅使用HTTPS访问配置Harbor。

port:https的端口号

certificate:SSL证书的路径,仅在协议设置为https时应用。

private_key:SSL密钥的路径,仅在协议设置为https时应用。

免https使用

1
2
3
4
5
6
7
8
# 配置免https
# 修改 /etc/docker/daemon.json
[root@linux-node2 harbor]# vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://a64eacm1.mirror.aliyuncs.com"],
"insecure-registries": ["10.0.0.102"]
}
1
2
3
4
5
6
7
8
9
10
11
# 重启docker 
systemctl daemon-reload
systemctl restart docker.service

# 重启harbor仓库
# cd 到 harbor的安装目录
cd /data/tools/harbor

# 执行命令
docker-compose stop
docker-compose up -d

登录web

1
2
http://10.0.0.102  
admin/123456

上传镜像

1
2
3
4
5
6
7
8
9
10
# node1 默认docker访问register都是基于https的,需要添加信任
[root@linux-node1 ~]# vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://a64eacm1.mirror.aliyuncs.com"],
"data-root": "/data/docker",
"insecure-registries": ["10.0.0.102"]
}
[root@linux-node1 ~]# systemctl daemon-reload
[root@linux-node1 ~]# systemctl restart docker.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 在镜像服务器node1,登录harbor仓库
[root@linux-node1 ~]# docker login 10.0.0.102
Username: admin
Password:
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

# 修改待上传镜像的tag
[root@linux-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
game/shop-api latest 950dfdaa7360 3 hours ago 365MB

[root@linux-node1 ~]# docker tag 950dfdaa7360 10.0.0.102/library/shop-api:v
[root@linux-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
game/shop-api latest 950dfdaa7360 3 hours ago 365MB
10.0.0.102/library/shop-api v1 950dfdaa7360 3 hours ago 365MB
...
1
2
3
4
5
# 上传镜像
[root@linux-node1 ~]# docker push 10.0.0.102/library/shop-api:v1

# 出现 类似下述信息 表示上传成功
v1: digest: sha256:298299afc2a1251dc8cef3e251a361475a9c8b59c2d7309a5f39f3820a6ba6e7 size: 3030

下载镜像

  1. 下载该镜像的host 都必须要先登录才行,而且必须有权限
  2. harbor可以创建新用户,做权限管理,访客权限只能下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 先删除本地的,再登录
[root@linux-node1 ~]# docker rmi 10.0.0.102/library/shop-api:v1
[root@linux-node1 ~]# docker login 10.0.0.102

# 下载镜像
# harbor页面上有友好提示哦~
[root@linux-node1 ~]# docker pull 10.0.0.102/library/shop-api:v1
v1: Pulling from library/shop-api
Digest: sha256:298299afc2a1251dc8cef3e251a361475a9c8b59c2d7309a5f39f3820a6ba6e7
Status: Downloaded newer image for 10.0.0.102/library/shop-api:v1
10.0.0.102/library/shop-api:v1

[root@linux-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.102/library/shop-api v1 950dfdaa7360 3 hours ago 365MB
...
1
2
3
4
5
6
7
8
9
10
11
# 启动个容器测试
[root@linux-node1 ~]# docker run -d -p 80:5000 -p 8022:22 --name web1-ssh 10.0.0.102/library/shop-api:v1

[root@linux-node1 ~]# ssh 10.0.0.100 -p 8022
root@10.0.0.100's password:
[root@a576c0ee04f0 ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 8/sshd
tcp6 0 0 :::22 :::* LISTEN 8/sshd

Harbor 主从同步

  1. Harbor 还提供双机的 镜像推送功能