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
也是无法推送