zoukankan      html  css  js  c++  java
  • dockerhub部署和使用

    一、harbor介绍

    ​ Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。

    二、harbor安装

    准备工作

    docker-ce的安装

    docker的安装有两个方法:

    1. 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
      
    2. curl安装

      curl -fsSL https://get.docker.com/ | sh
      

    安装docker-compose

    docker-compose的安装也有种方法:

    1. 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
    
  • 相关阅读:
    Android操作系统中11种传感器的介绍【转】
    陀螺仪、加速计、磁力计【转】
    【转】在ubuntu环境下搭建svn server遇到的一些问题
    【转】Ubuntu下搭建SVN环境-Apache
    【转】Java ConcurrentModificationException 异常分析与解决方案--还不错
    【转】ConcurrentModificationException异常解决办法 --不错
    【转】Java ConcurrentModificationException异常原因和解决方法
    【转】 为SeekBar滑块设置固定值以及自定义Seekbar,progressbar样式--不错
    【转】Android自定义Adapter的ListView的思路及代码
    【转】如何开发苹果iOS操作平台下的应用程序?
  • 原文地址:https://www.cnblogs.com/zhaobowen/p/13269614.html
Copyright © 2011-2022 走看看