在服务器上搭建Harbor私有镜像仓库并通过HTTPS访问

发布于:2022-10-17 ⋅ 阅读:(673) ⋅ 点赞:(0)

目录

什么是Harbor

在服务器上搭建Harbor私有镜像仓库

使用HTTPS访问Harbor私有镜像仓库

生成证书文件

配置证书文件

验证https访问

上传镜像到Harbor私有镜像仓库


什么是Harbor

Harbor 是为企业用户设计的容器镜像仓库开源项目,包括了权限管理(RBAC)、LDAP、审计、安全漏洞扫描、镜像验真、管理界面、自我注册、HA 等企业必需的功能。(转自官方文档)

当然,我们用不到这么多的功能,得益于他的镜像复制功能和简洁的图形化用户界面,Harbor同样可以作为一个我们个人的私有镜像仓库去搭建并使用。

接下来,我将记录下我的Harbor使用历程:

在服务器上搭建Harbor私有镜像仓库

由于CSDN上已经有很多搭建Harbor镜像仓库的文章了,这里我就不再赘述了。搭建Habor私有镜像仓库请参考下面这个文章:

如何构建私有镜像仓库Harbor(本地)_天然玩家的博客-CSDN博客_本地搭建harbor

Harbor内部默认是http方式进行通讯的,但是如果我们想要通过https进行访问,就需要用到证书。Harbor支持用三方签发证书,也支持使用自签发证书。

使用HTTPS访问Harbor私有镜像仓库

http访问的方式比较简单,只需要配置harbor.yml文件下的# http related config即可,默认端口为80,需要注意的是,一些浏览器会默认将http的访问方式转换为https的访问方式,这会造成原本可以通过http访问的harbor无法访问,请确认你的浏览器是否有该转换方式。

为什么要使用https访问呢?因为docker默认的docker login连接到镜像仓库使用的是https方式连接,而且https的连接方式比http安全。

接下来,我将主要介绍如何生成自签发证书文件并将其配置使我们能够通过https访问到harbor。

生成证书文件

#在相应位置创建证书文件夹并进入该文件夹
mkdir -p /data/cert
cd /data/cert

#接下来我们要通过openssl生成证书,如果没有安装openssl,则需要安装
apt-get update
apt-get -y install openssl

#创建ca.key
openssl genrsa -out ca.key 2048

#特别注意,如果你使用ip访问,则先执行这个命令,使用域名访问则跳过该步骤
openssl rand -writerand .rnd

#根据创建的ca.key生成ca.crt
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/CN={你的域名/ip}" -key ca.key -out ca.crt

#创建服务器key
openssl genrsa -out {你的域名/ip}.key 2048

#根据创建的服务器key生成服务器csr,一样的步骤
openssl req -new -sha512 -subj "/CN={你的域名/ip}" -key {你的域名/ip}.key -out {你的域名/ip}.csr

#创建v3文件(从cat到EOF)
#若使用域名访问
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1={你的域名}
EOF
#若使用IP访问
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:{你的IP}
EOF

#生成harbor仓库的证书
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in {你的域名/ip}.csr -out {你的域名/ip}.crt

#将{你的域名/ip}.crt转换为{你的域名/ip}.cert给docker使用
openssl x509 -inform PEM -in {你的域名/ip}.crt -out {你的域名/ip}.cert
到这步之后,可以停一下

输入ls .检查你的文件是否如下所示:

{你的域名/ip}.cert {你的域名/ip}.crt  {你的域名/ip}.csr  {你的域名/ip}.key  ca.crt  ca.key  ca.srl  v3.ext

配置证书文件

#复制证书到需要访问harbor的主机上的docker证书文件夹上
mkdir -p /etc/docker/certs.d/{你的域名/ip}/
cp /data/cert/{你的域名/ip}.cert /etc/docker/certs.d/{你的域名/ip}/
cp /data/cert/{你的域名/ip}.key /etc/docker/certs.d/{你的域名/ip}/
cp /data/cert/ca.crt /etc/docker/certs.d/{你的域名/ip}/

