目录
什么是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,否则会去官方镜像站搜索)