title: 部署harbor 1.10 #标题tags: harbor #标签
date: 2021-01-01
categories: docker # 分类

需求:单机部署harbor仓库供k8s集群使用。

没有废话,直接开整。

参考harbor 1.10官方文档

先决条件

harbor官方建议CPU不小于2个,推荐4个,内存最小4G,推荐8G,磁盘最小40G,

docker engine须在17.06及以上,docker-compopse指令须在1.18.0及以上,openssl最好是最新的,用于生成harbor的证书和密钥。

所需网络端口:

  • 443:https,用于接受https请求,可以在配置文件中更改此端口。
  • 4443:与harbor的docker内容信任服务的连接,仅在启用公证人的情况下才需要。
  • 80:http访问。

开整。。。

安装docker 18.06

  1. # 卸载旧版本docker
  2. $ yum remove -y docker \
  3. docker-client \
  4. docker-client-latest \
  5. docker-ce-cli \
  6. docker-common \
  7. docker-latest \
  8. docker-latest-logrotate \
  9. docker-logrotate \
  10. docker-selinux \
  11. docker-engine-selinux \
  12. docker-engine
  13. # 设置 yum repository
  14. $ yum install -y yum-utils \
  15. device-mapper-persistent-data \
  16. lvm2
  17. yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  18. # 安装 docker
  19. $ yum -y install docker-ce-18.06.0.ce-3.el7
  20. # 修改 docker 镜像下载源
  21. $ [ -d /etc/docker ] || mkdir /etc/docker
  22. echo "{\"registry-mirrors\": [\"https://registry.cn-hangzhou.aliyuncs.com\"]}" >> /etc/docker/daemon.json
  23. # 修改docker的根目录
  24. $ mkdir -p /etc/systemd/system/docker.service.d
  25. $ cat > /etc/systemd/system/docker.service.d/devicemapper.conf << EOF
  26. [Service]
  27. ExecStart=
  28. ExecStart=/usr/bin/dockerd --graph=/data/lib/docker
  29. EOF
  30. # 启动docker
  31. $ systemctl enable docker && systemctl start docker
  32. # 确认 docker 版本及镜像下载地址
  33. $ docker version
  34. $ docker info | grep -A1 'Registry Mirrors:'
  35. Registry Mirrors:
  36. https://registry.cn-hangzhou.aliyuncs.com/

安装docker-compose指令

可以从github下载最新版本指令,由于国外下载较慢,所以这里从道云下载。

  1. [root@harbor ~]# yum -y install yum-utils device-mapper-persistent-data lvm2 # 安装依赖
  2. # 下载指令到指定位置
  3. [root@harbor ~]# curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  4. # 添加执行权限并确认版本
  5. [root@harbor ~]# chmod +x /usr/local/bin/docker-compose
  6. [root@harbor ~]# docker-compose -v
  7. docker-compose version 1.25.1, build a82fef07

下载harbor源码包并解压

  1. [root@harbor ~]# wget https://github.com/goharbor/harbor/releases/download/v1.10.2/harbor-offline-installer-v1.10.2.tgz
  2. [root@harbor src]# tar zxf harbor-offline-installer-v1.10.2.tgz -C /usr/local/

生成ssl证书

生成ssl证书的方式有很多,这里我选择使用github上的一个项目生成ssl证书,比较简单。

  1. [root@harbor src]# cd /usr/local/harbor/ # 到harbor的根目录
  2. [root@harbor harbor]# git clone https://github.com/MrLichangming/ssl.git
  3. [root@harbor harbor]# cd ssl/
  4. [root@harbor ssl]# ./gen.cert.sh ljz.hub.com # 执行脚本gen.cer.sh,后面跟的ljz.hub.com是我为harbor定义的域名
  5. # 当脚本执行成功后,会在当前目录下生成一个out目录,如下:
  6. [root@harbor ssl]# ls out/ # 目录下有很多文件,但我们只需要三个
  7. cert.key.pem index.txt.attr.old newcerts serial
  8. index.txt index.txt.old root.crt serial.old
  9. index.txt.attr ljz.hub.com root.key.pem
  10. # 将所需证书文件copy走,注意cp命令不要使用任何选项,否则可能会错误
  11. [root@harbor ssl]# mkdir -pv /data/harbor/cert # 创建证书存放目录
  12. [root@harbor ssl]# cp out/ljz.hub.com/ljz.hub.com.key.pem /data/harbor/cert/ # 公钥文件,客户端登录到此harbor仓库的话,需要有该文件
  13. [root@harbor ssl]# cp out/ljz.hub.com/ljz.hub.com.bundle.crt /data/harbor/cert/ # 私钥文件,存放在harbor服务器上
  14. [root@harbor ssl]# cp out/ljz.hub.com/root.crt /data/harbor/cert/ # 此文件在harbor服务器上不用,用于导入client访问所使用的浏览器,防止客户在访问时提示https链接不安全
  15. [root@harbor ssl]# cd .. # 返回到harbor根目录

