docker自建GitLab仓库的实现

 更新时间:2024年07月10日 10:45:01   作者:小码快撩  
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仓库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Docker必须使用sudo操作的问题

    解决Docker必须使用sudo操作的问题

    这篇文章主要介绍了解决Docker必须使用sudo操作的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Docker官方镜像Tomcat 无法访问解决方案

    Docker官方镜像Tomcat 无法访问解决方案

    当使用docker pull tomcat下载的镜像运行时,遇到无法访问Tomcat服务的问题,原因是存在两个webapps目录,本文就来详细的介绍一下解决方法,感兴趣的可以了解一下
    2025-10-10
  • 迁移docker镜像到新服务器的具体操作流程

    迁移docker镜像到新服务器的具体操作流程

    在日常工作中,我们有时会需要将服务器A上的镜像上传至服务器B上,这篇文章主要介绍了迁移docker镜像到新服务器的具体操作流程,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-07-07
  • 查看和更改Docker容器IP地址的操作指南

    查看和更改Docker容器IP地址的操作指南

    Docker 提供了灵活的网络配置能力,允许用户查看和更改容器的 IP 地址,这在构建微服务架构、进行网络调试、或需要对网络流量进行精细控制时尤为重要,本文将详细介绍如何查看和更改 Docker 容器的 IP 地址,需要的朋友可以参考下
    2025-09-09
  • Docker容器输入汉字触发自动补全问题

    Docker容器输入汉字触发自动补全问题

    Linux系统中,当终端出现中文乱码通常是由于缺少中文字符集和字体,安装中文字体和设置合适的字符集zh_CN.utf8,可以有效解决这一问题,首先,通过查看系统支持的字符集了解是否支持中文,然后安装相应字符集,其次,查看并设置当前系统字符集
    2024-10-10
  • 详解Docker学习笔记之搭建一个JAVA Tomcat运行环境

    详解Docker学习笔记之搭建一个JAVA Tomcat运行环境

    本篇文章主要介绍了详解Docker学习笔记之搭建一个JAVA Tomcat运行环境,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 检查docker和docker compose是否已经安装的方式

    检查docker和docker compose是否已经安装的方式

    这篇文章主要介绍了检查docker和docker compose是否已经安装的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • Docker容器处于Removal in process无法删除问题及解决

    Docker容器处于Removal in process无法删除问题及解决

    这篇文章主要介绍了Docker容器处于Removal in process无法删除问题及解决方案,具有很好的参考价值,希望对大家有所帮助。
    2023-07-07
  • Linux环境docker部署Firefox结合内网穿透远程使用浏览器测试的示例详解

    Linux环境docker部署Firefox结合内网穿透远程使用浏览器测试的示例详解

    在Docker中打开Firefox意味着我们将在一个Docker容器中运行Firefox浏览器,这对于一些特殊的测试场景非常有用,例如需要在不同版本的浏览器中进行测试,下面是一个简单的示例,演示如何在Docker中打开Firefox,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • Docker构建Jar镜像的方法实现

    Docker构建Jar镜像的方法实现

    本文主要介绍了Docker构建Jar镜像的方法实现,主要包括编写Dockerfile、构建镜像、测试镜像等操作,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10

最新评论