镜像拉取存在一定的问题,出现原因在于:
使用官方公共仓库中的镜像。
拉取的镜像,主要保存在一下仓库中:
- docker.io //Docker hub 最大的官方维护的公共镜像仓库,一般都会提供所有项目的最新版镜像,镜像经过签名认证,保证了镜像的完整性和一致性。
- quay.io // redhat维护的一个社区版镜像仓库,主要提供红帽的openshift平台(红帽企业版K8S)的相关组件镜像,以及提供部分从docker hub 复制同步到的软件仓库项目,不保证镜像的安全性、可用性、完整性,以及是否为最新版镜像
- gcr.io // 谷歌的镜像仓库
- registry.k8s.io // K8S相关组件的官方仓库
- 大部分公有云的厂商提供镜像制备服务,并提供一定的镜像仓库功能,但是开放访问的公共仓库较少
为了避免启动容器时,需要拉取镜像这一操作,所以大部分情况下的解决方案是构建企业内部的私有镜像仓库,并能够提供企业级平台的功能,能够兼容大部分公共镜像仓库的镜像。
- docker registry 仅仅提供镜像的保存功能,再企业生产环境下,不太适合
镜像仓库的构建方案,有多种选择,因此很多情况下不会专门的镜像仓库服务来实现:
- gitlab // 在版本控制器中,保存镜像,
- nexus // 也可以作为容器镜像使用
- 选择公有云提供商提供的镜像仓库服务
- 专门的镜像仓库软件
什么是Harbor
Harbor是一个开源的企业级-容器镜像 管理项目,由VMware公司开源。
Harbor提供了比Docker官方公共镜像仓库更为丰富和安全的功能,尤其适合企业环境使用。
以下是Harbor的一些关键特性:
镜像仓库: 提供容器镜像推动保存,镜像拉取
harbor 作为企业级平台,提供的支持:
权限管理(RBAC):通过基于角色的访问控制,确保只有授权用户才能访问特定的镜像仓库。
例子:
- 仓库本身的性质,如果是一个公共仓库,那么公共仓库的中的镜像所有人都可以进行访问;如果私有仓库,那么一定要验证用户身份,同时用户具备正确的权限才可以访问
- 如果用户需要从一个私有仓库中拉取镜像,那么就至少需要浏览访问权限才可以实现;
- 如果用户需要向一个私有仓库推送镜像,那么就至少需要仓库的写入权限才可以实现。
- harbor 本身并没有明确的所谓读写权限,通过向用户授予角色来实现权限的划分,比如说向一个用户授予某一个私有仓库的管理员权限,这个用户就具备了对于仓库的完整控制权限。
LDAP集成:支持与LDAP服务集成,便于在企业环境中管理和认证用户身份。
1、方便企业环境下的用户统一管理
2、ldap一个基于树状结构的数据库,树状结构靠近公司组织架构,因此多用LDAP 实现企业的统一身份管理
日志审计:提供详细的日志记录功能,帮助企业进行操作跟踪和安全审计。
管理界面:提供直观的Web管理界面,方便用户进行镜像仓库的管理和维护。
自我注册:允许用户自行注册到Harbor,以便更好地管理自己的镜像和配置信息。
镜像复制:支持跨存储库的镜像复制,便于在不同位置部署和同步镜像。
漏洞扫描:新版本的Harbor(2.0以上版本)增加了扫描镜像中漏洞的功能,并将镜像标记为受信任,增强了安全性。
HTTPS支持:支持通过HTTPS协议来保护数据传输的安全性。
2.详细描述组件的功能和作用
Harbor是一个复杂的系统,它由多个组件构成,每个组件都有其特定的功能和作用。以下是Harbor主要组件的详细描述:
数据访问层:
键值对存储:使用redis,提供数据缓存功能,和job service组件的临时job提供元数据存储
数据存储:对于镜像的持久存储提供多种后端支持
数据库: 为harbor数据模型提供关系型元数据存储,比如说项目、用户胡、角色、镜像复制策略、漏洞扫描等。目前采用PostgreSQL
基础服务
- 代理:使用nginx反向代理来提供API路由策略。harbor的其他组件,比如说:核心组件、镜像服务、web端口以及token服务等,都位于反向代理后面。反向代理服务把来自web浏览器和docker客户端的请求转发其他后端服务。
- 核心组件:harbor 核心组件,主要提供以下功能:
- API服务器:一个简单的HTTP服务器,接受REST API 请求并生成响应,响应内容来自其子模块:身份认证和授权、中间件、API处理程序
- 身份认证和授权:
- 所有的请求都需要被认证服务所保护,用户的身份信息都保存本地数据库、AD/LDAP或者OIDC
- RBAC机制(基于角色授权)在进行诸如镜像拉取和上传时,来进行用户授权验证
- Token服务用来给每一个客户端在拉取上传请求时,根据用户角色进行token签发,如果来自客户端的请求没有token。那么镜像服务将会把用户请求转发给token service
- 中间件: 对客户端请求进行预处理,以决定请求是否符合服务器要求,以及是否传递给后端组件进行处理,某些功能的实现以中间件形式实现,比如说:配额管理、签名检查、漏洞检查和机器人账号检查等
- APPI处理程序:对REST API 请求进行处理,主要进行请求参数解析和有效性验证,完成相关API控制器的调用,并回写生成的响应
- 身份认证和授权:
- 配置管理器:覆盖系统内所有组件的配置,比如说:认证类型、邮件设置、证书配置等
- 项目管理:管理每一个项目的基本数据和相关元数据
- 配额管理器:管理项目的配置,并在每一个push 请求出现时,进行项目的配额检查
- Chart 管理器:反向代理chart 相关请求给chart museum,并通过一些插件的使用提供更好的chart 使用体验
- 标签保留管理器:管理标签保持策略,并完成标签保持和监控这一过程。
- 内容信任:为仓库内资源提供签名,以验证镜像的安全性,目前仅支持容器镜像签名
- 镜像复制控制器:管理镜像服务策略和镜像仓库适配器,触发并监控镜像复制过程的并发,包括以下镜像复制适配器:
- docker registry
- docker hub
- huawei SWR
- Amazon ECR
- Google GCR
- Azure ACR
- Ali ACR
- Helm hub
- Quay
- Artifactory
- GitLab Registry
- 扫描管理器:管理不同通过扫描器提供的扫描适配器,提供扫描结果报告
- 通知管理器:对于镜像状态变更进行通知
- OCI 要件管理器:管理harbor仓库内所有镜像的声明周期。
- 镜像驱动:
- API服务器:一个简单的HTTP服务器,接受REST API 请求并生成响应,响应内容来自其子模块:身份认证和授权、中间件、API处理程序
- job服务:通用作业执行队列服务,让其他组件/服务使用简单的 RESTful API 提交并发运行异步任务的请求
- 日志收集器:日志收集器负责把其他模块的日志收集到一起。
- GC控制器:管理在线 GC 计划设置并启动和跟踪 GC 进度
- Chart Museum:第三方图表存储库服务器,提供图表管理和访问 API。
- Docker Registry: 第三方注册服务器,负责存储 Docker 镜像并处理 Docker 推送/拉取命令。由于 Harbor 需要对镜像实施访问控制,因此 Registry 将引导客户端到令牌服务,以获取每个推送或拉取请求的有效令牌。
- Notary:第三方内容信任服务器,负责安全地发布和验证内容。
客户端:
作为标准的云原生镜像仓库,相关客户端将自然得到支持,例如 docker CLI、notary 客户端、OCI 兼容客户端(如 Oras)和 Helm。除了这些客户端之外,Harbor 还提供了一个 Web 门户,供管理员轻松管理和监控所有工件。
Web 门户:一个图形用户界面,帮助用户管理仓库中的镜像。
如果使用docker部署,那么这些容器之间都通过Docker内的DNS服务发现来连接通信。通过这种方式,每一个容器都可以通过相应的容器来进行访问。对于终端用户来说,只有反向代理(Nginx)服务的端口需要对外暴露。如果通过K8S部署harbor,不同组件之间的通信由coredns实现,
(1)用户登录处理流程:
假设Harbor被部署在192.168.1.10宿主机上。用户通过如下命令行发送一个登录Harbor的请求:
$ docker login 192.168.1.10
在用户输入所需要的Credentials之后(用户名和密码),Docker Client会发送一个HTTP GET请求到192.168.1.10/v2/地址处,Harbor的不同容器组件将会按照如下步骤进行处理:
(a) 首先,该请求将会被监听在80端口上的代理容器所接收到。容器中的Nginx将会把该请求转发给后端的Registry容器
(b) 由于registry容器已经被配置为基于token的认证,因此其会返回一个401错误码,用于通知docker客户端从一个指定的URL处获得一个有效的token。在Harbor中,该URL会指向Core service中的token service。
(c) 当Docker Client接收到这个错误码,其就会发送一个请求到token service URL,会根据HTTP基本认证协议在请求头中内嵌username和password相关信息
(d) 在该请求被发送到代理的80端口上后,Nginx会根据预先所配置的规则将请求转发到UI容器上。UI容器中的token service接收到该请求之后,其就会对该请求进行解码然后获得相应的用户名及密码
(e) 在成功获得用户名及密码之后,token Service就会检查mysql数据库以完成用户的认证。当token service被配置为LDAP/AD认证的时候,其就会通过外部的LDAP/AD服务来完成认证。在成功认证之后,token Service就会返回一个认证成功的http code, Http body部分会返回一个通过private key所产生的token
到这里为止,Docker login就处理完成。Docker client会将步骤(c)所产生的username及password编码后保存到一个隐藏的文件中
(2)镜像推送流程:
下图省略了代理服务器
(a) 首先,docker client执行类似登录时的流程发送一个请求到registry,然后返回一个token service的URL
(b) 然后,docker client通过提供一些额外的信息与ui/token交互以获得push镜像library/hello-world的token
(c) 在成功获得来自Nginx转发的请求之后,Token Service查询数据库以寻找用户推送镜像的角色及权限。假如用户有相应的权限,token service就会编码相应的push操作信息,并用一个private key进行签名。然后返回一个token给Docker client
(d) 在docker client获得token之后,其就会发送一个push请求到registry,在该push请求的头中包含有上面返回的token信息。一旦registry收到了该请求,其就会使用public key来解码该token,然后再校验其内容。该public key对应于token service处的private key。假如registry发现该token有效,则会开启镜像的传输流程。
3.它都有什么优点或缺点
Harbor作为一个企业级的容器镜像管理工具,它的优点和缺点都值得关注。
优点方面:
多用户管理和基于角色的访问控制:Harbor支持多用户环境,允许创建不同的用户和组织,并为他们分配不同的权限,确保了资源的安全隔离和管理的灵活性。
丰富的管理功能:Harbor为管理员提供了丰富的管理选项,包括项目隔离、存储配额、制品保留等,使得管理员可以细致地控制资源的使用和分配。
支持多种制品类型:除了容器镜像,Harbor还支持符合OCI规范的其他制品,如Helm Chart、CNAB、OPA Bundle等,这使得它可以适应更多类型的云原生应用。
安全性:Harbor提供了漏洞扫描、来源签名、不可变制品等安全功能,帮助保护存储在仓库中的镜像不受安全威胁。
缺点方面:
性能限制:在某些情况下,Harbor可能会遇到I/O带宽较低和读写延迟较高的问题,这可能会影响大规模部署时的性能。
稳定性问题:尽管Harbor是一个成熟的产品,但在特定的环境和负载下,可能会遇到稳定性方面的挑战。
配置和维护复杂度:Harbor的配置和管理可能相对复杂,需要对Docker和Kubernetes有一定的了解,以便有效地部署和维护。
- Harbor的核心功能,即存储和管理Artifact
Harbor的核心功能是存储和管理Artifact,这包括以下几个方面:
镜像仓库管理:Harbor提供了强大的镜像仓库管理功能,允许用户存储和检索Docker容器镜像。它还支持镜像搜索和标签管理,使得组织和维护容器镜像变得高效和简便。
访问控制:通过角色分配和权限管理,Harbor确保了只有授权用户才能访问特定的Artifact。这有助于保护敏感数据并防止未经授权的访问。
命令行工具支持:Harbor允许用户使用命令行工具对容器镜像及其他Artifact进行推送和拉取,这为用户提供了灵活的操作方式。
资源配额管理:Harbor还提供了资源配额的功能,可以基于项目而非用户来设置存储总量的限制,这有助于合理分配和监控存储资源的使用。
垃圾回收机制:当用户在Harbor中删除Artifact时,实际上是进行了“软删除”,即只删除了Artifact对应的数据记录,而没有删除存储。Harbor提供了垃圾回收机制来自动管理存储资源,释放不再使用的存储空间。
5.Harbor的漏洞扫描和镜像签名功能
Harbor的漏洞扫描和镜像签名功能是其核心特性之一,它们为容器镜像的安全性提供了重要支持。
漏洞扫描功能:
集成漏洞扫描工具:Harbor可以与漏洞扫描工具如Trivy集成,以便于在镜像被推送到仓库之前进行自动扫描。
扫描过程:漏洞扫描工具会从Harbor镜像仓库中拉取镜像,并对其进行分析,以识别潜在的安全漏洞。
安全性强化:通过漏洞扫描,Harbor帮助确保存储在仓库中的容器镜像不含有已知的安全漏洞,从而保护企业应用的安全。
镜像签名功能:
签名机制:Harbor支持对容器镜像进行数字签名,确保镜像的来源和完整性。
信任和验证:用户可以通过验证镜像签名来确保所下载的镜像是由可信的开发者或组织发布的,并且未被篡改。
标准化格式:Harbor支持的镜像格式包括Docker的标准镜像格式以及遵循Open Container Initiative(OCI)规范的格式,这意味着它能够处理各种标准的容器镜像。
6. Helm Chart、CNAB、OPA Bundle等符合OCI规范的制品的管理
Harbor 2.0作为一个符合OCI(Open Container Initiative)规范的开源镜像仓库,它能够存储和管理多种云原生工件,例如容器镜像、Helm Chart、OPA、Singularity等。这些制品都可以通过Harbor进行分发和管理。具体来说,以下是关于这些制品的一些管理细节:
Helm Chart:Helm是Kubernetes的包管理器,而Helm Chart是预先配置的Kubernetes应用包。在Harbor中,Helm Chart可以作为Artifact存储和管理,而且随着社区对兼容OCI规范的Helm Chart的接受度提高,Harbor支持不再依赖ChartMuseum进行Helm Chart的管理。
CNAB:CNAB是Cloud Native Application Bundle的缩写,是一种用于封装云原生应用的文件格式。在Harbor中,它们可以被当作OCI Artifacts来处理,这意味着它们可以按照OCI的分发规范被推送到仓库和从仓库拉取。
OPA Bundle:OPA是Open Policy Agent的简称,是一种开源的、通用的策略引擎。OPA Bundle是包含策略文件和配置文件的压缩包,同样可以在Harbor中以OCI Artifact的形式存储和管理。
- 漏洞扫描工具Trivy
Trivy是一个开源的容器镜像安全漏洞扫描工具。以下是Trivy的一些主要特点和优势:
全面性:Trivy能够检测操作系统包(如Alpine、RHEL、CentOS等)和应用程序依赖(如Bundler、Composer、npm、yarn等)的漏洞。这使它能够在多个层面上确保容器镜像的安全性。
简易性:Trivy的使用非常方便,只需安装二进制文件即可开始扫描。用户只需指定容器的镜像名称,就可以进行漏洞检测。
集成性:Trivy特别适合在持续集成(CI)环境中使用,可以方便地集成到DevOps流程中,确保在容器镜像被推送到仓库之前进行安全检查。
更新性:为了保持漏洞库的最新状态,Trivy会定期更新其漏洞数据库,以便能够识别最新的安全威胁。
准确性:Trivy在准确性方面表现出色,它通过对比漏洞库中的数据来识别潜在的安全问题。
社区支持:作为一个开源项目,Trivy拥有一个活跃的社区,用户可以从社区获得支持和最新的安全信息。
平台支持:Trivy支持多种平台,包括Java相关的漏洞检测,这意味着它能够识别与Java相关的安全漏洞
harbor的安装与使用:
实验环境简介:
- 使用独立主机部署harbor
- 使用docker compose 完成harbor部署
- 后期使用harbor 中的镜像来部署应用
配置网络
主机名:
修改sshd允许root登录
过程省略:
[root@harbor ~]# setenforce 0
[root@harbor ~]# sed -i "s/enforcing/permissive/g" /etc/selinux/config
[root@harbor ~]# systemctl disable --now firewalld.service
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
配置docker 仓库并安装docker docker compose 相关命令
[root@harbor ~]# cat /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/debug-$basearch/stable
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=https://download.docker.com/linux/centos/$releasever/source/stable
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-test]
name=Docker CE Test - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/debug-$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://download.docker.com/linux/centos/$releasever/source/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-nightly]
name=Docker CE Nightly - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/debug-$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://download.docker.com/linux/centos/$releasever/source/nightly
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[root@harbor ~]# yum remove podman -y
[root@harbor ~]# yum -y install docker-ce docker-ce-cli docker-buildx-plugin docker-compose-plugin
[root@harbor ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /
[root@harbor ~]# systemctl is-active docker.service
active
上传harbor安装包:
下载地址见群聊消息:
右键点击下载离线安装包,并上传到harbor安装虚拟机
预先配置harbor通信需要使用的tsl证书
[root@harbor ~]# mkdir /data/certs -p
[root@harbor ~]# cd /data/certs/
[root@harbor certs]# pwd
/data/certs
[root@harbor certs]# openssl genrsa -out ca.key 4096
[root@harbor certs]# openssl req -x509 -new -nodes -sha512 -days 3650 \
> -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=MyPersonal Root CA" \
> -key ca.key \
> -out ca.crt
[root@harbor certs]# ls
ca.crt ca.key
[root@harbor certs]# openssl genrsa -out harbor.mydomain.com.key 4096
[root@harbor certs]# ls
ca.crt ca.key harbor.mydomain.com.key
[root@harbor certs]# openssl req -sha512 -new \
> -key harbor.mydomain.com.key \
> -out harbor.mydomain.com.csr \
> -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.mydomain.com"
[root@harbor certs]# ls
ca.crt ca.key harbor.mydomain.com.csr harbor.mydomain.com.key
[root@harbor certs]# vim v3.ext
[root@harbor certs]# cat v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.mydomain.com
DNS.2=mydomain.com
DNS.3=harbor
[root@harbor certs]# openssl x509 -req -sha512 -days 3650 \
> -extfile v3.ext \
> -CA ca.crt -CAkey ca.key -CAcreateserial \
> -in harbor.mydomain.com.csr \
> -out harbor.mydomain.com.crt
Certificate request self-signature ok
subject=C=CN, ST=Beijing, L=Beijing, O=example, OU=Personal, CN=harbor.mydomain.com
[root@harbor certs]# ls
ca.crt ca.srl harbor.mydomain.com.csr v3.ext
ca.key harbor.mydomain.com.crt harbor.mydomain.com.key
[root@harbor certs]# openssl x509 -inform PEM \
> -in harbor.mydomain.com.crt \
> -out harbor.mydomain.com.cert
[root@harbor certs]# ls
ca.crt harbor.mydomain.com.cert harbor.mydomain.com.key
ca.key harbor.mydomain.com.crt v3.ext
ca.srl harbor.mydomain.com.csr
[root@harbor certs]# mkdir /etc/docker/certs.d/harbor.mydomain.com -p
[root@harbor certs]#
[root@harbor certs]# cp ca.crt /etc/docker/certs.d/harbor.mydomain.com/
[root@harbor certs]# cp harbor.mydomain.com.cert /etc/docker/certs.d/harbor.mydomain.com/
[root@harbor certs]# cp harbor.mydomain.com.key /etc/docker/certs.d/harbor.mydomain.com/
[root@harbor certs]# systemctl restart docker
此时docker 就可以使用加密证书与harbor进行通信
解压harbor安装包,开始安装:
[root@harbor certs]# cd ~
[root@harbor ~]# ls harbor-offline-installer-v1.10.19.tgz
harbor-offline-installer-v1.10.19.tgz
[root@harbor ~]# tar -zxf harbor-offline-installer-v1.10.19.tgz -C /usr/src/
[root@harbor ~]# cd /usr/src/harbor/
[root@harbor harbor]# ls
common.sh harbor.v1.10.19.tar.gz harbor.yml install.sh LICENSE prepare
[root@harbor harbor]# cp harbor.yml harbor-install-config.bak
[root@harbor harbor]# vim harbor.yml
harbor.yml 需要进行的修改:
[root@harbor harbor]# vim common.sh
[root@harbor harbor]# vim install.sh
[root@harbor harbor]# sudo ./install.sh
等待运行完毕,成功运行完毕后,出现如下提示,中间出现的warning告警可以忽略。
提示启动完成后,打开浏览器输入harbor仓库地址进行访问:
使用默认管理员用户以及密码登录
admin: Harbor12345
登录后选择新建项目,设置项目为非公开项目
使用docker命令上传下载镜像:
[root@harbor harbor]# docker login harbor.mydomain.com
Username: admin
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/#credential-stores
Login Succeeded
[root@harbor harbor]# ls ~/.docker/
config.json
[root@harbor harbor]# cat ~/.docker/config.json
{
"auths": {
"harbor.mydomain.com": {
"auth": "YWRtaW46SGFyYm9yMTIzNDU="
}
}
}
[root@harbor harbor]# docker tag goharbor/clair-adapter-photon:v1.10.19 \
> harbor.mydomain.com/myproject/clair-adapter-photon:v1.10.19
注意需要推送到harbor仓库的镜像命令格式为 harbor主机地址or 主机名/harbor内仓库名/镜像名:标签
[root@harbor harbor]# docker push harbor.mydomain.com/myproject/clair-adapter-photon:v1.10.19
The push refers to repository [harbor.mydomain.com/myproject/clair-adapter-photon]
2b3f1f5ea1dc: Pushed
52bdf6981973: Pushed
fdd5e67f8d66: Pushed
48e3b59d8489: Pushed
v1.10.19: digest: sha256:899668c7124229a5b15bd80f00466c0ed7d8911460ee8421839d7fecad92fc43 size: 1162
[root@harbor harbor]# docker rmi harbor.mydomain.com/myproject/clair-adapter-photon:v1.10.19
Untagged: harbor.mydomain.com/myproject/clair-adapter-photon:v1.10.19
Untagged: harbor.mydomain.com/myproject/clair-adapter-photon@sha256:899668c7124229a5b15bd80f00466c0ed7d8911460ee8421839d7fecad92fc43
[root@harbor harbor]# docker pull harbor.mydomain.com/myproject/clair-adapter-photon:v1.10.19
v1.10.19: Pulling from myproject/clair-adapter-photon
Digest: sha256:899668c7124229a5b15bd80f00466c0ed7d8911460ee8421839d7fecad92fc43
Status: Downloaded newer image for harbor.mydomain.com/myproject/clair-adapter-photon:v1.10.19
harbor.mydomain.com/myproject/clair-adapter-photon:v1.10.19
[root@harbor harbor]# docker images
验证是够拉取成功
在浏览器中查看上传的镜像
对于harbor的启动和停止,通过docker cmpose 控制,最好在harbor的解压目录下执行,
启动命令 docker compose up -d
停止命令: docker compose down
状态检查: docker compose stats