修改harbor配置文件

  1. [root@harbor harbor]# egrep -v '[#;]|^$' harbor.yml # 修改后的配置文件如下(只需要注意有注释的配置项,其他保持默认即可)
  2. hostname: ljz.hub.com # 指定harbor的域名,必须和上面生成证书时指定的域名一致
  3. # 下面是定义http及https的监听端口,可根据需求去改
  4. http:
  5. port: 80
  6. https:
  7. port: 443
  8. # 下面是指定证书的存放路径
  9. certificate: /data/harbor/cert/ljz.hub.com.bundle.crt
  10. private_key: /data/harbor/cert/ljz.hub.com.key.pem
  11. harbor_admin_password: Harbor12345 # harbor的默认管理员admin的密码
  12. database:
  13. password: pwd@123 # 定义harbor内部所用的postgresql数据库密码,生产环境建议更改默认密码
  14. max_idle_conns: 50
  15. max_open_conns: 100
  16. data_volume: /data/harbor # harbor的数据存放目录
  17. clair:
  18. updaters_interval: 12
  19. jobservice:
  20. max_job_workers: 10
  21. notification:
  22. webhook_job_max_retry: 10
  23. chart:
  24. absolute_url: disabled
  25. log:
  26. level: info
  27. local:
  28. rotate_count: 50
  29. rotate_size: 200M
  30. location: /data/harbor/log # harbor的日志存放路径
  31. _version: 1.10.0
  32. proxy:
  33. http_proxy:
  34. https_proxy:
  35. no_proxy:
  36. components:
  37. - core
  38. - jobservice
  39. - clair

启动harbor服务

  1. [root@harbor harbor]# ./install.sh # 运行安装脚本

最后脚本运行结果如下,则表示harbor现在已正常启动,如下:

部署harbor 1.10 - 图1

注:在执行成功安装脚本后,会在当前目录生成一个文件,如下:

  1. [root@harbor harbor]# ll docker-compose.yml
  2. -rw-r--r-- 1 root root 5488 4 18 21:25 docker-compose.yml

填坑

可能你harbor离线包是很长时间之前下载的,故在执行./install.sh 时,会报错如下:

部署harbor 1.10 - 图2

我们需要关注的就是这条报错,大概意思就是初始化日志驱动程序失败,现在就来看这个问题是怎么回事:

  1. ERROR: for registryctl Cannot start service registryctl: failed to initialize logging driver: dial tcp 127.0.0.1:1514: connect: connection refused
  2. Creating registry ... error

查看日志驱动程序的日志
  1. $ docker ps -a | grep harbor-log | awk '{print $1}' | xargs docker logs
  2. sudo: Account or password is expired, reset your password and try again
  3. sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
  4. sudo: unable to change expired password: Authentication token manipulation error
  5. Changing password for root.
  6. sudo: Account or password is expired, reset your password and try again
  7. Changing password for root.
  8. sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
  9. sudo: unable to change expired password: Authentication token manipulation error
  10. sudo: Account or password is expired, reset your password and try again
  11. Changing password for root.
  12. # ........... 省略部分输出

解决报错
  1. # 获取log容器id
  2. $ harbor_log_id=$(docker ps -a | grep harbor-log | awk '{print $1}')
  3. # 拷贝容器内的shadow文件到本地
  4. $ docker cp ${harbor_log_id}:/etc/shadow /usr/local/harbor/
  5. # 修改密码过期为永不过期
  6. $ sed -i 's/:90:/:99999:/g' /usr/local/harbor/shadow
  7. # 将修改后的文件挂载到容器
  8. $ cd /usr/local/harbor/
  9. $ vim docker-compose.yml # log 服务下增加如下挂载
  10. - type: bind
  11. source: /usr/local/harbor/shadow
  12. target: /etc/shadow

具体增加到如下位置:

