Harbor Warehouse deployment

 Harbor介绍

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

Harbor的功能  

基于角色的访问控制:用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。

镜像复制:镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。

图形化用户界面:用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。

AD/LDAP:-Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。

审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。

国际化:已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。

RESTful API: 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。

部署简单:提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。

Harbor核心组件解释

Proxy:他是一个nginx的前端代理,代理Harbor的registry,UI, token等服务。

db:负责储存用户权限、审计日志、Dockerimage分组信息等数据。

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

jobsevice:jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log。

Adminserver:是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置。

Registry:镜像仓库,负责存储镜像文件。

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

Harbor和Registry的比较

Harbor和Registry都是Docker的镜像仓库,但是Harbor作为更多企业的选择,是因为相比较于Regisrty来说,它具有很多的优势。
   1.提供分层传输机制,优化网络传输
    Docker镜像是是分层的,而如果每次传输都使用全量文件(所以用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。
  2.提供WEB界面,优化用户体验
    只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登陆、搜索功能,包括区分公有、私有镜像。
  3.支持水平扩展集群
    当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解。
  4.良好的安全机制
    企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,具有更好的安全性。
  5.Harbor提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制。

              kubernetes中通过namespace来对资源进行隔离,在企业级应用场景中,通过将两者进行结合可以有效将kubernetes使用的镜像资源进行管理和访问控制,增强镜像使用的安全性。尤其是在多租户场景下,可以通过租户、namespace和项目相结合的方式来实现对多租户镜像资源的管理和访问控制。

dockers registry的缺点

缺少认证机制,任何人都可以随意拉取及上传镜像,安全性缺失

缺乏镜像清理机制,镜像可以push却不能删除,日积月累,占用空间会越来越大

缺乏相应的扩展机制

Docker compose

Harbor在物理机上部署是非常难的,而为了简化Harbor的应用,Harbor官方直接把Harbor做成了在容器中运行的应用,而且这个容器在Harbor中依赖类似redis、mysql、pgsql等很多存储系统,所以它需要编排很多容器协同起来工作,因此VMWare Harbor在部署和使用时,需要借助于Docker的单机编排工具(Docker compose)来实现。

Docker Compose官方文档: https://docs.docker.com/compose/

Harbor官方文档 :https://github.com/goharbor/harbor

安装Harbor

安装docker和dicker compose

//配置yum源
[root@ansible ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
[root@ansible ~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@ansible ~]# sed  -i 's#$releasever#8#g'  /etc/yum.repos.d/CentOS-Base.repo
[root@ansible ~]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
[root@ansible ~]# sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@ansible ~]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
[root@ansible ~]# sed  -i 's#$releasever#8#g'  /etc/yum.repos.d/epel.repo
//安装Openssl
[root@RedHat ~]# yum -y install openssl
[root@RedHat ~]# rpm -qa|grep openssl
openssl-libs-1.1.1-8.el8.x86_64
xmlsec1-openssl-1.2.25-4.el8.x86_64
openssl-1.1.1-8.el8.x86_64
openssl-pkcs11-0.4.8-2.el8.x86_64
//安装docker compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
 
//设置权限
sudo chmod +x /usr/local/bin/docker-compose
//harbor:版本为:harbor-offline-installer-v2.2.0.tgz
[root@RedHat ~]# yum -y install wget
[root@RedHat ~]# wget https://github.com/goharbor/harbor/releases/download/v2.2.0/harbor-offline-installer-v2.2.0.tgz

//解压,配置
[root@RedHat ~]# tar -xf ~/harbor-offline-installer-v2.2.0.tgz -C /usr/local/
[root@RedHat ~]# cd /usr/local/harbor/
[root@RedHat harbor]# ls
common.sh  harbor.v2.2.0.tar.gz  harbor.yml.tmpl  install.sh  LICENSE  prepare
[root@RedHat harbor]# cp harbor.yml.tmpl harbor.yml
//配置harbor.yml文件,把https注释掉
[root@RedHat harbor]# pwd
/usr/local/harbor
[root@RedHat harbor]# vim harbor.yml
hostname: 192.168.157.10     //修改这里

# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80

# https related config
#https:              //注释掉
  # https port for harbor, default is 443
  # port: 443     //注释掉
  # The path of cert and key files for nginx
  #certificate: /your/certificate/path     //注释掉
  #private_key: /your/private/key/path     //注释掉

# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: Harbor12345     //初始账号和密码:admin/Harbor12345
//执行安装脚本
[root@RedHat harbor]# ./install.sh----Harbor has been installed and started successfully.----

[root@RedHat harbor]# ss -antl
State        Recv-Q        Send-Q                Local Address:Port               Peer Address:Port       
LISTEN       0             128                         0.0.0.0:22                      0.0.0.0:*          
LISTEN       0             128                       127.0.0.1:1514                    0.0.0.0:*          
LISTEN       0             128                         0.0.0.0:80                      0.0.0.0:*          
LISTEN       0             128                            [::]:22                         [::]:*  

[root@RedHat harbor]# docker ps -a
CONTAINER ID   IMAGE                                COMMAND                  CREATED         STATUS                   PORTS                       NAMES
7fbddc7a4480   goharbor/nginx-photon:v2.2.0         "nginx -g 'daemon of…"   2 minutes ago   Up 2 minutes 
...

//使用docker-compose管理
[root@RedHat harbor]# ls
common     docker-compose.yml    harbor.yml       install.sh  prepare
common.sh  harbor.v2.2.0.tar.gz  harbor.yml.tmpl  LICENSE

[root@RedHat harbor]# docker-compose stop
Stopping nginx             ... done
Stopping harbor-jobservice ... done
Stopping harbor-core       ... done
Stopping harbor-portal     ... done
Stopping registry          ... done
Stopping registryctl       ... done
Stopping harbor-db         ... done
Stopping redis             ... done
Stopping harbor-log        ... done

[root@RedHat harbor]# docker-compose start
Starting log         ... done
Starting registry    ... done
Starting registryctl ... done
Starting postgresql  ... done
Starting portal      ... done
Starting redis       ... done
Starting core        ... done
Starting jobservice  ... done
Starting proxy       ... done

[root@RedHat harbor]# ss -antl
State        Recv-Q        Send-Q                Local Address:Port               Peer Address:Port       
LISTEN       0             128                         0.0.0.0:22                      0.0.0.0:*          
LISTEN       0             128                       127.0.0.1:1514                    0.0.0.0:*          
LISTEN       0             128                         0.0.0.0:80                      0.0.0.0:*          
LISTEN       0             128                            [::]:22                         [::]:*          

//需要写一个开启自动启动的脚本,否则重启不会启动
[root@RedHat harbor]# vim startall.sh

#!/bin/bash
cd /usr/local/harbor
docker-compose stop && docker-compose start

[root@RedHat harbor]# chmod +x startall.sh 
[root@RedHat harbor]# ll
-rwxr-xr-x. 1 root root        77 3月  10 06:03 startall.sh

#/etc/rc.local是系统启动后最后一个执行文件
[root@RedHat harbor]# ll /etc/rc.local 
lrwxrwxrwx. 1 root root 13 2月  26 2019 /etc/rc.local -> rc.d/rc.local
[root@RedHat harbor]# ll /etc/rc.d/rc.local 
-rw-r--r--. 1 root root 474 2月  26 2019 /etc/rc.d/rc.local

//给链接文件执行权限,写入启动执行脚本命令
[root@RedHat harbor]# chmod +x /etc/rc.d/rc.local 
[root@RedHat harbor]# vim /etc/rc.d/rc.local 
#!/bin/bash
/bin/bash /usr/local/harbor/startall.sh
//重启测试
[root@RedHat ~]# reboot

登录到Harbor

Harbor使用方法

系统管理——用户管理——创建用户

 

 项目——新建项目

 点击推送命令可以看帮助

 

 上传镜像

制作docker镜像,制作方法dockerfile的使用 

//制作镜像
[root@RedHat ~]# tree nginx/
nginx/
├── Dockerfile
└── nginx-1.19.7.tar.gz

0 directories, 2 files

[root@RedHat ~]# docker build -t nginx:v0.1 nginx/

[root@RedHat ~]# docker tag nginx:v0.1 192.168.157.10/txx/nginx:v0.1
[root@RedHat ~]# docker images
REPOSITORY                      TAG       IMAGE ID       CREATED          SIZE
192.168.157.10/txx/nginx        v0.1      ff5649acd9aa   13 minutes ago   390MB

//修改配置文件
[root@RedHat harbor]# vim /etc/docker/daemon.json 

{
   "insecure-registries": ["192.168.157.10"],
   "registry-mirrors": ["https://i4lro4s7.mirror.aliyuncs.com"]
}

[root@RedHat ~]# systemctl daemon-reload
[root@RedHat ~]# systemctl restart docker
[root@RedHat ~]# cd /usr/local/harbor/
[root@RedHat harbor]# ./startall.sh 
//登录到仓库
[root@RedHat harbor]# docker login 192.168.157.10
Username: txx
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

//上传镜像
[root@RedHat harbor]# docker push 192.168.157.10/txx/nginx:v0.1
[root@RedHat ~]# docker push 192.168.157.10/txx/nginx:v0.1
The push refers to repository [192.168.157.10/txx/nginx]
3db405f816af: Pushed 
f5e05e4d7a26: Pushed 
53f532a8efbb: Pushed 
24438786444d: Pushed 
c483c09b3d02: Pushed 
2653d992f4ef: Pushed 
v0.1: digest: sha256:48c5882df6bbd2786bd127d6a9249e21b8455b499c7ae05ee1adfd451a4bd988

 拉取镜像

//删除创建的镜像
[root@RedHat ~]# docker rmi 192.168.157.10/txx/nginx:v0.1
Untagged: 192.168.157.10/txx/nginx:v0.1
Untagged: 192.168.157.10/txx/nginx@sha256:48c5882df6bbd2786bd127d6a9249e21b8455b499c7ae05ee1adfd451a4bd98

//拉取
[root@RedHat ~]# docker pull 192.168.157.10/txx/nginx:v0.1
v0.1: Pulling from txx/nginx
Digest: sha256:48c5882df6bbd2786bd127d6a9249e21b8455b499c7ae05ee1adfd451a4bd988
Status: Downloaded newer image for 192.168.157.10/txx/nginx:v0.1
192.168.157.10/txx/nginx:v0.1

//查看
[root@RedHat ~]# docker images
REPOSITORY                      TAG       IMAGE ID       CREATED          SIZE
192.168.157.10/txx/nginx        v0.1      ff5649acd9aa   44 minutes ago   390MB

我这里用的是centos的镜像做的容器,如果你想让他的容量小一点请使用以下代码制作容器:

[root@RedHat ~]# cat thl_apache/Dockerfile 
FROM alpine

LABEL MAINTAINER tanghaolun_xxx@xxx.com

ENV httpd_v=2.4.46  apr_v=1.7.0 apr_u_v=1.6.1

ADD apr-1.7.0.tar.bz2 apr-util-1.6.1.tar.gz httpd-2.4.46.tar.bz2 /usr/local/src/

RUN echo 'https://mirrors.ustc.edu.cn/alpine/v3.12/main/' > /etc/apk/repositories && 
    echo 'https://mirrors.ustc.edu.cn/alpine/v3.12/community/' >> /etc/apk/repositories && 
    adduser -SHs /sbin/nologin apache && 
    apk update && 
    apk add --no-cache make gcc g++ openssl-dev pcre-dev expat-dev libtool && 
    cd /usr/local/src/apr-${apr_v} && 
    ./configure --prefix=/usr/local/apr && 
    make && make install && 
    cd /usr/local/src/apr-util-${apr_u_v} && 
    ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && 
    make && make install && 
    cd /usr/local/src/httpd-${httpd_v} && 
    ./configure --prefix=/usr/local/apache 
    --sysconfdir=/etc/httpd24 
    --enable-so 
    --enable-ssl 
    --enable-cgi 
    --enable-rewrite 
    --with-zlib 
    --with-pcre 
    --with-apr=/usr/local/apr 
    --with-apr-util=/usr/local/apr-util/ 
    --enable-modules=most 
    --enable-mpms-shared=all 
    --with-mpm=prefork && 
    make && make install && 
    sed -i '/^#ServerName/s/#//g' /etc/httpd24/httpd.conf && 
    ln -s /usr/local/apache/bin/* /usr/sbin/ && 
    rm -rf /usr/local/src/* && 
    rm -rf /usr/src/* /var/cache/* && 
    apk del gcc g++ make

EXPOSE 80 443

CMD /usr/sbin/apachectl -DFOREGROUND
原文地址:https://www.cnblogs.com/lichouluoyu/p/14508674.html