Docker Harbor私有仓库部署

Docker Harbor私有仓库部署

  Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,
部署企业内部的私有环境Registry是非常必要的,Harbor和docker中央仓库的关系,就类似于nexus和Maven中央仓库的关系,Harbor除了存储和分发镜像外还具有用户管理,项目管理,配置管理和日志查询,高可用部署等主要功能。

准备内容

为了方便理解,使用的机器内网IP为1.1.1.1,外网IP为2.2.2.2

1. 获取Harbor离线安装包

通过github获取离线安装包,地址:https://github.com/goharbor/harbor/releases
可以根据自己的需要下载自己需要的release版本,这里使用的是v2.10.0,下载对应的离线安装包harbor-offline-installer-v2.10.0.tgz

2. 下载docker-compose并安装

参考网址:https://blog.csdn.net/justlpf/article/details/131973134

部署docker环境,为了方便采用命令安装 pip3的方式安装docker-compose

安装Harbor

本篇的安装目录在/data/harbor目录下,docker卷映射宿主机位置在/data/volumes/下

解压harbor离线文件

如果目录不存在,则创建目录  mkdir -p /data/harbor
cd /data/harbor   
# 上传包

# 解压
tar -zxvf harbor-offline-installer-v2.10.0.tgz

# 复制一份配置文件
cd harbor
cp harbor.yml.tmpl harbor.yml

# 编辑配置文件
vim harbor.yml

1. 部署http访问模式

编辑配置文件的以下内容

# 修改成你的ip,填写外网ip地址或者域名
# 填写内网ip有个问题就是页面能通过外网ip进入管理控制台,但是无法通过外网ip使用docker login或者docker push等操作
hostname: 2.2.2.2

# 修改端口号,由于端口限制,不建议使用80端口
http:
  port: 7080

# 如果不需要https,请注释掉https相关
#https:
#  port: 443
#  certificate: /your/certificate/path
#  private_key: /your/private/key/path

# 配置密码,将 Harbor12345换成你自己的密码,建议使用复杂一点的密码
harbor_admin_password: Harbor12345

# 数据映射到宿主机的位置
data_volume: /data/volumes/harbor/

log:
  local:
    # 日志存放到宿主机的位置
    location: /data/logs/harbor

启动harbor

./install.sh

可以通过docker ps查看各个组件是否启动完成,启动完成后,就可以通过你配置的IP + PORT访问Harbor了,这里有个小坑,因为harbor本身依赖redis和nginx,如果你本机已经跑着名称为nginx和redis的容器,启动会报错,需要先将自己的redis或者nginx容器重命名才能启动成功。如果不需要开启https的话,可以宣布游戏结束了。

Harbor常用命令

# 启动harbor
docker-compose up -d

# 关闭harbor
docker-compose down

2. 部署支持https协议访问

因为Harbor要配合天翼云或者K8S一起使用,集群访问Harbor只支持https,所以要重新配置一下。

2.1 修改openss的配置(可先跳过)

这配置可以先跳过,遇到问题之后再回来配置。因为我这儿配置的是内网ip,但是v3.ext文件配置的外网ip,所以可以先跳过。

可能遇到问题点:制作证书前需要设置openss的配置文件,在[ v3_ca ] 下添加subjectAltName = IP:1.1.1.1,否则做出来的证书使用docker登录会报:x509: cannot validate certificate for 1.1.1.1 because it doesn’t contain any IP SANs 错误。这里1.1.1.1需要替换成harbor所在机器的ip

vim /etc/pki/tls/openssl.cnf

在[ v3_ca ]下添加以下内容,ip替换成harbor机器所在ip

subjectAltName = IP:1.1.1.1

2.2 制作证书

生成CA证书私钥和CA证书

# 切换到harbor证书所在的目录,可以自己创建目录,和后面配置对上就好
mkdir -p /data/harbor/cert
cd /data/harbor/cert

# 执行证书命令
openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout ca.key \
-x509 -days 3650 -out ca.crt \
-subj "/C=CN/ST=Guangdong/L=Shenzhen/O=CMIT/OU=JSZX/CN=2.2.2.2/emailAddress=guyougao@****.com"

说明:C=CN(国家),ST=Guangdong(省份),L=Shenzhen(城市),O=NETSION(公司),OU=IT(部门),CN=2.2.2.2(IP,harbor的ip),emailAddress=XXX@XXX.com(换成你自己的邮箱,或者随便填)
执行完后,会得到两个文件ca.crt和ca.key

生成服务器证书

# 私钥
openssl genrsa -out 2.2.2.2.key 4096

openssl req -sha512 -new -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=CMIT/OU=JSZX/CN=2.2.2.2/emailAddress=guyougao@****.com" -key 2.2.2.2.key -out 2.2.2.2.csr