部署harbor 1.10 - 图3

  1. # 重启所有容器
  2. $ docker-compose down
  3. $ docker-compose up -d # 输出如下,重启成功
  4. Creating harbor-log ... done
  5. Creating registry ... done
  6. Creating harbor-db ... done
  7. Creating harbor-portal ... done
  8. Creating redis ... done
  9. Creating registryctl ... done
  10. Creating harbor-core ... done
  11. Creating harbor-jobservice ... done
  12. Creating nginx ... done

当harbor正常运行后,若需要修改其一些配置文件内容,可以修改此docker-compose.yml文件,然后使用如下指令进行停止或启动harbor(当然,这样比较麻烦,所以并不推荐这做)。

  1. [root@harbor harbor]# docker-compose down # 停止harbor仓库
  2. Stopping nginx ... done
  3. Stopping harbor-jobservice ... done
  4. Stopping harbor-core ... done
  5. Stopping redis ... done
  6. Stopping harbor-portal ... done
  7. Stopping registry ... done
  8. Stopping registryctl ... done
  9. Stopping harbor-db ... done
  10. Stopping harbor-log ... done
  11. Removing nginx ... done
  12. Removing harbor-jobservice ... done
  13. Removing harbor-core ... done
  14. Removing redis ... done
  15. Removing harbor-portal ... done
  16. Removing registry ... done
  17. Removing registryctl ... done
  18. Removing harbor-db ... done
  19. Removing harbor-log ... done
  20. Removing network harbor_harbor
  21. [root@harbor harbor]# docker-compose up -d # 启动harbor仓库
  22. Creating network "harbor_harbor" with the default driver
  23. Creating harbor-log ... done
  24. Creating registry ... done
  25. Creating registryctl ... done
  26. Creating redis ... done
  27. Creating harbor-db ... done
  28. Creating harbor-portal ... done
  29. Creating harbor-core ... done
  30. Creating nginx ... done
  31. Creating harbor-jobservice ... done

比较推荐的是直接修改harbor.yml文件,然后执行prepare指令(该指令并不会删除harbor仓库现有的数据)进行清除缓存并重新生成,具体过程可以参考官方文档

web浏览器访问

访问harbor地址,自动以https方式访问。输入admin及配置文件定义的密码进行登录即可。

部署harbor 1.10 - 图4

关于harbor的操作规范,我们公司是新建两个用户,分别是developer和guest,前者能pull和push镜像,后者只能pull镜像(这两个用户需要添加到项目中,才可以使用)。

关于如何在harbor的web界面添加用户和项目,这里不作演示,自己琢磨吧,现在尝试着往harbor上推送一个镜像。

client端登录到harbor仓库

  1. [root@node01 ~]# echo "192.168.20.6 ljz.hub.com" >> /etc/hosts # 配置主机记录
  2. [root@node01 ~]# mkdir -pv /etc/docker/certs.d/ljz.hub.com/ # 创建目录,用户存放证书,目录名最好以harbor的域名来定义
  3. # 同步公钥文件
  4. [root@node01 ~]# rsync -avz root@ljz.hub.com:/data/harbor/cert/ljz.hub.com.bundle.crt /etc/docker/certs.d/ljz.hub.com/
  5. [root@node01 ~]# ll /etc/docker/certs.d/ljz.hub.com/ljz.hub.com.bundle.crt # 确认公钥文件已同步过来
  6. -rw-r--r-- 1 root root 2855 4 18 21:03 /etc/docker/certs.d/ljz.hub.com/ljz.hub.com.bundle.crt
  7. # 重启docker,以便生效
  8. [root@node01 ~]# systemctl daemon-reload
  9. [root@node01 ~]# systemctl restart docker
  10. [root@node01 ~]# docker login -u admin ljz.hub.com
  11. Password:
  12. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. # 认证文件将保存在/root/.docker/config.json
  13. Configure a credential helper to remove this warning. See
  14. https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  15. Login Succeeded # 登录成功

client推送镜像到harbor仓库

  1. # 注意,想要推送到harbor仓库,镜像的命名是有规范的,如下(不解释,自己看吧)
  2. [root@node01 ~]# docker tag busybox:latest ljz.hub.com/apps/busybox:ljz
  3. [root@node01 ~]# docker push ljz.hub.com/apps/busybox:ljz

harbor的web界面查看推送的镜像如下:

部署harbor 1.10 - 图5

写在结尾

若多台docker主机都需要从该harbor上push或pull镜像,那么只需要将上面客户端的/etc/docker/certs.d/ljz.hub.com/ljz.hub.com.bundle.crt文件和/root/.docker/config.json复制过来(目录要一致),即可登录到harbor仓库。