DevOps系列:HARBOR私有镜像仓库搭建
前言:
HARBOR,即基于WEB界面的可视化DOCKER私有镜像仓库服务。这实际上与DevOps没太大直接关系,之所以说是DevOps系列,是因为HARBOR的更高层次应用方向便是DevOps方向了。实际上,DevOps是一整套的系统,是各种服务的组合,可以包括的服务,要视整个系统的需求而定,此处不作更多的说明。
一、硬件与软件环境
本教程在以下环境下搭建测试通过!
-
硬件 :VMWARE虚拟机
-
操作系统 :DEBIAN 10
-
HARBOR版本 :harbor.v1.10.1
-
DOCKER版本 :19.03.6
-
DOCKER-COMPOSE版本:1.25.4
-
代码测试日期:2020年03月10日
二、DOCKER环境构建
对于DOCKER环境的构建,博主一直是推荐从官方页面获取安装方法的[官方地址];最主要的原因是,你无法确定官方会不会在某次更新后,其安装方法发生了改变,造成那些在网络上泛滥的"docker-ce"安装代码失效。当然这里说的是方法,国内用户还是需要必要的变通的,比如说使用国内的镜像源,否则,这繁忙的国际网络,会让DOCKER环境的构建成为一件痛苦的事。下面是在DEBIAN系统上安装DOCKER环境的示例,使用了国内的源,博主并不能保证其不会失效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
apt-get update apt-get install apt-transport-https ca-certificates \ curl gnupg2 software-properties-common -y # 安装DOCKER-CE程序的依赖; curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | apt-key add - # 添加GPG密钥[阿里云]; add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/debian \ $(lsb_release -cs) stable" # 增加DOCKER-CE软件源[阿里云]:这将在[ /etc/apt/sources.list ]文件中新增加源信息; apt-get update apt-get install docker-ce docker-ce-cli containerd.io -y # 安装DOCKER-CE程序的相关程序[至此DOCKER-CE已经安装完成]; docker --version # 验证DOCKER-CE是否安装成功[成功将输出DOCKER-CE的版本信息]; curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` \ -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose # 安装“docker-compose”;此为容器编排工具,方便多个容器的运行管理; # 实际上,HARBOR是由多个由不同镜像运行后的容器所组成的一组服务,所以需要本工具; # “docker-compose”与“docker-ce”有兼容性要求,详见以下官方网址说明; # 注:“docker-compose”的GITHUB地址[https://github.com/docker/compose/releases]版本及兼容性查询; # 注:[ chmod ]命令:权限修改; # 注:[ ln ]命令:创建软链接,相当于WIN下快捷方式; docker-compose --version # 验证DOCKER-COMPOSE是否安装成功[成功将输出版本信息]; |
至此,已经在DEBINA系统上完成了DOCKER环境的配置了!!
三、HARBOR安装前准备
本处将生成相关证书,使HARBOR支持HTTPS。关于DOCKER,在连接镜像仓库下载镜像时,其默认的配置值是必须使用HTTPS连接的,所以本处需要生成证书。当然,你也可以修改DOCKER的配置文件,使其支持HTTP,对于使用HTTP的方式,本文不详细述说。
以下为私有证书的生成过程及一些简单的解读:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
mkdir -p /opt/harbor/cert.d && cd /opt/harbor/cert.d/ # 生成相关的目录并进入相关目录; openssl req -nodes -newkey rsa:4096 -out lemonsys.test.csr -keyout lemonsys.test.key # 生成"证书请求文件"及"私钥文件"; # req :request的简写,代表发出一个申请数字证书的请求; # -nodes :不生成pin码,简化流程; # -newkey :生成新证书并指明加密算法和长度,也可以写成2048; # -out :生成一个"证书请求文件" --> [ lemonsys.test.csr ] # -keyout :生成"私钥文件" --> [ lemonsys.test.key ] # 本命令后将要求你输入一些相关信息,内容依次为: # 国家代码、省、市、公司、部门、域名、邮件地址[空]、密码[空]、备用公司名称[空] # ==================================== # Country Name (2 letter code) [AU]:CN # State or Province Name (full name) [Some-State]:BeiJing # Locality Name (eg, city) []:BeiJing # Organization Name (eg, company) [Internet Widgits Pty Ltd]:Lemonsys.LTD # Organizational Unit Name (eg, section) []:IT # Common Name (e.g. server FQDN or YOUR name) []:*.lemonsys.test # Email Address []: # # Please enter the following 'extra' attributes # to be sent with your certificate request # A challenge password []: # An optional company name []: # ==================================== # 注:本处使用了泛域名的形式,即"*.lemonsys.test"; # 如此配置的好处是:比方说我需要在内网搭建一个HARBOR的私有服务,那么我只 # 需要将对应的自定义域名解释至本地主机"hosts"文件即可,而无需重新生成私有 # 证书,例如: # LINUX:$ echo "192.168.100.100 harbor.lemonsys.test" >> /etc/hosts openssl req -in lemonsys.test.csr -x509 -key lemonsys.test.key -out lemonsys.test.crt -days 3650 # -in :导入"证书请求文件" --> [ lemonsys.test.csr ] # -x509 :证书格式[代表自签名证书] # -key :导入"私钥文件" --> [ lemonsys.test.key ] # -out :生成"证书文件" --> [ lemonsys.test.crt ] # -days :证书文件的有效期 |
至此,本文已依据上述命令生成一个主域名为"lemonsys.test"的泛域名证书!!而且本证书并不限制于本服务使用。比方说,下次读者希望搭建一个GITLAB的私有服务,那么可以使用一个如"gitlab.lemonsys.test"的域名并结合此证书以提供HTTPS属性,当然,别忘记在本地主机的"hosts"文件上作对应的域名解释。
之后,我们对服务器进行静态IP地址配置,需要对"/etc/network/interfaces"文件进行编辑;
1 2 3 4 5 6 7 |
vim /etc/network/interfaces # 使用VIM编辑器对文件进行编辑; # 如果不熟悉VIM编辑器的使用,也可使用图形化编辑器; # 以下为DEBIAN下的具体配置,不同系统可能不同, # 包括网卡,下面配置中网卡的名称为"ens33", # 另外网关、IP定义等,请依据实际情况进行修改; # 以下为本示例使用的具体配置[修改后]; |
至以下为文件的具体配置内容,修改后保存配置;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface #allow-hotplug ens33 #iface ens33 inet dhcp # The primary network interface auto ens33 iface ens33 inet static address 192.168.120.100 netmask 255.255.255.0 network 192.168.120.0 broadcast 192.168.120.255 gateway 192.168.120.2 # 复制修改使用的读者请注意换行符格式问题; # 本文件使用WINDOWS格式的换行符; |
配置保存后,对网卡进行停启操作,以便IP地址生效;
1 2 3 4 5 6 7 8 9 10 11 12 |
unix2dos /etc/network/interfaces # 可选步骤:转换文档为WINDOWS格式; # 主要针对复制修改代码的读者可能产生换行符的问题; ifdown ens33 # 停用"ens33"网卡; ifup ens33 # 启用"ens33"网卡; ip addr show dev ens33 # 查询IP地址信息,核查是是否修改成功; |
四、HARBOR配置及安装
首先到官网下载安装包,GIT地址[https://github.com/goharbor/harbor/releases],本博文选择的安装包为:[ harbor-offline-installer-v1.10.1.tgz ],这是离线版本,建议使用,要不国外线路的下载速度……你懂的~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# 用你的方法,将"harbor-offline-installer-v1.10.1.tgz"上传至"/opt/"目录下; cd /opt tar -zxvf harbor-offline-installer-v1.10.1.tgz # 解压安装包,将得到以下目录结构; tree -L 2 /opt/harbor/ # 目录结构如下 # /opt/harbor/ # ├── cert.d // 之前创建证书时的文件; # │ ├── lemonsys.test.crt # │ ├── lemonsys.test.csr # │ └── lemonsys.test.key # ├── common.sh # ├── harbor.v1.10.1.tar.gz // HARBOR需要用到的DOCKER镜像压缩包; # ├── harbor.yml // 首次创建HARBOR时的配置文件; # ├── install.sh // 首次安装使用的脚本文件; # ├── LICENSE # └── prepare // 修改"harbor.yml"后需要应用本工具使配置生效; cd /opt/habor docker load --input harbor.v1.10.1.tar.gz # 导入基于HARBOR的DOCKER镜像; docker images # 检测镜像是否导入成功[将导入以下镜像文件]; #================================ # goharbor/chartmuseum-photon v0.9.0-v1.10.1 # goharbor/harbor-migrator v1.10.1 # goharbor/redis-photon v1.10.1 # goharbor/clair-adapter-photon v1.0.1-v1.10.1 # goharbor/clair-photon v2.1.1-v1.10.1 # goharbor/notary-server-photon v0.6.1-v1.10.1 # goharbor/notary-signer-photon v0.6.1-v1.10.1 # goharbor/harbor-registryctl v1.10.1 # goharbor/registry-photon v2.7.1-patch-2819-2553-v1.10.1 # goharbor/nginx-photon v1.10.1 # goharbor/harbor-log v1.10.1 # goharbor/harbor-jobservice v1.10.1 # goharbor/harbor-core v1.10.1 # goharbor/harbor-portal v1.10.1 # goharbor/harbor-db v1.10.1 # goharbor/prepare v1.10.1 #================================ |
修改配置文件"harbor.yml",SHELL下可以使用vi、vim、nano等命令,图形化界面的随便;此处仅列出比较常用的项,其它配置项请依据自己的需求修改;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# 注意本文件使用LINUX/UNIX格式的换行符; # 定义服务器的域名; # 本处定义域名为:harbor.lemonsys.test hostname: harbor.lemonsys.test # HTTP的端口定义; http: port: 80 # HTTPS的端口与证书定义; https: # 定义HTTPS端口为443; port: 443 # 定义网站"证书文件"的位置[使用之前创建的证书文件]; certificate: /opt/harbor/cert.d/lemonsys.test.crt # 定义网站"私钥文件"的位置[使用之前创建的私钥文件]; private_key: /opt/harbor/cert.d/lemonsys.test.key # 定义管理员"admin"的用户密码; # 创建HARBOR后使用"admin"与定义的密码登录; harbor_admin_password: Harbor12345 # HARBOR数据库配置 database: # 定义数据库的密码[生产环境应考虑修改]; password: root123 # 连接数量的限制; max_idle_conns: 50 max_open_conns: 100 # 定义数据的保存于本地主机上的位置; # 这实际上对应了"docker run"的"-v"参数; # 博主习惯将一个服务项目的数据保存于同一个位置; # 此值应该按需自定义,本处需要创建对应目录; data_volume: /opt/harbor/data # 日志配置; log: # 日志等级[ debug、info,、warning,、error,、fatal ]; level: info # 基于本地主机的日志配置项; local: # 日志配置的控制项; rotate_count: 50 rotate_size: 200M # 日志于本地主机上的保存位置; # 本处需要创建对应目录; location: /opt/harbor/log |
正式开始HARBOR的安装;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
mkdir -p /opt/harbor/{data,log} # 创建之前"harbor.yml"配置文件修改后需要使用到的目录; dos2unix /opt/harbor/harbor.yml # 可选步骤:转换文档为LINUX格式; # 主要针对复制修改代码的读者可能产生换行符的问题; cd /opt/harbor ./prepare # 将依据配置文件"harbor.yml"生成一些需要用到的目录或文件; # 最主要是会在当前目录下生成"docker-compose.yml"文件, # 这是HARBOR服务启用、停止需要用的配置文件; # 同时,此文件是匹配"harbor.yml"文件的各种配置的; ./install.sh # 执行HARBOR的安装; # 至此,HARBOR的服务已经安装完成; docker ps # 检查HARBOR服务是否正常启用; #=============================================== # CONTAINER ID IMAGE NAME # 5f319508bd20 goharbor/harbor-jobservice:v1.10.1 harbor-jobservice # cb9564b5ab88 goharbor/nginx-photon:v1.10.1 nginx # 8730dbaad2a9 goharbor/harbor-core:v1.10.1 harbor-core # c46c72ecab75 goharbor/redis-photon:v1.10.1 redis # d5b9d4d80f0b goharbor/harbor-db:v1.10.1 harbor-db # 56ac2b2d5356 goharbor/harbor-portal:v1.10.1 harbor-portal # 72ed917d4f7c goharbor/registry-photon:v2.7.1-patch-2819-2553-v1.10.1 registry # 7f06db9d5797 goharbor/harbor-registryctl:v1.10.1 registryctl # dbad0ed0cfad goharbor/harbor-log:v1.10.1 harbor-log #=============================================== # 以上列表省略了部分列;可见在该"harbor.yml"的配置下, # 16个默认DOCKER镜像本例使用了9个,这是由于有部分服务我们未使用到; |
五、HARBOR使用前配置
1、添加自定义的域名解释;由于我们定义的HARBOR服务的域名在互联网是不存在的,所以我们无法通过互联网的DNS服务器作域名解释,所以,我们需要使用到本地主机的域名解释文件[hosts文件]。下面包括了LINUX与WINDOWS下的"hosts"文件的修改,读者按需要选用,本示例使用了命令行的方式对"hosts"文件进行修改,读者也可选择使用图形化文本工具进行配置。注意,由于缺乏验证,重复使用下列命令对"hosts"文件进行修改可能会使你的"hosts"文件中存在多余的域名解释记录;
HARBOR服务端的操作:
1 2 3 4 5 6 7 8 9 |
# LINUX部分:============================= ip addr # 首先查询HARBOR服务主机的IP地址; # 这是DEBIAN默认使用的命令,其它LINUX系统你可能可以使用"ifconfig"命令; # 本处假设获得的IP地址为:192.168.120.100 echo "192.168.120.100 harbor.lemonsys.test" >> /etc/hosts # 在本地主机上添加自定义域名解释记录; # 本示例将域名"harbor.lemonsys.test"解释至IP"192.168.120.100"的地址上; |
客户端的操作:
1 2 3 4 5 6 7 8 9 10 |
# LINUX部分:============================= echo "192.168.120.100 harbor.lemonsys.test" >> /etc/hosts # 在本地主机上添加自定义域名解释记录; # 本示例将域名"harbor.lemonsys.test"解释至IP"192.168.120.100"的地址上; # WINDOWS部分:============================= echo "192.168.120.100 harbor.lemonsys.test" >> c:\windows\system32\drivers\etc\hosts # 在本地主机上添加自定义域名解释记录; # 本示例将域名"harbor.lemonsys.test"解释至IP"192.168.120.100"的地址上; |
2、私有证书授信;由于本例的私有HARBOR服务器使用的是自签名的HTTPS证书文件,而DOCKER服务默认仅接受合法CA颁发的证书文件,因此,我们需要将自签名的证书手动添加至主机内的证书受信任名单内;主要作用为,使DOCKER客户端的上传操作生效[docker push],避免产生证书无效的错误;以下以另外一台LINUX主机模拟客户端,操作如下;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 用你的方式上传"lemonsys.test.crt"文件至此主机; # 此处假设你已经将文件上传到"/root/cert.d/"目录下; cp -i /root/cert.d/lemonsys.test.crt /usr/local/share/ca-certificates # 复制自签名证书至目标目录; # 此目标目录为"update-ca-certificates"命令默认扫描的目录; update-ca-certificates # 更新受信任证书信息; # 现在你应该知道在安装DOCKER-CE时为什么需要安装这个命令工具了; systemctl restart docker # 重新运行DOCKER服务更新其受信任证书文件的信息; # 如果你忘记重启DOCKER服务,你将会在使用"docker login"命令时返回错误信息; # 这就是DOCKER服务未更新受信任证书信息造成的; |
补充:以下命令是以服务端作为客户端时需要;即该主机同时是服务端,同时又以此主机作为客户端使用时需要[你不想再新建一台主机作测试];
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
cp -i /opt/harbor/cert.d/lemonsys.test.crt /usr/local/share/ca-certificates # 复制自签名证书至目标目录; # 此目标目录为"update-ca-certificates"命令默认扫描的目录; update-ca-certificates # 更新受信任证书信息; # 现在你应该知道在安装DOCKER-CE时为什么需要安装这个命令工具了; systemctl restart docker # 重新运行DOCKER服务更新其受信任证书文件的信息; # 如果你忘记重启DOCKER服务,你将会在使用"docker login"命令时返回错误信息; # 这就是DOCKER服务未更新受信任证书信息造成的; cd /opt/harbor docker-compose restart # 重新运行HARBOR服务;DOCKER服务重启后,HARBOR服务可能会启用不全导致工作异常; # 注:以上命令等同于"docker-compose -f ./docker-compose.yml restart" # 目录外也可以使用"docker-compose -f /opt/harbor/docker-compose.yml restart"命令重启HARBOR服务; |
六、HARBOR服务验证
1、WEB登录;你可以使用DEBINA虚拟机中的浏览器或WINDOWS系统中的浏览器对"harbor.lemonsys.test"进行访问,并通过用户名"admin"及密码"Harbor12345"登陆HARBOR。注意,如果你是使用WINDOWS下的浏览器,来访问VM虚拟机中创建HARBOR服务的,请确保WINDOW主机下至VM虚拟机之间的路由可达,并且已经对"hosts"文件做好相对应的域名解释;
WINDOWS下WEB登陆界面展示
2、SHELL界面私有HARBOR服务器登录,及上传私有镜像;为方便显示其过程,本示例将从官方下载"busybox"镜像,并使用另外一台同IP网段内的LINUX虚拟机;该虚拟机记得需要作"五、HARBOR使用前配置";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
docker pull busybox:latest # 从DOCKER仓库下载最新的"busybox"镜像; # 注:"busybox"部分:即为镜像名称 # "latest"部分:即为镜像版本,"latest"为一个特殊值,代表最后的版本; docker login harbor.lemonsys.test # 命令行方式登录"harbor.lemonsys.test"私有镜像仓库; # 本示例用户名:"admin"、密码:"Harbor12345"; docker tag busybox:latest harbor.lemonsys.test/library/busybox:2020.03 # 为"busybox:latest"增加一个用于私服的标签名称; # 注:"harbor.lemonsys.test"部分:所使用的DOCKER镜像仓库的URL; # "library"部分:使用的具体仓库名称,"library"为默认的仓库; # "busytest"部分:即为镜像名称; # "2020.03"部分:即为镜像版本,本处修改其为"2020.03"以标识其为2020年3月份的镜像; docker push harbor.lemonsys.test/library/busybox:2020.03 # 至此,通过WEB浏览器登录私有HARBOR镜像仓库,将可以在名为"library"的仓库下, # 发现名为"busybox"的镜像上传成功; |
演示图
七、其它
我也不知道为什么写这个,反正也没人看,不过,在核对代码时,发现了一件有趣的事,博主发现了支持ARM架构HARBOR的非官方镜像,这使得在树莓派上架设HARBOR成为了可能,如果那些镜像可用,可能会有一篇基于树莓派的HARBOR架设教程。
DevOps系列:HARBOR私有镜像仓库搭建:等您坐沙发呢!