一、环境
-
CentOS 7 -
Docker -
docker-compose-
安装
docker-composesudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
-
二、初步安装
1、下载Harbor
Harbor安装包分为离线版和在线版
harbor-offline-installer-v2.3.4.tgz:离线版,包含安装所需的镜像;harbor-online-installer-v2.3.4.tgz:在线版,不包含安装所需的镜像,安装时,会在线拉取所需的镜像;
2、拷贝与解压
将安装包拷贝到镜像仓库服务器上,然后解压:
tar -zxvf harbor-offline-installer-v2.3.4.tgz
进入解压后的目录,查看目录下的文件:
cd harbor
ll
3、配置Harbor
复制一份yaml文件
cp harbor.yml.tmpl harbor.yml
修改harbor.yml文件:
vim harbor.yml
修改hostname,修改端口号port(也可不修改),https方式后续会说明,这里先不使用https模式,因而将https方式注释掉;
记住harbor首次登录密码,登录之后可以修改;修改数据存放路径,我放在/data/harbor下;
保存并退出;
4、执行安装
执行同目录下的install.sh脚本;
./install.sh
等待执行完成;
执行完成之后,即可使用地址192.168.10.131:5555访问:
使用账号密码登录,账号默认是admin,密码默认是Harbor12345,如果在harbor.yml文件修改了密码则使用修改后的密码登录;
5、配置Docker
修改Docker配置文件daemon.json;
vim /etc/docker/daemon.json
添加以下内容:
{
"insecure-registries": [
"192.168.10.131:5555"
]
}
保存并退出,重启Docker:
systemctl restart docker
6、验证
-
测试镜像上传
先下载一个
nginx镜像:docker pull nginx给
nginx镜像打标签:## 192.168.10.131:5555为镜像仓库的IP和端口号 ## library为镜像仓库的路径 ## 将镜像打上此标签后,才能将镜像推到镜像仓库的library路径 docker tag nginx 192.168.10.131:5555/library/nginx:v1推送镜像:
## 登录镜像仓库,账号admin,也可以使用创建的新账号 docker loing 192.168.10.131:5555## 登录成功后,开始推送 docker push 192.168.10.131:5555/library/nginx:v1也可以在网页上看到刚上传的镜像:
-
测试镜像拉取
先将本地镜像
192.168.10.131:5555/library/nginx:v1删除:docker rmi -f 192.168.10.131:5555/library/nginx:v1拉取本地仓库的镜像:
docker pull 192.168.10.131:5555/library/nginx:v1
三、使用域名访问
1、分析
初步安装后,从镜像仓库中拉取镜像或者将镜像推送到镜像仓库中时,都是使用的IP地址+端口号访问;这种方式有以下缺点:
- 不方便记忆
- 后续仓库服务器IP变化时,改动太大;
因而期望通过域名访问。
2、方案
使用https + 自签名证书方式可以实现通过域名访问,域名设置为:mirrors.cn;
3、操作
-
生成CA证书
创建目录:
mkdri /data/cert cd /data/cert生成 CA 证书私钥:
openssl genrsa -out ca.key 4096生成 CA 证书:
openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=GuangDong/L=GuangDong/O=kaifa/OU=Personal/CN=mirrors.cn" \ -key ca.key \ -out ca.crt -
生成服务器证书
生成私钥:
openssl genrsa -out mirrors.cn.key 4096生成证书签名请求 (CSR):
openssl req -sha512 -new \ -subj "/C=CN/ST=GuangDong/L=GuangDong/O=kaifa/OU=Personal/CN=mirrors.cn" \ -key mirrors.cn.key \ -out mirrors.cn.csr生成 x509 v3 扩展文件:
cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1=mirrors.cn DNS.2=mirrors DNS.3=k8smaster EOF使用该文件为 Harbor 主机生成证书:
openssl x509 -req -sha512 -days 3650 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in mirrors.cn.csr \ -out mirrors.cn.crt -
配置Docker
将
.crt文件转换为.cert文件:openssl x509 -inform PEM -in mirrors.cn.crt -out mirrors.cn.cert将服务器证书、密钥和 CA 文件复制到 Harbor 主机上的 Docker 证书文件夹中:
## 创建文件夹 cd /etc/docker mkdir certs.d && cd certs.d mkdir mirrors.cn cd /data/cert/ ## 复制 cp mirrors.cn.cert /etc/docker/certs.d/mirrors.cn/ cp mirrors.cn.key /etc/docker/certs.d/mirrors.cn/ cp ca.crt /etc/docker/certs.d/mirrors.cn/如果将默认端口 443 映射到其他端口,需创建新文件夹,并将上述证书复制到新文件夹中:
/etc/docker/certs.d/yourdomain.com:port /etc/docker/certs.d/harbor_IP:port重新启动 Docker 引擎:
systemctl restart docker -
配置Harbor
将服务器证书和密钥复制到 Harbor 主机上的证书文件夹中:
## 若是在/data/cert/目录生成,则不需要复制 cp mirrors.cn.crt /data/cert/ cp mirrors.cn.key /data/cert/修改harbor配置文件
harbor.yml,开启https:保存并退出;如果 Harbor 正在运行,请停止并删除现有实例:
docker-compose down -v运行同目录下的脚本
prepare,重新生成配置文件,增加上其他chart功能等:./prepare --with-notary --with-trivy --with-chartmuseum重新启动Harbor:
docker-compose up -d
4、验证
-
配置
在测试服务器上的Docker配置文件中添加以下内容:
{ "insecure-registries": [ "https://mirrors.cn" ] }配置完重启Docker:
systemctl restart docker查看当前镜像:
docker images -
测试拉取镜像
拉取镜像
nginx:v1:docker pull mirrors.cn/library/nginx:v1查看镜像:
docker images -
测试推送镜像
给
nginx镜像打标签:docker tag nginx mirrors.cn/library/nginx:v2登录
mirrors.cn:docker login mirrors.cn推送镜像:
docker push mirrors.cn/library/nginx:v2从客户端上查看推送的镜像:
四、镜像代理
1、分析
现象: 目前镜像仓库只支持本地的拉取和推送,当拉取的镜像不存在时,就报错了;
期望: 当拉取的镜像不存在时,自动去其他镜像仓库中拉取,比如:docekr-cn、ustc;
2、方案
通过配置镜像代理实现
3、操作
登录Harbor客户端,点击仓库管理,然后选择新建目标:
创建ustc镜像源:
创建新项目:
配置使用代理:
点击确定,当前Harbor有两个项目,一个镜像代理proxy,一个项目library:
4、验证
-
环境
为了让测试效果更直观,先将镜像仓库的
nginx镜像和服务器本地nginx镜像删除: -
测试利用代理获取镜像
使用以下命令拉取镜像:
## 格式 docker pull <harbor_server_name>/<proxy_project_name>/<project_name>/<image_name>:<image_tag> ## 示例 docker pull mirrors.cn/proxy/library/nginx查看客户端: