• 搭建Harbor企业级docker仓库


     

     

     

    一、Harbor简介

    1.Harbor介绍

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

    2.Harbor特性

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

    3.Harbor组件

    Harbor在架构上主要由6个组件构成:

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

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

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

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

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

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

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

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

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

    各个组件之间的关系如下图所示:

    4.Harbor实现

    Harbor的每个组件都是以Docker容器的形式构建的,官方也是使用Docker Compose来对它进行部署。用于部署Harbor的Docker Compose模板位于 harbor/docker-compose.yml,打开这个模板文件,发现Harbor是由7个容器组成的;

    # docker-compose ps
           Name                     Command               State                                Ports                              
    ------------------------------------------------------------------------------------------------------------------------------
    harbor-adminserver   /harbor/harbor_adminserver       Up                                                                      
    harbor-db            docker-entrypoint.sh mysqld      Up      3306/tcp                                                        
    harbor-jobservice    /harbor/harbor_jobservice        Up                                                                      
    harbor-log           /bin/sh -c crond && rm -f  ...   Up      127.0.0.1:1514->514/tcp                                         
    harbor-ui            /harbor/harbor_ui                Up                                                                      
    nginx                nginx -g daemon off;             Up      0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp
    registry             /entrypoint.sh serve /etc/ ...   Up      5000/tcp 

    nginx:nginx负责流量转发和安全验证,对外提供的流量都是从nginx中转,所以开放https的443端口,它将流量分发到后端的ui和正在docker镜像存储的docker registry。
    harbor-jobservice:harbor-jobservice 是harbor的job管理模块,job在harbor里面主要是为了镜像仓库之前同步使用的;
    harbor-ui:harbor-ui是web管理页面,主要是前端的页面和后端CURD的接口;
    registry:registry就是docker原生的仓库,负责保存镜像。
    harbor-adminserver:harbor-adminserver是harbor系统管理接口,可以修改系统配置以及获取系统信息。
    这几个容器通过Docker link的形式连接在一起,在容器之间通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。
    harbor-db:harbor-db是harbor的数据库,这里保存了系统的job以及项目、人员权限管理。由于本harbor的认证也是通过数据,在生产环节大多对接到企业的ldap中;
    harbor-log:harbor-log是harbor的日志服务,统一管理harbor的日志。通过inspect可以看出容器统一将日志输出的syslog。

    这几个容器通过Docker link的形式连接在一起,这样,在容器之间可以通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。

    二、安装部署

    1、安装最新版的docker    docker-compose

    curl -fsSL https://get.docker.com/ | sh    或  yum install docker-ce-18.03.1.ce
    curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/bin/docker-compose
    chmod +x /usr/bin/docker-compose

    验证

    docker version
    docker-compose --version

    2、安装harbor

    登录下载相应版本的harbor  

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

    harbor-offline-installer-v1.8.1.tgz

    解压

    tar zxvf harbor-offline-installer-v1.8.1.tgz 

    编辑 harbor.yml然后执行./install.sh

    安装完成后在浏览器使用 172.16.119.225即可登陆,如果用域名的话,可以配置nginx如下:

    server {
        listen              80;
        server_name         harbor.xxx.com;
        location / {
            proxy_pass http://172.16.119.225:80;
      }
    }

    即可使用域名登陆,登陆账号密码在harbor.yml配置的,默认账号密码: admin / Harbor12345 登录后可修改密码。

    Harbor的启动和停止

    # 启动Harbor
    docker-compose start
    # 停止Harbor
    docker-comose stop
    # 重启Harbor
    docker-compose restart

     三、测试上传下载镜像

    1、所有服务器修改docker客户端配置

    vim /usr/lib/systemd/system/docker.service  增加 --insecure-registry=http://172.16.119.225:80 即可。

    ExecStart=/usr/bin/dockerd  --insecure-registry=http://172.16.119.225:80  #harbor.yml里配置的hostname值

    重启docker

    systemctl restart docker

    或创建/etc/docker/daemon.json文件,在文件中指定仓库地址 ,然后重新docker

    {
      "insecure-registries":["172.16.119.225:80"]
    }

    2、创建Dockerfile

    from docker.io/tomcat:latest
    MAINTAINER zhangpan
    RUN rm -rf /usr/local/openjdk-8
    RUN rm -rf /usr/local/tomcat
    COPY jdk1.8.0_92 /usr/local/jdk1.8.0_92
    COPY tomcat /usr/local/tomcat

    3、创建镜像

    tag名称里  172.16.119.225:80/library/  是不变的,172.16.119.225:80表示私库地址,library是仓库项目名,可以更改,但私库里要先创建好

    docker build -t 172.16.119.225:80/library/tomcat:wuyun .

    4、登录私库然后把镜像推送到Harbor仓库

    docker push 172.16.119.225:80/library/tomcat:wuyun   

     

    如果不是自己创建的镜像,需要先执行 docker tags 给镜像做tag再推送,如:

    docker pull flannel
    docker tag quay.io/coreos/flannel:v0.11.0-amd64  172.16.119.225:80/library/flannel:v0.11.0-amd64 
    docker push 172.16.119.225:80/library/busybox:latest

     

     删除这种同id不同tag的镜像

    docker rmi 172.16.119.225:80/library/flannel:v0.11.0-amd64

    5、登陆web页面查看镜像

     

    6、在别的服务器上拉取镜像,服务器上要先更改好私库地址

    四、Harbor配置TLS证书

    参考文章:https://github.com/goharbor/harbor/blob/master/docs/configure_https.md

    因为我们上面对Harbor的配置都是使用的http协议访问,但是我们工作中一般都是配置https访问。所以我给大家演示一下怎么配置Harbor可以使用https访问,以及配置TLS证书都需要做哪些工作。

     因为Harbor默认使用http协议访问,所以我们这里在配置文件中,开启https配置;

    1、编辑harbor.yml 

    http 和port前加上注释,同时取消https  port  certificate    private_key前注释并修改证书路径

     

    2、创建目录并生成ca文件

    mkdir /etc/certs  && cd /etc/certs/
    openssl genrsa -out /etc/certs/ca.key 2048 

    3、创建自签名证书key文件,注意CN的值,更改和harbor.yml里hostname值一样即可

    openssl req -x509 -new -nodes -key /etc/certs/ca.key -subj "/CN=172.16.119.225" -days 5000 -out /etc/certs/ca.crt          

    4、生成服务器端私钥和CSR签名请求

    openssl genrsa -out 172.16.119.225.key 4096   #172.16.119.225是ip或者主机名
    openssl req -sha512 -new -subj "/CN=172.16.119.225" -key 172.16.119.225.key  -out 172.16.119.225.csr

    5、签发服务器证书

    创建文件v3.ext并生成crt文件

    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    extendedKeyUsage = serverAuth 
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1=172.16.119.225
    DNS.2=test-04
    IP.1=
    172.16.119.225 #其他需要连接docker私库的服务器IP地址
    IP.2=172.16.119.224
    IP.3=172.16.119.223
    IP.4=172.16.119.***
    
    
    openssl x509 -req -sha512 -days 3650 -extfile v3.ext  -CA ca.crt -CAkey ca.key -CAcreateserial  -in 172.16.119.225.csr -out 172.16.119.225.crt

    全部证书生成后结果如下:

    6、配置docker证书

    为所有需要用https的 Docker服务器配置服务器证书,密钥和CA.

    Docker守护程序将.crt文件解释为CA证书,将.cert文件解释为客户端证书。

    将crt文件转换为cert文件

    openssl x509 -inform PEM -in 172.16.119.225.crt -out 172.16.119.225.cert

    将文件cert  key和ca文件拷贝到 /etc/docker/certs.d/172.16.119.225 如果没有目录就新建,目录格式不能错。

    
    

    # 如果如下目录不存在,请创建,如果有域名请按此格式依次创建
    mkdir -p /etc/docker/certs.d/192.168.50.84
    # mkdir -p /etc/docker/certs.d/[IP2]
    # mkdir -p /etc/docker/certs.d/[example1.com]
    # 如果端口为443,则不需要指定。如果为自定义端口,请指定端口
    # /etc/docker/certs.d/yourdomain.com:port


    mkdir -p /etc/docker/certs.d/172.16.119.225

    cp 172.16.119.225.cert /etc/docker/certs.d/172.16.119.225

    cp 172.16.119.225.key /etc/docker/certs.d/172.16.119.225

    cp ca.crt /etc/docker/certs.d/172.16.119.225

    7、重启docker然后为Harbor生成配置文件

    systemctl restart docker
    ./prepare 

    如果Harbor已在运行,请停止并删除现有实例。然后重启实例

    docker-compose down -v
    docker-compose up -d

    如果nginx无法启动且查看容器日志也查看不了,报如下错误

    Error response from daemon: configured logging driver does not support reading

    遇到此问题可以关注docker-compose.yml 以下选项是否对应

    source: /data/cert/server.key
    target: /etc/cert/server.key
    source: /data/cert/server.crt
    target: /etc/cert/server.crt

     我这查看显示source 都是ca.crt,因为我复制错了,docker-compose.yml 是在./install 后映射的harbor.yml内容,所以更改harbor.yml后重新安装即可

    8、测试

    所有docker服务器先更改/etc/docker/daemon.json再重启docker

    {
      "insecure-registries":["172.16.119.225:443"]
    }

    然后docker login 172.16.119.225:443 如果提示x509: certificate signed by unknown authority错误,则需要添加主机信任,centos操作如下:

    cp 172.16.119.225.crt /etc/pki/ca-trust/source/anchors/172.16.119.225.crt
    
    update-ca-trust

    再次登录即可,如果端口不是443端口,登录需要指明端口,如:docker login 172.16.119.225:9999

     ps  删除 ~/.docker/config.json  文件内 auths内容可以删除登录记录

  • 相关阅读:
    _DataStructure_C_Impl:共享栈
    _DataStructure_C_Impl:顺序栈
    _DataStructure_C_Impl:一元多项式
    _DataStructure_C_Impl:双向链表
    _DataStructure_C_Impl:静态链表
    _DataStructure_C_Impl:循环单链表
    设计模式(三)-抽象工厂模式
    设计模式(二)-工厂模式
    设计模式(一)单例模式
    设计模式概述及其原则
  • 原文地址:https://www.cnblogs.com/zphqq/p/11242864.html
Copyright © 2020-2023  润新知