title: 部署harbor 1.10 #标题tags: harbor #标签
date: 2021-01-01
categories: docker # 分类
需求:单机部署harbor仓库供k8s集群使用。
没有废话,直接开整。
先决条件
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
# 卸载旧版本docker
$ yum remove -y docker \
docker-client \
docker-client-latest \
docker-ce-cli \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
# 设置 yum repository
$ yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 docker
$ yum -y install docker-ce-18.06.0.ce-3.el7
# 修改 docker 镜像下载源
$ [ -d /etc/docker ] || mkdir /etc/docker
echo "{\"registry-mirrors\": [\"https://registry.cn-hangzhou.aliyuncs.com\"]}" >> /etc/docker/daemon.json
# 修改docker的根目录
$ mkdir -p /etc/systemd/system/docker.service.d
$ cat > /etc/systemd/system/docker.service.d/devicemapper.conf << EOF
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --graph=/data/lib/docker
EOF
# 启动docker
$ systemctl enable docker && systemctl start docker
# 确认 docker 版本及镜像下载地址
$ docker version
$ docker info | grep -A1 'Registry Mirrors:'
Registry Mirrors:
https://registry.cn-hangzhou.aliyuncs.com/
安装docker-compose指令
可以从github下载最新版本指令,由于国外下载较慢,所以这里从道云下载。
[root@harbor ~]# yum -y install yum-utils device-mapper-persistent-data lvm2 # 安装依赖
# 下载指令到指定位置
[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
# 添加执行权限并确认版本
[root@harbor ~]# chmod +x /usr/local/bin/docker-compose
[root@harbor ~]# docker-compose -v
docker-compose version 1.25.1, build a82fef07
下载harbor源码包并解压
[root@harbor ~]# wget https://github.com/goharbor/harbor/releases/download/v1.10.2/harbor-offline-installer-v1.10.2.tgz
[root@harbor src]# tar zxf harbor-offline-installer-v1.10.2.tgz -C /usr/local/
生成ssl证书
生成ssl证书的方式有很多,这里我选择使用github上的一个项目生成ssl证书,比较简单。
[root@harbor src]# cd /usr/local/harbor/ # 到harbor的根目录
[root@harbor harbor]# git clone https://github.com/MrLichangming/ssl.git
[root@harbor harbor]# cd ssl/
[root@harbor ssl]# ./gen.cert.sh ljz.hub.com # 执行脚本gen.cer.sh,后面跟的ljz.hub.com是我为harbor定义的域名
# 当脚本执行成功后,会在当前目录下生成一个out目录,如下:
[root@harbor ssl]# ls out/ # 目录下有很多文件,但我们只需要三个
cert.key.pem index.txt.attr.old newcerts serial
index.txt index.txt.old root.crt serial.old
index.txt.attr ljz.hub.com root.key.pem
# 将所需证书文件copy走,注意cp命令不要使用任何选项,否则可能会错误
[root@harbor ssl]# mkdir -pv /data/harbor/cert # 创建证书存放目录
[root@harbor ssl]# cp out/ljz.hub.com/ljz.hub.com.key.pem /data/harbor/cert/ # 公钥文件,客户端登录到此harbor仓库的话,需要有该文件
[root@harbor ssl]# cp out/ljz.hub.com/ljz.hub.com.bundle.crt /data/harbor/cert/ # 私钥文件,存放在harbor服务器上
[root@harbor ssl]# cp out/ljz.hub.com/root.crt /data/harbor/cert/ # 此文件在harbor服务器上不用,用于导入client访问所使用的浏览器,防止客户在访问时提示https链接不安全
[root@harbor ssl]# cd .. # 返回到harbor根目录
修改harbor配置文件
[root@harbor harbor]# egrep -v '[#;]|^$' harbor.yml # 修改后的配置文件如下(只需要注意有注释的配置项,其他保持默认即可)
hostname: ljz.hub.com # 指定harbor的域名,必须和上面生成证书时指定的域名一致
# 下面是定义http及https的监听端口,可根据需求去改
http:
port: 80
https:
port: 443
# 下面是指定证书的存放路径
certificate: /data/harbor/cert/ljz.hub.com.bundle.crt
private_key: /data/harbor/cert/ljz.hub.com.key.pem
harbor_admin_password: Harbor12345 # harbor的默认管理员admin的密码
database:
password: pwd@123 # 定义harbor内部所用的postgresql数据库密码,生产环境建议更改默认密码
max_idle_conns: 50
max_open_conns: 100
data_volume: /data/harbor # harbor的数据存放目录
clair:
updaters_interval: 12
jobservice:
max_job_workers: 10
notification:
webhook_job_max_retry: 10
chart:
absolute_url: disabled
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /data/harbor/log # harbor的日志存放路径
_version: 1.10.0
proxy:
http_proxy:
https_proxy:
no_proxy:
components:
- core
- jobservice
- clair
启动harbor服务
[root@harbor harbor]# ./install.sh # 运行安装脚本
最后脚本运行结果如下,则表示harbor现在已正常启动,如下:
注:在执行成功安装脚本后,会在当前目录生成一个文件,如下:
[root@harbor harbor]# ll docker-compose.yml
-rw-r--r-- 1 root root 5488 4月 18 21:25 docker-compose.yml
填坑
可能你harbor离线包是很长时间之前下载的,故在执行./install.sh
时,会报错如下:
我们需要关注的就是这条报错,大概意思就是初始化日志驱动程序失败,现在就来看这个问题是怎么回事:
ERROR: for registryctl Cannot start service registryctl: failed to initialize logging driver: dial tcp 127.0.0.1:1514: connect: connection refused
Creating registry ... error
查看日志驱动程序的日志
$ docker ps -a | grep harbor-log | awk '{print $1}' | xargs docker logs
sudo: Account or password is expired, reset your password and try again
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
sudo: unable to change expired password: Authentication token manipulation error
Changing password for root.
sudo: Account or password is expired, reset your password and try again
Changing password for root.
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
sudo: unable to change expired password: Authentication token manipulation error
sudo: Account or password is expired, reset your password and try again
Changing password for root.
# ........... 省略部分输出
解决报错
# 获取log容器id
$ harbor_log_id=$(docker ps -a | grep harbor-log | awk '{print $1}')
# 拷贝容器内的shadow文件到本地
$ docker cp ${harbor_log_id}:/etc/shadow /usr/local/harbor/
# 修改密码过期为永不过期
$ sed -i 's/:90:/:99999:/g' /usr/local/harbor/shadow
# 将修改后的文件挂载到容器
$ cd /usr/local/harbor/
$ vim docker-compose.yml # log 服务下增加如下挂载
- type: bind
source: /usr/local/harbor/shadow
target: /etc/shadow
具体增加到如下位置:
# 重启所有容器
$ docker-compose down
$ docker-compose up -d # 输出如下,重启成功
Creating harbor-log ... done
Creating registry ... done
Creating harbor-db ... done
Creating harbor-portal ... done
Creating redis ... done
Creating registryctl ... done
Creating harbor-core ... done
Creating harbor-jobservice ... done
Creating nginx ... done
当harbor正常运行后,若需要修改其一些配置文件内容,可以修改此docker-compose.yml文件,然后使用如下指令进行停止或启动harbor(当然,这样比较麻烦,所以并不推荐这做)。
[root@harbor harbor]# docker-compose down # 停止harbor仓库
Stopping nginx ... done
Stopping harbor-jobservice ... done
Stopping harbor-core ... done
Stopping redis ... done
Stopping harbor-portal ... done
Stopping registry ... done
Stopping registryctl ... done
Stopping harbor-db ... done
Stopping harbor-log ... done
Removing nginx ... done
Removing harbor-jobservice ... done
Removing harbor-core ... done
Removing redis ... done
Removing harbor-portal ... done
Removing registry ... done
Removing registryctl ... done
Removing harbor-db ... done
Removing harbor-log ... done
Removing network harbor_harbor
[root@harbor harbor]# docker-compose up -d # 启动harbor仓库
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating registry ... done
Creating registryctl ... done
Creating redis ... done
Creating harbor-db ... done
Creating harbor-portal ... done
Creating harbor-core ... done
Creating nginx ... done
Creating harbor-jobservice ... done
比较推荐的是直接修改harbor.yml
文件,然后执行prepare
指令(该指令并不会删除harbor仓库现有的数据)进行清除缓存并重新生成,具体过程可以参考官方文档。
web浏览器访问
访问harbor地址,自动以https方式访问。输入admin及配置文件定义的密码进行登录即可。
关于harbor的操作规范,我们公司是新建两个用户,分别是developer和guest,前者能pull和push镜像,后者只能pull镜像(这两个用户需要添加到项目中,才可以使用)。
关于如何在harbor的web界面添加用户和项目,这里不作演示,自己琢磨吧,现在尝试着往harbor上推送一个镜像。
client端登录到harbor仓库
[root@node01 ~]# echo "192.168.20.6 ljz.hub.com" >> /etc/hosts # 配置主机记录
[root@node01 ~]# mkdir -pv /etc/docker/certs.d/ljz.hub.com/ # 创建目录,用户存放证书,目录名最好以harbor的域名来定义
# 同步公钥文件
[root@node01 ~]# rsync -avz root@ljz.hub.com:/data/harbor/cert/ljz.hub.com.bundle.crt /etc/docker/certs.d/ljz.hub.com/
[root@node01 ~]# ll /etc/docker/certs.d/ljz.hub.com/ljz.hub.com.bundle.crt # 确认公钥文件已同步过来
-rw-r--r-- 1 root root 2855 4月 18 21:03 /etc/docker/certs.d/ljz.hub.com/ljz.hub.com.bundle.crt
# 重启docker,以便生效
[root@node01 ~]# systemctl daemon-reload
[root@node01 ~]# systemctl restart docker
[root@node01 ~]# docker login -u admin ljz.hub.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json. # 认证文件将保存在/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 # 登录成功
client推送镜像到harbor仓库
# 注意,想要推送到harbor仓库,镜像的命名是有规范的,如下(不解释,自己看吧)
[root@node01 ~]# docker tag busybox:latest ljz.hub.com/apps/busybox:ljz
[root@node01 ~]# docker push ljz.hub.com/apps/busybox:ljz
harbor的web界面查看推送的镜像如下:
写在结尾
若多台docker主机都需要从该harbor上push或pull镜像,那么只需要将上面客户端的/etc/docker/certs.d/ljz.hub.com/ljz.hub.com.bundle.crt
文件和/root/.docker/config.json
复制过来(目录要一致),即可登录到harbor仓库。