dockerhub部署和使用
一、harbor介绍
Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。
二、harbor安装
准备工作
docker-ce的安装
docker的安装有两个方法:
-
yum安装
yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repohttps://download.docker.com/linux/centos/docker-ce.repo yum -y install docker-ce; systemctl start docker
-
curl安装
curl -fsSL https://get.docker.com/ | sh
安装docker-compose
docker-compose的安装也有种方法:
-
curl直接下载
curl -L https://github.com/docker/compose/releases/download/1.25.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
开始安装
下载harbor
选择你需要的版本,Offine是离线安装包,Online是在线安装包。在线的安装方式比较简单,这里我使用的离线安装,包自然会比Online的大一些。本文使用的版本是1.8.1
wget https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-online-installer-v1.8.1.tgz
tar xvf harbor-online-installer-v1.8.1.tgz
修改配置文件
vim harbor.yml
修改hostname:填服务IP不用使用127.0.0.1
关闭默认的http配置:如果不需要证书的话,就开启,部署起来省事儿
打开https配置:这个需要证书,证书的只做参看下一小节。
填写证书的完整路径
制作证书
1、创建ca证书
cd /data/cert #该目录是harbor中配置的目录
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
其中:(req:申请证书签署请求;-newkey 新密钥 ;-x509:可以用来显示证书的内容,转换其格式,给CSR签名等X.509证书的管理工作,这里用来自签名。)
一路回车出现Common Name 输入IP或域名
Common Name (eg, your name or your server's hostname) []:47.52.25.8
2、生成证书签名请求
openssl req -newkey rsa:4096 -nodes -sha256 -keyout 47.52.25.80.key -out 47.52.25.80.csr
一路回车出现Common Name 输入IP或域名
Common Name (eg, your name or your server's hostname) []:47.52.25.8
3、生成证书
echo subjectAltName = IP:47.52.25.8 > extfile.cnf
openssl x509 -req -days 365 -in 47.52.25.80.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out 47.52.25.80.crt
执行安装
./prepare 更新配置文件
./install.sh
Docker-compose管理命令
执行命令必须进入harbor安装目录,可能因为需要读取docker-compose.yml,docker-compose.yml是安装完成后生成的。
docker-compose ps
docker-compose down
docker-compose down -v 停止并删除容器
docker-compose start 启动容器,容器不存在就无法启动
docker-compose stop 停止容器
docker-compose up -d 后台启动,如果容器不存在根据镜像自动创建
查看日志
cat docker-compose.yml |grep log
cd /var/log/harbor/
分发证书
本机执行
mkdir -p /etc/docker/certs.d/192.168.2.22
cd /data/cert/
cp 192.168.2.22.crt ca.crt /etc/docker/certs.d/192.168.2.22/
cd /etc/docker/certs.d/192.168.2.22
Ls
拷贝证书到所有节点
scp -r 192.168.2.22/ 192.168.2.23:/etc/docker/certs.d/192.168.2.22
systemctl restart docker ##测试感觉可以不重启
三、Harbor主从同步镜像
注意:不同版本的harbor无法使用主从同步
按要求配置连接,测试成功后,点开具体的项目,配置复制
四、使用google浏览器访问不是私密连接问题
使用IP创建的证书后,使用谷歌浏览器打开管理UI会报错,不是私密连接,可以使用自签名证书解决,参考文档
自签名证书制作,解决google浏览器私密连接问题
hub.ict.ac.cn
设置自签名机构
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=hub.ict.ac.cn" -key ca.key -out ca.crt
openssl genrsa -out hub.ict.ac.cn.key 4096
openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=hub.ict.ac.cn" -key hub.ict.ac.cn.key -out hub.ict.ac.cn.csr
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=hub.ict.ac.cn
DNS.2=harbor
DNS.3=ks-allinone
EOF
制作证书
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in hub.ict.ac.cn.csr -out hub.ict.ac.cn.crt
openssl x509 -inform PEM -in hub.ict.ac.cn.crt -out hub.ict.ac.cn.cert
分发证书
cp hub.ict.ac.cn.crt /etc/pki/ca-trust/source/anchors/hub.ict.ac.cn.crt
update-ca-trust
mkdir -p /etc/docker/certs.d/hub.ict.ac.cn
cp hub.ict.ac.cn.cert /etc/docker/certs.d/hub.ict.ac.cn/
cp hub.ict.ac.cn.key /etc/docker/certs.d/hub.ict.ac.cn/
cp ca.crt /etc/docker/certs.d/hub.ict.ac.cn/
五、修改镜像存储路径
对于高版本的harbor如1.10 由于他的docker-compose.yml是执行安装后才生成的,所以在harbor.yml里的data_volume即可。
但是对于低版本的如1.07,docker-compose.yml文件是自带的所以需要修改docker-compose.yml中所有/data的地方改成自己的路径,然后install即可。
六、镜像迁移
镜像迁移方案有两种,可以使用harbor自带的镜像复制功能复制,但是这个要求两个harbor的版本一致,这种情况比较简单。另一种是在版本不一致的情况下,有两个选择,一是将harbor的版本升级到一致使用自带的镜像复制功能。另一种就是使用harbor的api编写脚本拉取镜像,再推送到新的harbor上。
1.Harbor升级
由于harbor从v1.6.0版本开始,后端数据库由MariaDB改为Postgresql,所以在升级过程中如果是1.6版本一下的,必须先升级到v1.6.0版本,再升级至目标版本。在v1.6.0版本之后,harbor会在启动服务时自行迁移数据库数据,所以无需再单独迁移数据库。
我们升级的版本是1.7-->1.10.1
迁移步骤:
1、迁移并关闭1.7镜像库
mv harbor harbor1.7.bak
Cd /root/harbor1.7.bak
docker-compose down
2、下载新的harbor版本
tar -zxvf harbor-offline-installer-v1.10.1.tgz
cd harbor
3、备份数据库
这里要注意:1.7版本的harbor数据存储路径(见8小节)是在docker-compose.yml下配置的。而1.10的数据路径在harbor.yml下配置。这就导致一个问题,在下一步要升级版本的时候,更新配置文件的过程中更新不了数据存储路径。自动更新配置文件的数据存储路径是默认的/data,而1.7我安装的时候在docker-compose.yml修改了存储路径为/home/harbordata/。所以需要将/home/harbordata/下的所有数据复制到/data(包含镜像数据所以特别大)。或者在执行完自动更新配置文件(下一步)后手动编辑harbor.yml修改数据路径为/home/harbordata/
cd /home/harbordata/
cp -r database database1.7.bak
cp -r /home/harbordata/* /data
4、升级harbor配置文件,也即harbor.cfg到harbor.yml
docker pull goharbor/harbor-migrator:v1.10.1
Tag按需要修改成你要升级的版本号
docker run -it --rm -v /root/harbor1.7.bak/harbor.cfg:/harbor-migration/harbor-cfg/harbor.cfg -v /root/harbor/harbor.yml:/harbor-migration/harbor-cfg-out/harbor.yml goharbor/harbor-migrator:v1.10.1 --cfg up
5、配置证书
6、启动
./install.sh
2.使用脚本同步镜像
百度了一篇迁移脚本直接引用了,我没有使用过这个方案,太烦,原理就是使用hub的api将镜像全本下载到本地,然后再上传到新harbor中。
https://www.cnblogs.com/breezey/p/10615242.html
七、开启漏洞扫描
漏洞扫描工具有很多商业的,可以度娘一下,不过大多都很贵。像我们这种toB的项目基本上不用想。所以就使用自带的工具体验一下吧。
1、关闭harbor docker-compose stop
2、开启漏洞扫描工具 ./prepare --with-clair
3、重启harbor服务 docker-compose -f docker-compose.yml up -d
不是start哦,要重新加载配置文件
4、验证
5、开启漏洞扫描定时任务
八、harbor维护
harbor在使用一段时间后由于迭代频繁会产生很多垃圾数据,可以在项目里设置TAG保留规则。
这个也是1.10版本以后出来的功能,之前的版本只好使用api删除了。
1.Harbor 数据清理
Harbor私有仓库运行一段时间后,仓库中存有大量镜像,会占用太多的存储空间。直接通过Harbor界面删除相关镜像,并不会自动删除存储中的文件和镜像。需要停止Harbor服务,执行垃圾回收命令,进行存储空间清理和回收。
进入compose所在目录[config.yml]
[root@node ~]# cd /root/harbor
停止Harbor相关的compose服务
[root@node harbor]# docker-compose stop
Stopping harbor-jobservice ... done
Stopping nginx ... done
Stopping harbor-ui ... done
Stopping harbor-db ... done
Stopping registry ... done
Stopping harbor-adminserver ... done
Stopping harbor-log ... done
使用--dry-run参数运行容器,预览运行效果,但不删除任何数据
docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.2-photon garbage-collect --dry-run /etc/registry/config.yml
nginx/nginx
blobs marked, 5 blobs eligible for deletion【0个blobs被标记,5个blobs可删除]
blob eligible for deletion: sha256:3c091c23e29d0ddfc902b0be63b1a08a853ef39973f92fab39ad1727eac012bf
blob eligible for deletion: sha256:4a99993b863683bef1c776732e14d2372f6ed52b48e94783f4a1b58af289db07
blob eligible for deletion: sha256:ae513a47849c895a155ddfb868d6ba247f60240ec8495482eca74c4a2c13a881
blob eligible for deletion: sha256:e4f0474a75c510f40b37b6b7dc2516241ffa8bde5a442bde3d372c9519c84d90
blob eligible for deletion: sha256:f2aa67a397c49232112953088506d02074a1fe577f65dc2052f158a3e5da52e8
不使用--dry-run参数,将删除相关的文件和镜像
docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.2-photon garbage-collect /etc/registry/config.yml
nginx/nginx
blobs marked, 5 blobs eligible for deletion#【0个blobs被标记,5个blobs可删除]
blob eligible for deletion: sha256:3c091c23e29d0ddfc902b0be63b1a08a853ef39973f92fab39ad1727eac012bf
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/3c/3c091c23e29d0ddfc902b0be63b1a08a853ef39973f92fab39ad1727eac012bf go.version=go1.7.3 instance.id=8a97e002-522a-4a6c-b390-122880d53183 service=registry
blob eligible for deletion: sha256:4a99993b863683bef1c776732e14d2372f6ed52b48e94783f4a1b58af289db07
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/4a/4a99993b863683bef1c776732e14d2372f6ed52b48e94783f4a1b58af289db07 go.version=go1.7.3 instance.id=8a97e002-522a-4a6c-b390-122880d53183 service=registry
blob eligible for deletion: sha256:ae513a47849c895a155ddfb868d6ba247f60240ec8495482eca74c4a2c13a881
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/ae/ae513a47849c895a155ddfb868d6ba247f60240ec8495482eca74c4a2c13a881 go.version=go1.7.3 instance.id=8a97e002-522a-4a6c-b390-122880d53183 service=registry
blob eligible for deletion: sha256:e4f0474a75c510f40b37b6b7dc2516241ffa8bde5a442bde3d372c9519c84d90
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/e4/e4f0474a75c510f40b37b6b7dc2516241ffa8bde5a442bde3d372c9519c84d90 go.version=go1.7.3 instance.id=8a97e002-522a-4a6c-b390-122880d53183 service=registry
blob eligible for deletion: sha256:f2aa67a397c49232112953088506d02074a1fe577f65dc2052f158a3e5da52e8
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/f2/f2aa67a397c49232112953088506d02074a1fe577f65dc2052f158a3e5da52e8 go.version=go1.7.3 instance.id=8a97e002-522a-4a6c-b390-122880d53183 service=registry
docker-compose start
Starting log ... done
Starting adminserver ... done
Starting registry ... done
Starting ui ... done
Starting mysql ... done
Starting jobservice ... done
Starting proxy ... done
2.删除镜像仓库TAG脚本
【每个项目保留9个版本镜像,可在下面脚本配置,打 tag 的时候可以按照日期命名,例如:2018-10-29_17-39 】
#!/bin/bash
URL="http://192.168.56.21"
USER="admin"
PASS="Harbor12345"
PRO="nginx"
HARBOR_PAHT="/root/harbor"
SAVE_IAMGE_NUM=9
#软删除 harbor tags
del_tags()
{
echo "软删除 ${rp}/${t}"
curl -u ${USER}:${PASS} -X DELETE -H 'Accept: text/plain' "${URL}/api/repositories/${rp}/tags/${t}"
}
#硬删除 harbor tags
har_del_tags()
{
cd ${HARBOR_PAHT}
docker-compose stop
docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.2-photon garbage-collect /etc/registry/config.yml
docker-compose start
}
# 获取 project id
PID=$(curl -u ${USER}:${PASS} -s -X GET --header 'Accept: application/json' "${URL}/api/projects"|grep -w -B 2 "${PRO}" |grep "project_id"|awk -F '[:, ]' '{print $7}')
#echo ${PID}
# 拿获取到的 projects_id 获取 repositories[仓库]
REPOS=$(curl -u ${USER}:${PASS} -s -X GET --header 'Accept: application/json' "${URL}/api/repositories?project_id=${PID}"|grep "name"|awk -F '"' '{print $4}')
for rp in ${REPOS}
do
echo ${rp}
TAGS=$(curl -u ${USER}:${PASS} -s -X GET --header 'Accept: application/json' "${URL}/api/repositories/${rp}/tags"|grep \"name\"|awk -F '"' '{print $4}'|sort -r |awk "NR > $SAVE_IAMGE_NUM {print $1}")
for t in ${TAGS}
do
echo ${t}
del_tags
done
echo "===================="
done
har_del_tags