生成一个使用ip进行访问的x509 v3扩展文件

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:2.2.2.2
EOF

使用刚才生成的v3.ext生成Harbor主机证书

openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in 2.2.2.2.csr \
    -out 2.2.2.2.crt

转换2.2.2.2.crt为2.2.2.2.cert,供Docker使用,Docker守护程序将.crt文件解释为CA证书,并将.cert文件解释为客户端证书

openssl x509 -inform PEM -in 2.2.2.2.crt -out 2.2.2.2.cert

到这里我们已经生成了一堆证书了

[root@ecs-debug-service cert]# ls
2.2.2.2.cert  2.2.2.2.crt  2.2.2.2.csr  2.2.2.2.key  ca.crt  ca.key  ca.srl  v3.ext

2.3 使用证书

# 编辑配置文件
cd /data/harbor/harbor
vim harbor.yml

主要修改以下内容,端口默认443,certificate和private_key替换成你自己的证书路径

# 修改成你的ip,填写外网ip地址或者域名
# 填写内网ip有个问题就是页面能通过外网ip进入管理控制台,但是无法通过外网ip使用docker login或者docker push等操作
hostname: 2.2.2.2

# 修改端口号,由于端口限制,不建议使用80端口
http:
  port: 7080

# 如果不需要https,请注释掉https相关
https:
# 修改端口号,由于端口限制,不建议使用443端口
  port: 7443
  certificate: /data/harbor/cert/2.2.2.2.crt
  private_key: /data/harbor/cert/2.2.2.2.key

# 配置密码,将 Harbor12345换成你自己的密码,建议使用复杂一点的密码
harbor_admin_password: Harbor12345

# 数据映射到宿主机的位置
data_volume: /data/volumes/harbor/

log:
  local:
    # 日志存放到宿主机的位置
    location: /data/logs/harbor

将服务器证书,密钥和CA文件复制到Harbor主机上的Docker证书文件夹中

mkdir -p /etc/docker/certs.d/2.2.2.2:7443
cp 2.2.2.2.cert 2.2.2.2.key ca.crt /etc/docker/certs.d/2.2.2.2:7443

这里文件夹的命名是有规则限定的,/etc/docker/certs.d/yourdomain.com:port或/etc/docker/certs.d/harbor_IP:port,yourdomain.com,harbor_IP根据自己的情况填写harbor域名或者ip,因为我这里使用的时ip访问,所以配置的是ip,port为你配置的https端口,如果是默认的443可以不填写端口,如果你使用的是非默认值,文件夹名称请加上端口号且需要和harbor.yml配置的https端口对应上

2.4 重启docker与harbor

# 关闭harbor
docker-compose down -v

# 重启docker
service docker restart

# 重新配置
./prepare

# 启动
./install.sh

ps:我看到网上有些教程在执行./prepare之后直接docker-compose -d就可以了。但是我发现我执行的时候报错了,docker ps -a发现之前相关的容器全部没有了,所以就直接在./install了一次

2.5 验证https

页面访问我们的http端口7080,发现已经可以自动跳转到https端口7443了

访问地址:2.2.2.2:7443

使用admin,密码使用之前在配置文件中配置的密码,默认Harbor12345,登录成功后便看到了harbor清爽的界面

本机docker推送镜像到harbor中

# 随后输入密码
docker login https://2.2.2.2:7443 -u admin

# 拉一个镜像
docker pull mongo

# tag镜像
docker tag mongo:latest 2.2.2.2:7443/library/mongo:latest

# 推送镜像
docker psuh 2.2.2.2:7443/library/mongo:latest

问题点总结

通过测试发现有如下问题,暂时没解决内网和外网无差别访问的问题点。有经验的可以一起交流一下,解决当前存在的问题

1. docker login报错

WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get "https://2.2.2.2:7443/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority

需要daemon.json文件配置

"insecure-registries":["2.2.2.2:7443"]

2. 内网ip推送镜像

docker push 1.1.1.1:7443/ctos-dev/mongo

Using default tag: latest
The push refers to repository [1.1.1.1:7443/ctos-dev/mongo]
1434daed1bc0: Retrying in 1 second 
725f3f03e847: Retrying in 1 second 

会一直重试,无法push到harbor仓库

3. 通过外ip,http协议端口推送

[root@ecs-debug-service harbor]# docker push 2.2.2.2:7080/ctos-dev/mongo:latest
The push refers to repository [2.2.2.2:7080/ctos-dev/mongo]
Get "https://2.2.2.2:7080/v2/": http: server gave HTTP response to HTTPS client

也是无法推送

4. 为了方便使用,所以hostname配置外网或者域名地址

  • 45
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值