Harbor
无论是使用Docker-distribution去自建仓库,还是通过官方镜像跑容器的方式去自建仓库,通过前面的演示我们可以发现其是非常的简陋的,还不如直接使用官方的Docker Hub去管理镜像来得方便,至少官方的Docker Hub能够通过web界面来管理镜像,还能在web界面执行搜索,还能基于Dockerfile利用Webhooks和Automated Builds实现自动构建镜像的功能,用户不需要在本地执行docker build,而是把所有build上下文的文件作为一个仓库推送到github上,让Docker Hub可以从github上去pull这些文件来完成自动构建。
但无论官方的Docker Hub有多强大,它毕竟是在国外,所以速度是最大的瓶颈,我们很多时候是不可能去考虑使用官方的仓库的,但是上面说的两种自建仓库方式又十分简陋,不便管理,所以后来就出现了一个被 CNCF 组织青睐的项目,其名为Harbor。
Harbor简介
Harbor是由VMWare在Docker Registry的基础之上进行了二次封装,加进去了很多额外程序,而且提供了一个非常漂亮的web界面。
Project Harbor是一个开源的受信任的云本地注册表项目,用于存储、标记和扫描上下文。
Harbor扩展了开源Docker发行版,增加了用户通常需要的功能,如安全、身份和管理。
Harbor支持高级特性,如用户管理、访问控制、活动监视和实例之间的复制。
Harbor的功能
Feathers:
- 多租户内容签名和验证
- 安全性和漏洞分析
- 审计日志记录
- 身份集成和角色访问控制
- 实例间的镜像复制s
- 可扩展的API和图形界面
- 国际化(目前为英文和中文)
Docker compose
Harbor在物理机上部署是非常难的,而为了简化Harbor的应用,Harbor官方直接把Harbor做成了在容器中运行的应用,而且这个容器在Harbor中依赖类似redis、mysql、pgsql等很多存储系统,所以它需要编排很多容器协同起来工作,因此VMWare Harbor在部署和使用时,需要借助于Docker的单机编排工具(Docker compose)来实现。
Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,只需要一个命令,就可以从配置中创建并启动所有服务。
Harbor部署
安装过程
Harbor标准安装过程包括以下阶段:
- 确保您的目标主机满足安装先决条件 Harbor Installer Precondition
- 下载并安装Harbor Download the Harbor Installer
- 配置HTTPS访问端口 Configure HTTPS Access to Harbor
- 配置Harbor YML文件 Configure the Harbor YML File
- 配置启用内部TLS Configure Enabling Internal TLS
- 运行安装程序脚本 Run the Installer Script
如果安装失败,请参见 Harbor安装故障处理
准备工作
搭建私有仓库需要的软件:
软件 | 版本 | 说明 |
---|---|---|
Docker | Version 17.06.0-ce+ 或更高 | 有关安装说明,请参阅 Docker Engine documentation |
Docker Compose | Version 1.18.0 或更高 | 有关安装说明,请参阅 Docker Compose documentation |
Openssl | 最好是最新的 | 用于为端口生成证书和密钥 |
Docker安装:
//配置yum源
[root@yqh ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
[root@yqh ~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@yqh ~]# sed -i 's|$releasever|8|' /etc/yum.repos.d/CentOS-Base.repo
[root@yqh ~]# sed -i 's|^gpgcheck=1|gpgcheck=0|' /etc/yum.repos.d/CentOS-Base.repo
[root@yqh ~]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
[root@yqh ~]# sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@yqh ~]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
[root@yqh ~]# sed -i 's|$releasever|8|' /etc/yum.repos.d/epel*
[root@yqh ~]# sed -i 's|^gpgcheck=1|gpgcheck=0|' /etc/yum.repos.d/epel*
[root@yqh ~]# cd /etc/yum.repos.d/
[root@yqh yum.repos.d]# curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
[root@yqh yum.repos.d]# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
[root@yqh yum.repos.d]# ls
CentOS-Base.repo epel-playground.repo epel-testing.repo
docker-ce.repo epel.repo redhat.repo
epel-modular.repo epel-testing-modular.repo
[root@yqh ~]# yum clean all
[root@yqh ~]# yum makecache
//安装docker
[root@yqh ~]# yum -y install docker-ce
//开启自起并且立即启动
[root@yqh ~]# systemctl enable --now docker
Docker compose安装:
//下载docker-compose
[root@yqh ~]# curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@yqh ~]# ll /usr/local/bin/
total 11928
-rw-r--r--. 1 root root 12211728 Mar 9 15:32 docker-compose
//给docker-compose执行权限
[root@yqh ~]# chmod +x /usr/local/bin/docker-compose
[root@yqh ~]# ll /usr/local/bin/
total 11928
-rwxr-xr-x. 1 root root 12211728 Mar 9 15:32 docker-compose
Openssl安装:
//安装openssl
[root@yqh ~]# yum -y install openssl
[root@yqh ~]# rpm -qa|grep openssl
xmlsec1-openssl-1.2.25-4.el8.x86_64
openssl-pkcs11-0.4.10-2.el8.x86_64
openssl-libs-1.1.1g-12.el8_3.x86_64
openssl-1.1.1g-12.el8_3.x86_64
Harbor快速安装
//下载harbor安装包
[root@yqh ~]# wget https://github.com/goharbor/harbor/releases/download/v2.2.0/harbor-offline-installer-v2.2.0.tgz
[root@yqh ~]# ls
anaconda-ks.cfg harbor-offline-installer-v2.2.0.tgz
//解压到/usr/local/下
[root@yqh ~]# tar xf harbor-offline-installer-v2.2.0.tgz -C /usr/local
[root@yqh ~]# cd /usr/local/harbor/
[root@yqh harbor]# ls
common.sh harbor.v2.2.0.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
//备份配置文件并进行配置
[root@yqh harbor]# cp harbor.yml.tmpl harbor.yml
[root@yqh harbor]# vim harbor.yml
······
hostname: 192.168.100.2 #修改为当前主机的IP或域名
······
# https related config #注释https服务
# https:
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path
//执行安装脚本
[root@yqh harbor]# ./install.sh
Note: docker version: 20.10.4
Note: docker-compose version: 1.28.5
······
✔ ----Harbor has been installed and started successfully.----
[root@yqh harbor]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 127.0.0.1:1514 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
[root@yqh harbor]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c540b3980df goharbor/nginx-photon:v2.2.0 "nginx -g 'daemon of…" About a minute ago Up About a minute (healthy) 0.0.0.0:80->8080/tcp nginx
······
//使用docker-compose管理(需要进到harbor目录中)
[root@yqh ~]# cd /usr/local/harbor/
[root@yqh harbor]# ls
common docker-compose.yml harbor.yml install.sh prepare
common.sh harbor.v2.2.0.tar.gz harbor.yml.tmpl LICENSE
[root@yqh harbor]# docker-compose stop
Stopping registry ... done
Stopping harbor-portal ... done
Stopping registryctl ... done
Stopping redis ... done
Stopping harbor-log ... done
[root@yqh harbor]# docker-compose start
Starting log ... done
Starting registry ... done
Starting registryctl ... done
Starting postgresql ... done
Starting portal ... done
Starting redis ... done
Starting core ... done
Starting jobservice ... done
Starting proxy ... done
[root@yqh harbor]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.1:1514 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
##需要写一个开启自动启动的脚本,否则重启不会启动
//写一个停止并重启的docker-compose的脚本
[root@yqh harbor]# vim startall.sh
#!/bin/bash
cd /usr/local/harbor
docker-compose stop && docker-compose start
//给脚本执行权限
[root@yqh harbor]# chmod +x startall.sh
[root@yqh harbor]# ll startall.sh
-rwxr-xr-x. 1 root root 78 Mar 9 16:38 startall.sh
// /etc/rc.local是系统启动之后最后一个执行的文件
[root@yqh harbor]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 Mar 24 2020 /etc/rc.local -> rc.d/rc.local
[root@yqh harbor]# ll /etc/rc.d/rc.local
-rw-r--r--. 1 root root 474 Mar 24 2020 /etc/rc.d/rc.local
//被链接文件也需要有执行权限
[root@yqh harbor]# chmod +x /etc/rc.d/rc.local
[root@yqh harbor]# ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 474 Mar 24 2020 /etc/rc.d/rc.local
//在/etc/rc.d/rc.local里加上执行启动脚本的命令,就会开启自动启动了
[root@yqh harbor]# vim /etc/rc.d/rc.local
#!/bin/bash
/bin/bash /usr/local/harbor/startall.sh
//重启测试
[root@yqh ~]# reboot
[root@yqh ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 127.0.0.1:1514 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
[root@yqh ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c540b3980df goharbor/nginx-photon:v2.2.0 "nginx -g 'daemon of…" 38 minutes ago Up 2 minutes (healthy) 0.0.0.0:80->8080/tcp nginx
······
使用IP登录管理Harbor
默认用户名:admin 默认密码:Harbor12345
登录成功后界面:
Harbor使用方法
系统管理---用户管理---创建用户
输入用户信息
创建用户成功---并将它设置为管理员
项目---新建项目
输入项目相关信息
点击创建好的项目
点击推送命令可以查看帮助
上传镜像
首先用dockerfile制作镜像,制作方法见 dockerfile的使用
//制作镜像
[root@yqh ~]# tree nginx-small/
nginx-small/
├── Dockerfile
└── software
└── nginx-1.19.7.tar.gz
[root@yqh ~]# docker build -t nginx-s:v0.1 nginx-small/
[root@yqh ~]# docker tag nginx-s:v0.1 192.168.100.2/yqh/nginx:v0.1
[root@yqh ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.100.2/yqh/nginx v0.1 30cffc18cc06 50 seconds ago 252MB
nginx-s v0.1 30cffc18cc06 50 seconds ago 252MB
//配置insecure-registries和加速器并重启
[root@yqh ~]# vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.100.2"]
}
[root@yqh ~]# systemctl daemon-reload
[root@yqh ~]# systemctl restart docker
[root@yqh ~]# cd /usr/local/harbor/
[root@yqh harbor]# ./startall.sh
//登录到仓库
[root@yqh harbor]# docker login 192.168.100.2
Username: yqh
Password:
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
Login Succeeded
//上传镜像
[root@yqh ~]# docker push 192.168.100.2/yqh/nginx:v0.1
The push refers to repository [192.168.100.2/yqh/nginx]
dd61f6b29d20: Pushed
36f61d70ba4c: Pushed
c04d1437198b: Pushed
v0.1: digest: sha256:e1de7d2a4ecbb6145d13799b26909fe9d9aba7bc4bb36699a702d7cfd74fab23 size: 951
上传成功
拉取镜像测试
//删除原来的镜像
[root@yqh ~]# docker rmi 192.168.100.2/yqh/nginx:v0.1
//拉取仓库里的镜像
[root@yqh ~]# docker pull 192.168.100.2/yqh/nginx:v0.1
v0.1: Pulling from yqh/nginx
596ba82af5aa: Already exists
e647fc56dbc1: Pull complete
bc60c66b1ee0: Pull complete
Digest: sha256:e1de7d2a4ecbb6145d13799b26909fe9d9aba7bc4bb36699a702d7cfd74fab23
Status: Downloaded newer image for 192.168.100.2/yqh/nginx:v0.1
192.168.100.2/yqh/nginx:v0.1
[root@yqh ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.100.2/yqh/nginx v0.1 30cffc18cc06 6 minutes ago 252MB
Docker Registry
网上有很多的Registry
服务器都支持第三方用户注册,而后基于用户名去做自己的仓库,但是使用互联网上的Registry
有一个缺陷,那就是我们去推送和下载镜像时都不会很快,而在生产环境中很可能并行启动的容器将达到几十、上百个,而且很有可能每个服务器本地是没有镜像的,此时如果通过互联网去下载镜像会有很多问题,比如下载速度会很慢、带宽会用很多等等,如果带宽不够的话,下载至启动这个过程可能要持续个几十分钟,这已然违背了使用容器会更加轻量、快速的初衷和目的。因此,很多时候我们很有可能需要去做自己的私有Registry
。
Registry
用于保存docker镜像,包括镜像的层次结构和元数据。用户可以自建Registry
,也可以使用官方的Docker Hub
。
Docker Registry分类:
- Sponsor Registry:第三方的Registry,供客户和Docker社区使用
- Mirror Registry:第三方的Registry,只让客户使用
- Vendor Registry:由发布docker镜像的供应商提供的registry
- Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry
事实上,如果运维的系统环境托管在云计算服务上,比如阿里云,那么用阿里云的Registry
则是最好的选择。很多时候我们的生产环境不会在本地,而是托管在数据中心机房里,如果我们在数据中心机房里的某台主机上部署Registry
,因为都在同一机房,所以属于同一局域网,此时数据传输走内网,效率会极大的提升。
所有的Registry
默认情况下都是基于https工作的,这是Docker的基本要求,而我自建Registry
时很可能是基于http工作的,但是Docker默认是拒绝使用http提供Registry
服务的,除非明确的告诉它,我们就是要用http协议的Registry
。
Docker Private Registry
为了帮助我们快速创建私有Registry
,Docker专门提供了一个名为Docker Distribution的软件包,我们可以通过安装这个软件包快速构建私有仓库。
问:既然Docker是为了运行程序的,Docker Distribution能否运行在容器中?
容器时代,任何程序都应该运行在容器中,除了Kernel和init。而为了能够做Docker Private Registry,Docker Hub官方直接把Registry
做成了镜像,我们可以直接将其pull到本地并启动为容器即可快速实现私有Registry
。
Registry
的主要作用是托管镜像,Registry
运行在容器中,而容器自己的文件系统是随着容器的生命周期终止和删除而被删除的,所以当我们把Registry
运行在容器中时,客户端上传了很多镜像,随着Registry
容器的终止并删除,所有镜像都将化为乌有,因此这些镜像应该放在存储卷上,而且这个存储卷最好不要放在Docker主机本地,而应该放在一个网络共享存储上,比如NFS。不过,镜像文件自己定义的存储卷,还是一个放在Docker本地、Docker管理的卷,我们可以手动的将其改成使用其它文件系统的存储卷。
这就是使用容器来运行Registry
的一种简单方式。自建Registry
的另一种方式,就是直接安装docker-distribution
软件。