文章目录
Harbor
Harbor本身自带 docker 私有仓库,改变了传统的交付方式。通过把业务及其依赖的环境打包进Docker镜像,解决了开发环境和生产环境的差异问题,提升了业务交付的效率。如何高效地管理和分发Docker镜像?是众多企业需要考虑的问题。
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,可以用来构建企业内部的Docker镜像仓库。
它在Docker的开源项目 Distribution的基础上,添加了一些企业需要的功能特性,如镜像同步复制、漏洞扫描和权限管理等。
安装配置
官方的下载地址:https://github.com/goharbor/harbor/releases
解压harbor的压缩包
[root@server3 ~]# tar xfz harbor-offline-installer-v1.10.1.tgz
[root@server3 ~]# ls
harbor harbor-offline-installer-v1.10.1.tgz
因为这里harbor是使用容器的方式部署镜像的所以需要在主机上安装docker-ce,并且开启docker,解决警告信息
配置
在harbor目录里编辑配置
[root@server3 ~]# cd harbor/ #进入解压出来的harbor目录
[root@server3 harbor]# vim harbor.yml #编辑配置文件
5 hostname: reg.test.com #自定义一个主机名,这个主机名时需要添加地址解析的才能使用的
13 #https: #这里我们只是测试关闭https用http的80端口即可
15 # port: 443
27 harbor_admin_password: redhat123 #设置登陆admin用户的密码
保存配置,直接执行脚本去启动harbor
[root@server3 harbor]# ./install.sh
[Step 0]: checking if docker is installed ...
Note: docker version: 19.03.11
[Step 1]: checking docker-compose is installed ...
✖ Need to install docker-compose(1.18.0+) by yourself first and run this script again.
这里注意:启动harbor还需要一个docker插件docker-compose,这个插件可以将多个镜像整合为一个应用去进行部署
下载地址:因为是从github下载所以速度真的是挺慢的
curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
推荐可以从阿里云上的资源去下载速度很快:http://mirrors.aliyun.com/docker-toolbox/,找最新版就行
将下载的docker-compose放在/usr/local/bin/里,并添加x执行权限,可以去调用它
[root@server3 ~]# mv docker-compose-Linux-x86_64-1.24.1 /usr/local/bin/docker-compose
[root@server3 ~]# chmod +x /usr/local/bin/docker-compose
然后再去harbo目录里执行启动脚本,就正常了
执行成功后会生成一个docker-compose.yml文件,里面记录了docker-compose的各种配置
[root@server3 harbor]# ls
common docker-compose.yml harbor.yml LICENSE
common.sh harbor.v1.10.1.tar.gz install.sh prepare
也可以通过docker-compose查看开启的镜像
这时成功开启后我们就可以去通过网页直接访问了,输入主机的ip就可以直接访问到,还可以选择中文,用户密码就是开启前修改的admin 的密码
镜像管理
镜像上传
登陆harbor之后会有一个默认的项目library,我们可以测试往这个项目里去上传镜像
在本机主机上先下载或添加一个镜像
[root@server3 ~]# docker load -i busybox.tar
8a788232037e: Loading layer 1.37MB/1.37MB
Loaded image: busybox:latest
然后对这个镜像进行打标签
[root@server3 ~]# docker tag busybox:latest localhost/library/busybox
下来就是推送,注意打标签时可以直接使用reg.test.com/library/busybox ,但是这样操作必须是harbor开启https认证,否则上传时会报错被拒绝,我们因为使用同一台主机,直接使用本地的80端口就可以上传。
上传之前还是需要登陆认证
[root@server3 harbor]# docker login localhost #登陆
Username: admin
Password:
Login Succeeded
[root@server3 harbor]# docker push localhost/library/busybox #上传镜像
The push refers to repository [localhost/library/busybox]
8a788232037e: Pushed
latest: digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5 size: 527
然后在harbor页面里就可以看到了
并且在它的日志里会详细记录所有的操作,谁对什么镜像做了什么操作
远程主机上传镜像
删除网页上刚才上传的镜像,在主机里退出docker登陆,关闭harbor,去添加https认证
[root@server3 harbor]# docker logout localhost
Removing login credentials for localhost
[root@server3 harbor]# docker-compose stop
在配置文件打开https加密
[root@server3 harbor]# vim harbor.yml
13 https: #打开之前注释的https功能
14 # https port for harbor, default is 443
15 port: 443
16 # The path of cert and key files for nginx
17 certificate: /data/certs/test.com.crt #指定证书的存放位置
18 private_key: /data/certs/test.com.key #指定key的位置
去在配置文件里自己指定的位置创建证书
[root@server3 harbor]# cd /data/
[root@server3 data]# mkdir -p certs
[root@server3 data]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/test.com.key -x509 -days 365 -out certs/test.com.crt
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:SHAANXI
Locality Name (eg, city) [Default City]:Xi'an
Organization Name (eg, company) [Default Company Ltd]:redhat
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:reg.test.com
Email Address []:root@test.com
回到harbor目录,使用脚本去重载配置文件,重启服务
[root@server3 data]# cd ~/harbor/
[root@server3 harbor]# ./prepare
[root@server3 harbor]# ./install.sh
重启成功后再去访问网页时就会自动定位到https,443端口
因为我们的证书是自己创建的并没有去花钱认证所以标记为不可信的
这时我们就可以使用另一台主机进行远程连接,上传镜像。
准备一个镜像,并给主机添加解析
[root@server2 ~]# docker images
nginx latest 2622e6cca7eb 7 days ago 132MB
给这台主机配置证书,可以去访问harbor主机的443端口
远程主机创建目录存放证书
[root@server2 ~]# mkdir -p /etc/docker/certs.d/reg.test.com
从harbor主机将证书传给远程主机改名为ca.crt
[root@server3 harbor]# scp /data/certs/test.com.crt server2:/etc/docker/certs.d/reg.test.com/ca.crt
给这个镜像打标签,登陆仓库,推送镜像
[root@server2 ~]# docker tag nginx:latest reg.test.com/library/nginx #打标签
[root@server2 ~]# docker login reg.test.com #登陆认证
Username: admin #因为只有一个用户,就是用它登陆
Password:
Login Succeeded
[root@server2 ~]# docker push reg.test.com/library/nginx #上传镜像
成功上传,镜像可以显示出来
配置私有仓库拉取镜像
这里私有拉取仓库目的是更改默认镜像下载的地址,正常我们使用docker pull nginx 肯定是从官方或自己设置的加速地址拉取的,现在设置直接可以从我们自己的harbor里拉取镜像。
远程主机操作测试,配置私有仓库路径
[root@server2 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://reg.test.com"] #配置自己的仓库地址
}
[root@server2 ~]# systemctl restart docker #重启服务
我的仓库里有一个busybox,但是主机上没有这个镜像,我就去拉取这个镜像
拉取镜像的时候不需要验证,直接执行pull指令就可以
[root@server2 ~]# docker pull busybox #拉去镜像
Using default tag: latest
latest: Pulling from library/busybox
90e01955edcd: Pull complete
Digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
harbor的日志里也可以看到拉取的信息
Harbor私有仓库
之前harbor里的library仓库是公开的,对所有人都可见,那现在就需要配置一个不公开的仓库
建立新仓库,第定义名称,-1表示无限制
接着去建立一个新用户,在左侧点击用户管理,添加新用户,自定义
然后到我们的建立的私有项目里,成员选项,+成员,把这个用户添加进去,并且可以给它设置身份,不同的身份会有权限的限制,项目管理员肯定是最大的权限
这里我设置为维护人员
设置好之后就可以使用这个用户去登陆harbor,但是它的权限很小,可以看到,除了项目和日志的查看功能,其他的都没有
测试私有仓库的上传和拉取
镜像上传
[root@server2 ~]# docker login reg.test.com
Username: howei #使用我们建立的用户登陆
Password:
Login Succeeded
[root@server2 ~]# docker tag busybox:latest reg.test.com/redhat/busybox #打标签给私有仓库里
[root@server2 ~]# docker push reg.test.com/redhat/busybox #上传镜像
The push refers to repository [reg.test.com/redhat/busybox]
8a788232037e: Pushed
latest: digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5 size: 527
镜像拉取
注意因为这是私有仓库,如果登陆认证是无法拉取镜像的
[root@server2 ~]# docker rmi reg.test.com/redhat/busybox
[root@server2 ~]# docker rmi busybox #删除本地已存在镜像
[root@server2 ~]# docker logout reg.test.com #登出
Removing login credentials for reg.test.com
[root@server2 ~]# docker pull reg.test.com/redhat/busybox #拉取时被拒绝了
Using default tag: latest
Error response from daemon: pull access denied for reg.test.com/redhat/busybox, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
私有仓库拉取必须使用仓库认证的用户先登验证,再拉取
[root@server2 ~]# docker login reg.test.com
Username: howei
Password:
Login Succeeded
[root@server2 ~]# docker pull reg.test.com/redhat/busybox
Using default tag: latest
latest: Pulling from redhat/busybox
90e01955edcd: Pull complete
Digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5
Status: Downloaded newer image for reg.test.com/redhat/busybox:latest
reg.test.com/redhat/busybox:latest
Harbor仓库镜像漏洞扫描和信任认证
漏洞扫描和信任认证功能默认在运行harbor时是没有开启的,所以我们需要关闭,重新开启它增加参数
[root@server3 harbor]# docker-compose stop
[root@server3 harbor]# ./install.sh --with-notary --with-clair --with-chartmuseum
--with-notary镜像信任功能 --with-clair镜像扫描漏洞功能
再次开启后,刷新页面,可以看到仓库里多了Helm Charts功能,在镜像里也能看到扫描的信息
镜像扫描
我们可以手动勾选取点击扫描,检测看镜像是否有漏洞
可以在项目仓库的配置管理里去勾选自动扫描的选项,在上传镜像时自动去扫描漏洞,记着点保存
然后我们去打标签镜像,再去上传到library里
[root@server2 ~]# docker login reg.test.com #登陆
Username: admin
Password:
Login Succeeded
[root@server2 ~]# docker tag reg.test.com/redhat/busybox reg.test.com/library/busybox:v2 #打标签
[root@server2 ~]# docker push reg.test.com/library/busybox #上传
The push refers to repository [reg.test.com/library/busybox]
8a788232037e: Layer already exists
v2: digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5 size: 527
可以在harbor里看到镜像自动扫描了
镜像信任
镜像信任功能可以保证镜像的安全,因为只有打了信任标签的镜像才可以被拉取
测试,先使用admin管理员登陆认证
[root@server2 ~]# docker login reg.test.com #登陆
Username: admin
Password:
Login Succeeded
然后在配置管理里勾选内容信任
删除本地的busybox,再去拉取library里的busybox镜像
会得到一个错误镜像没有签名
[root@server2 ~]# docker pull reg.test.com/library/busybox
Using default tag: latest
Error response from daemon: unknown: The image is not signed in Notary.
这就是在开启信任认证之后,没有签名的镜像都不能被随意拉取
以签名是“×”
信任签名设置
部署证书:
[root@server3 ~]# cd ~/.docker/
[root@server3 .docker]# mkdir -p tls/reg.test.com:4443/
[root@server3 .docker]# cp /etc/docker/certs.d/reg.test.com/ca.crt tls/reg.test.com:4443/ca.crt
添加参数,开启内容信任
[root@server3 .docker]# export DOCKER_CONTENT_TRUST=1
[root@server3 .docker]# export DOCKER_CONTENT_TRUST_SERVER=https://reg.test.com:4443
[root@server3 harbor]# netstat -ntlp
tcp6 0 0 :::4443 :::* LISTEN 25233/docker-proxy
上传镜像测试,上传到library仓库里,因为这里面我们开启了内容信任,记着要先登陆认证
注意:要上传签名的镜像必须是有标签的,如果没有打标签,上传就会有签名,因为两个是绑定的。
[root@server3 harbor]# docker tag busybox:latest reg.test.com/library/busybox:v3 #打标签
[root@server3 harbor]# docker push reg.test.com/library/busybox:v3 #上传
---
Enter passphrase for new root key with ID 8ce0c6d: #因为有信任标签,这里就需要设置root的认证码
Repeat passphrase for new root key with ID 8ce0c6d:
Enter passphrase for new repository key with ID a0b00c3: #设置repository的认证码
Repeat passphrase for new repository key with ID a0b00c3:
上传成功后,在harbor里就可以看到已签名的的标志,而且打了签名的镜像不能随意的去删除
然后我们去其他认证的主机上就可以拉取打了签名的镜像了
[root@server2 ~]# docker pull reg.test.com/library/busybox:v3
v3: Pulling from library/busybox
Digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5
Status: Downloaded newer image for reg.test.com/library/busybox:v3
reg.test.com/library/busybox:v3
删除签名
命令删除签名
[root@server3 harbor]# docker trust revoke reg.test.com/library/busybox:v3
Enter passphrase for repository key with ID a0b00c3: #上传时设置的密码
Successfully deleted signature for reg.test.com/library/busybox:v3
页面刷新也可以看到,签名变为“×”了