Harbor是由 VMWare 公司开源的容器镜像仓库。Harbor功能包括:

  • 镜像仓库权限控制
  • 镜像远程同步复制
  • 大规模镜像发布
  • 镜像删除和空间回收

一、依赖环境安装

这里以centos7为例,依赖docker-ce、docker-compose(rust开发)工具,同时Harbor会对两者的版本有一些要求,这里为了便于安装,使用了docker-ce和epel源,方便直接安装好环境 。

1、docker-ce安装

1step 1:安装一些必要的系统工具
2yum install -y yum-utils device-mapper-persistent-data lvm2
3Step 2:添加docker镜像源
4yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5Step 3: 安装 Docker-CE
6yum -y install docker-ce
7Step 4: 开启Docker服务
8systemctl start docker.server
9systemctl enable docker.server

官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。特点版本的安装方式如下:

1Step 1: 查找Docker-CE的版本:
2 yum list docker-ce.x86_64 --showduplicates | sort -r
3Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)
4 yum -y install docker-ce-[VERSION]

2、docker-compose安装

docker-compose的安装方式有两种,一种是从github上下载已经编译好的二进制包,一种是通过epel源,直接通过yum的方式安装

1方法一:
2curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
3chmod +x /usr/local/bin/docker-compose
4#查看版本
5docker-compose version
6方法二:
7wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
8yum -y install docker-compose

二、Harbor安装

1、修改配置

Harbor的安装分为离线安装和在线安装,这里建议使用离线安装方式,因为默认拉镜外镜像速度太慢了。下载地址https://github.com/goharbor/harbor/releases ,将offline包解压后,放到/opt/harbor 目录,修改harbor.yml.tmpl文件,这里给出部分配置:

 1hostname: 192.168.159.132
 2http:
 3  port: 80
 4https:
 5  port: 443
 6  certificate: /data/cert/192.168.159.132.crt
 7  private_key: /data/cert/192.168.159.132.key
 8harbor_admin_password: Harbor12345
 9database:
10  password: root123
11  max_idle_conns: 50
12  max_open_conns: 1000
13data_volume: /data

比较关键的配置是hostname,建议使用域名方式,这里只是测试使用了IP地址,选择IP和域名后面生成key的步骤会有一些小的区别。再有就是数据存方目录和证书文件存方目录。

2、证书生成

证书生成可以使用openssl ,也可以使用cfssl 工具进行生成,这里以官方方法,使用openssl ,如下:

 1生成CA证书私钥
 2openssl genrsa -out ca.key 4096
 3生成CA证书
 4openssl req -sha512 -new \
 5    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.159.132" \
 6    -key 192.168.159.132.key \
 7    -out 192.168.159.132.csr
 8生成服务器私钥
 9openssl genrsa -out 192.168.159.132.key 4096