#重启docker使其载入证书文件
systemctl restart docker

#修改harbor配置文件 cd到harbor根目录下
vim harbor.yml

#在该yml文件里找到该部分,主要修改crt证书文件和秘钥位置
# https related config
https:
  # https port for harbor, default is 443
  port: 443
  #注:如果将默认端口443映射到其他端口,请返回第一步创建文件夹/etc/docker/certs.d{你的域名/ip}:port之后的docker login同理
  # The path of cert and key files for nginx
# 指定crt证书文件和秘钥位置
  certificate: /data/cert/{你的域名/ip}.crt
  private_key: /data/cert/{你的域名/ip}.key

#重新部署harbor
./install.sh
#重启Harbor
docker-compose up -d

验证https访问

  • 使用网页访问

在网页端URL栏输入:https://{你的域名/ip}.com可以直接访问到Harbor仓库的可视化界面。

某些浏览器可能会显示警告,指出证书颁发机构(CA)未知。这是因为我们使用的不是来自受信任的第三方CA而是自签名CA时。我们可以将CA导入浏览器以删除警告。

Harbor可视化界面的示意图如下:

  • 使用Docker访问

在harbor本机通过docker访问到harbor:

#使用docker login指令访问
docker login <你的域名/ip>

得到如下输出,则说明访问成功:

Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

 注:在非harbor本机通过docker访问到harbor则需要将ca.crt分发到对应的/etc/docker/cert.d/<你的域名/ip>文件夹中。

#在需要访问harbor的非harbor主机执行以下命令
scp <harbor主机的ip>:/data/cert/ca.crt /etc/docker/certs.d/<harbor主机的域名/ip>
#使用docker login登录到harbor
docker login <harbor主机的域名/ip>

 如果仍然提示Get "https://101.200.230.237/v2/": unauthorized: authentication required,则不是证书的问题,而很有可能是用户名或密码错误的问题。harbor仓库默认用户名:admin,密码:Harbor12345。如果还不正确可以查看harbor.yml配置文件看看自己是否进行了修改。

# The initial password of Harbor admin
# It only works in first time to install harbor
# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: ...

当然这个密码只在第一次登录Harbor时起作用,登录后会要求你更改密码。

这一点Docker的交互做的不太好,用户名密码错误却并没有明确的反应出这个错误。

上传镜像到Harbor私有镜像仓库

网页端连接到Harbor,打开左侧的项目栏点开我们的项目,可以看到出现了镜像仓库一栏,该镜像仓库目录为:{项目名}/

右侧可以看到有一个下拉菜单的推送命令,我们可以打开:

在项目中标记镜像:

docker tag SOURCE_IMAGE[:TAG] {你的域名/ip}/library/REPOSITORY[:TAG]

推送镜像到当前项目:

docker push {你的域名/ip}/library/REPOSITORY[:TAG]

 注:此处的变量只有REPOSITORY和TAG。

例如,我们可以输入下面这个指令拉取ubuntu的镜像进行测试

docker pull ubuntu

 使用docker tag命令将该镜像重新打上tag(此处tag置空代表latest最新版本)

docker tag ubuntu {你的域名/ip}/library/mytest/ubuntu:1.0

 再使用docker push将我们的镜像推送到harbor私有镜像仓库

docker push {你的域名/ip}/library/mytest/ubuntu:1.0

 输出如下:

Using default tag: latest
The push refers to repository [{你的域名/ip}/library/mytest/ubuntu]
9f54eef41275: Mounted from library/vim/ubuntu
latest: digest: sha256:7cc0576c7c0ec2384de5cbf245f41567e922aab1b075f3e8ad565f508032df17 size: 529

 接下里就可以在其他的主机通过docker pull {你的域名/ip}/library/mytest/ubuntu:1.0拉取到该镜像了(注意docker pull和push的时候记得要先docker login,否则会去官方镜像站搜索)

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到