docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > docker自建GitLab仓库

docker自建GitLab仓库的实现

作者:小码快撩

Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,本文主要介绍了docker自建GitLab仓库的实现,具有一定的参考价值,感兴趣的可以了解一下

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://www.jb51.net/server/320623e4s.htm

部署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配置外网或者域名地址

到此这篇关于docker自建GitLab仓库的实现的文章就介绍到这了,更多相关docker自建GitLab仓库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文