10生成服务端CA证书
11openssl req -x509 -new -nodes -sha512 -days 3650 \
12 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.159.132" \
13 -key ca.key \
14 -out ca.crt
15生成x509 v3 扩展文件
16cat > v3.ext 
17
18    这里步骤比较繁琐,如果使用域名,将上面的IP地址修改成域名就可以了,不过生成v3.ext这一步需要注意,如果是域名的话,对应的命令会是如下:
19
20
21```bash
22openssl x509 -req -sha512 -days 3650 \
23    -extfile v3.ext \
24    -CA ca.crt -CAkey ca.key -CAcreateserial \
25    -in yourdomain.com.csr \
26    -out yourdomain.com.crt

3、完成harbor的安装

进入解压的/opt/harbor目录,使用prepare进行环境检查(此步也可以跳过),使用install.sh文件运行安装,在离线安装下docker自动load harbor压缩包里的image镜像,如果是在线安装,这里会等待比较长时间会下载相关镜像。安装完成后,可以通过docker ps 或docker-compose ps查看已经启动的镜像信息。

 1[root@localhost harbor]# docker-compose ps
 2      Name                     Command               State                      Ports
 3--------------------------------------------------------------------------------------------------------
 4harbor-core         /harbor/entrypoint.sh            Up
 5harbor-db           /docker-entrypoint.sh            Up
 6harbor-jobservice   /harbor/entrypoint.sh            Up
 7harbor-log          /bin/sh -c /usr/local/bin/ ...   Up      127.0.0.1:1514->10514/tcp
 8harbor-portal       nginx -g daemon off;             Up
 9nginx               nginx -g daemon off;             Up      0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp
10redis               redis-server /etc/redis.conf     Up
11registry            /home/harbor/entrypoint.sh       Up
12registryctl         /home/harbor/start.sh            Up 

此时在目录下也会生成docker-compose.yml文件,通过docker-compose可以很方便的进行服务启停,指令如下:

docker-compose down -v 或 docker-compose stop //区别,前者会remove掉容器、image、网络,停的更干净,后者只是停服务
docker-compose up -d

4、配置项目仓库

打开 https://192.168.159.132/ 登录,默认用户名密码 admin / Harbor12345 (在配置文件中修改过的,使用修改后的密码),登录后创建test项目仓库。

三、镜像推拉测试

使用docker login 192.168.159.132登录,使用的登录用户名密码是之前配置的用户名密码信息,如果已经登录过的,会在/root/.docker/config.json文件中记录,如下:

1[root@localhost ~]# more /root/.docker/config.json
2{
3        "auths": {
4                "192.168.159.132": {
5                        "auth": "YWRtaW46SGFyYm9yMTIzNDU="
6                }
7        }
8}

直接base64可以解密出信息。

使用docker pull hello-world可以多外部源拉一个测试镜像到本地,并重新打tag到harbor仓库,后面就可以从该仓库拉文件了。

 1远端拉镜像
 2[root@localhost ~]# docker pull hello-world
 3Using default tag: latest
 4latest: Pulling from library/hello-world
 5Digest: sha256:95ddb6c31407e84e91a986b004aee40975cb0bda14b5949f6faac5d2deadb4b9
 6Status: Image is up to date for hello-world:latest
 7docker.io/library/hello-world:latest
 8重新打标签
 9[root@localhost ~]# docker tag hello-world 192.168.159.132/361way/hello-world:latest
10[root@localhost ~]# docker image ls|grep hello-world
11hello-world                          latest    bf756fb1ae65   13 months ago   13.3kB
12192.168.159.132/361way/hello-world   latest    bf756fb1ae65   13 months ago   13.3kB
13push到仓库
14[root@localhost ~]# docker push 192.168.159.132/361way/hello-world:latest
15The push refers to repository [192.168.159.132/361way/hello-world]
169c27e219663c: Layer already exists
17latest: digest: sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042 size: 525

完成后,可以测试从仓库里拉镜像测试

 1[root@localhost ~]# docker rmi bf756fb1ae65 -f
 2Untagged: 192.168.159.132/361way/hello-world:latest
 3Untagged: 192.168.159.132/361way/hello-world@sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042
 4Untagged: 192.168.159.132/test/hello-world:latest
 5Untagged: 192.168.159.132/test/hello-world@sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042
 6Untagged: hello-world:latest
 7Untagged: hello-world@sha256:95ddb6c31407e84e91a986b004aee40975cb0bda14b5949f6faac5d2deadb4b9
 8Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
 9[root@localhost ~]# docker run 192.168.159.132/361way/hello-world:latest
10[root@localhost ~]# docker image ls |grep hello-world
11192.168.159.132/361way/hello-world   latest    bf756fb1ae65   13 months ago   13.3kB

四、安装中的问题

在key文件配置不当的时候,会遇到如下错误:

1File "/usr/lib/python3.6/shutil.py", line 263, in copy2
2    copyfile(src, dst, follow_symlinks=follow_symlinks)
3  File "/usr/lib/python3.6/shutil.py", line 120, in copyfile
4    with open(src, 'rb') as fsrc:
5IsADirectoryError: [Errno 21] Is a directory: '/hostfs/data/cert'

解决方法就是把key文件重新配置即可。当然还会遇到其他问题,可以参考:https://goharbor.io/docs/2.1.0/install-config/troubleshoot-installation/