Bootstrap

Docker-Harbor私有仓库部署与管理

前言

在软件开发和部署环境中,部署私有 Docker 仓库变得越来越普遍和重要。私有仓库为组织和开发团队提供了许多优势和控制权,使他们能够更好地管理和保护他们的容器镜像。本文将介绍如何使用 Docker Harbor 搭建私有仓库,并探讨其管理和维护方面的关键内容。

目录

一、搭建本地私有仓库

1. 下载 registry 镜像

2. 在 daemon.json 文件中添加私有镜像仓库地址

3. 运行 registry 容器

4. 上传镜像

4.1 为镜像记录标签

4.2 上传到私有仓库

4.3 列出私有仓库的所有镜像

4.4 列出私有仓库的 nginx 镜像有哪些 tag

5. 验证私有仓库功能

二、Harbor 简介

1. 什么是 Harbor

2. Harbor 的特性

3. Harbor 的构成 

4. Harbor 私有仓库数据流向

三、部署 Harbor 服务 

1. 环境准备

2. 部署 Docker-Compose 服务

3. 部署 Harbor 服务

3.1 下载或上传 Harbor 安装程序

3.2 修改 harbor 安装的配置文件

4. 启动 Harbor

5. 查看 Harbor 启动镜像

6. 创建一个新项目

7. 在其他客户端上传镜像

四、维护管理 Harbor 

1. 通过 Harbor Web 创建项目

2. 创建 Harbor 用户

2.1 创建用户并分配权限

2.2 添加项目成员

2.3 在客户端上使用普通账户操作镜像

3. 查看日志

4. 修改 Harbor.cfg 配置文件 

5. 移除 Harbor 服务容器同时保留镜像数据/数据库,并进行迁移

5.1 移除 Harbor 服务容器

5.2 把项目中的镜像数据进行打包

6. 如需重新部署,需要移除 Harbor 服务容器全部数据


一、搭建本地私有仓库

1. 下载 registry 镜像

Registry 镜像是 Docker 镜像的一种特殊类型,用于存储和管理 Docker 镜像。它是一个用来保存 Docker 镜像的集中存储库,可以被 Docker 守护进程访问。

[root@localhost ~]# docker pull registry
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
registry     latest    d6b2c32a0f14   7 months ago   25.4MB

2. 在 daemon.json 文件中添加私有镜像仓库地址

[root@localhost ~]# vim /etc/docker/daemon.json
{
  "insecure-registries": ["192.168.190.107:5000"],  # 私有镜像仓库地址,注意逗号
  "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
# 浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置
}
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker.service

3. 运行 registry 容器

[root@localhost ~]# docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
70b9f4ae06ba5d222b19cf666488d3c66f37749556b38a3193c74ea006621fb8
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                   CREATED         STATUS         PORTS                                       NAMES
70b9f4ae06ba   registry:latest   "/entrypoint.sh /etc…"   4 seconds ago   Up 3 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry

# -itd:在容器中打开一个伪终端进行交互操作,并在后台运行
# -v:把宿主机的/data/registry目录绑定到容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化;
# -p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了
# --restart=always:这是重启的策略,在容器退出时总是重启容器
# --name registry:创建容器命名为registry
# registry:latest:这个是刚才pull下来的镜像

Docker容器的重启策略如下:
# no:默认策略,在容器退出时不重启容器
# on-failure:在容器非正常退出时(退出状态非0),才会重启容器
# on-failure:3 :在容器非正常退出时重启容器,最多重启3次
# always:在容器退出时总是重启容器
# unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

4. 上传镜像

4.1 为镜像记录标签

[root@localhost ~]# docker pull nginx   # 下载nginx镜像
[root@localhost ~]# docker tag nginx:latest 192.168.190.107:5000/nginx:v1
# 192.168.190.107:5000/centos:v1: 这是新的标签,它包含了两部分信息。192.168.190.107:5000 是 Registry 的地址,表示你要将这个镜像推送到指定的 Registry。centos:v1 则是新的标签,表示将原本的 nginx:latest 镜像打上一个新的标签为 nginx:v1。
[root@localhost ~]# docker images
REPOSITORY                   TAG       IMAGE ID       CREATED        SIZE
192.168.190.107:5000/nginx   v1        7383c266ef25   11 days ago    188MB
nginx                        latest    7383c266ef25   11 days ago    188MB
registry                     latest    d6b2c32a0f14   7 months ago   25.4MB

4.2 上传到私有仓库

[root@localhost ~]# docker push 192.168.190.107:5000/nginx:v1
# 将本地的镜像 192.168.190.107:5000/nginx:v1 推送(上传)到 Registry 地址 192.168.190.107:5000 中
The push refers to repository [192.168.190.107:5000/nginx]
9fd54926bcae: Pushed 
175aa66db4cc: Pushed 
e6380a7057a5: Pushed 
1db2242fc1fa: Pushed 
b09347a1aec6: Pushed 
bbde741e108b: Pushed 
52ec5a4316fa: Pushed 
v1: digest: sha256:810ca58c5f0e8e3bc8b5414028cfd09322757c74b0384e601a98a1e8c8513707 size: 1778

4.3 列出私有仓库的所有镜像

[root@localhost ~]# curl http://192.168.190.107:5000/v2/_catalog
# v2/_catalog API 端点是 Docker Registry 提供的一个用于获取仓库列表的接口,帮助用户更好地管理和组织他们的容器镜像
{"repositories":["nginx"]}
# Registry 中仅有一个名为 nginx 的仓库

4.4 列出私有仓库的 nginx 镜像有哪些 tag

[root@localhost ~]# curl http://192.168.190.107:5000/v2/nginx/tags/list
# 获取指定镜像 nginx 在 Registry 中的所有标签(tags)列表
{"name":"nginx","tags":["v1"]}
# 在 Docker Registry 中的 nginx 镜像仓库中,只有一个名为 v1 的标签

5. 验证私有仓库功能

先删除原有的 nginx 的镜像,再测试私有仓库下载

[root@localhost ~]# docker rmi 192.168.190.107:5000/nginx:v1 
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    7383c266ef25   11 days ago    188MB
registry     latest    d6b2c32a0f14   7 months ago   25.4MB
[root@localhost ~]# docker pull 192.168.190.107:5000/nginx:v1
[root@localhost ~]# docker images
REPOSITORY                   TAG       IMAGE ID       CREATED        SIZE
192.168.190.107:5000/nginx   v1        7383c266ef25   11 days ago    188MB
nginx                        latest    7383c266ef25   11 days ago    188MB
registry                     latest    d6b2c32a0f14   7 months ago   25.4MB

二、Harbor 简介

1. 什么是 Harbor

Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。

Harbor 以 Docker 公司开源的 Registry 为基础,提供了图形管理 UI 、基于角色的访问控制(Role Based AccessControl) 、AD/LDAP 集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。

  • AD:提供了集中式的身份管理服务,允许管理员在一个集中的数据库中管理用户、计算机和其他资源,同时提供了访问控制和安全性功能。
  • LDAP:轻量级的数据库,是一个开放的标准协议,用于在网络上访问和管理分布式目录信息,通常用于实现用户身份验证、授权和其他目录服务。

Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 docker-compose 来对它进行部署。用于部署 Harbor 的 docker-compose 模板位于 harbor/docker-compose.yml。

2. Harbor 的特性

  • 基于角色控制:用户和仓库都是基于项目进行组织的,而用户在项目中可以拥有不同的权限。
  • 基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制(同步)。
  • 支持 LDAP/AD:Harbor 可以集成企业内部已有的 AD/LDAP(类似数据库的一张表),用于对已经存在的用户认证和管理。
  • 镜像删除和垃圾回收:镜像可以被删除,也可以回收镜像占用的空间。
  • 图形化用户界面:用户可以通过浏览器来浏览,搜索镜像仓库以及对项目进行管理。
  • 审计管理:所有针对镜 像仓库的操作都可以被记录追溯,用于审计管理。
  • 支持 RESTful API:RESTful API 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易。
  • Harbor 和 docker registry 的关系:Harbor实质上是对 docker registry 做了封装,扩展了自己的业务模板。

3. Harbor 的构成 

Harbor 在架构上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 六个组件。

① Proxy

  • 反向代理,通过一个前置的发现代理统一接收浏览器、docker 客户端的请求转发给后端的不同的服务;

② Registry

  • 负责存储 docker 镜像,处理 docker pull/push 命令来做上传/下载;

③ Core services

Harbor 的核心功能,包括:

  • ui:提供图像界面
  • webhook:网站一些服务功能(通知机制)
  • token:令牌,提供身份验证服务

④ Log collector(Harbor-log)

  • 负责日志(其他的组件日志,上传下载、用户访问等)收集以供后期进行分析和健康检查等;

⑤ Database(Harbor-db)

  • 为核心组件提供数据库服务,主要记录数据库镜像的元信息,以及用户的身份信息;

⑥ Job services

  • 主要用于镜像复制,本地镜像可以被同步到远程 Harbor 实例上;

⑦ adminserver

  • 管理员用于管理用户操作以及身份认证等。

认证方式:

  • 扩展认证:通常指的是使用外部身份验证系统(比如 LDAP、AD 等)来进行用户身份验证;
  • 令牌认证:是一种基于令牌(Token)的身份验证方式;
  • 用户密码认证:用户需要提供其用户名和密码来验证身份;
  • SSL认证: SSL 认证通过在客户端和服务器之间建立安全的加密连接来验证身份。

Harbor 的每个组件都是以 Docker 容器的形式构建的,因此,使用 Docker Compose 来对它进行部署。总共分为7个容器运行,通过在docker-compose.yml所在目录中执行 docker-compose ps 命令来查看, 名称分别为:nginx、harbor-jobservice、harbor-ui、harbor-db、harbor-adminserver、registry、harbor-log。其中 harbor-adminserver 主要是作为一个后端的配置数据管理,并没有太多的其他功能。harbor-ui 所要操作的所有数据都通过 harbor-adminserver 这样一个数据配置管理中心来完成。 

4. Harbor 私有仓库数据流向

① 所有的请求或认为的操作都会首先交给 proxy(反向代理) 

② proxy 会先将请求转发给后端 Core services(核心服务),Core services 中包含:UI、token(身份验证服务)、webhook(网站的一些服务功能)

③ 转发给 registry(镜像存储),若需要下载镜像等权限操作,需要通过 Core services 中的 token 令牌的身份验证服务才行

④ 每一次下载和上传都产生操作记录,生成日志,保存至 database 中

⑤ database 记录保存镜像的元信息及用户与组的身份信息,通过验证授权才能允许相关操作

三、部署 Harbor 服务 

1. 环境准备

节点IP安装服务docker 版本
Harbor 服务器192.168.190.107docker-ce、docker-compose、harbor-offline-v1.2.220.10.17
client 服务器192.168.190.108docker-ce20.10.17

Docker-CE:Docker CE 是 Docker 公司推出的免费版本的 Docker 引擎;

Docker-Compose:是 Docker 官方提供的一个工具,用于定义和运行多个容器化应用程序的工具。通过一个单独的 docker-compose.yml 配置文件,可以定义应用程序的服务、网络、卷等信息,然后使用 docker-compose 命令进行统一的管理和操作;

Harbor Offline Installer v1.2.2:Harbor 是一个企业级的 Docker 镜像仓库管理系统,提供了图形管理界面、安全访问控制、LDAP/AD 集成等功能,用于存储、管理和分发 Docker 镜像。

2. 部署 Docker-Compose 服务

[root@localhost ~]# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# `uname -s`-`uname -m`也可以写成$(uname -s) 和 $(uname -m):分别会自动替换为你的系统类型(如:Linux)和机器架构(如:x86_64),确保你下载的是适合你系统的版本。
# curl -L:这部分表示使用curl命令进行下载,并且使用-L参数来跟随重定向
# -o /usr/local/bin/docker-compose: 表示将下载的文件保存为/usr/local/bin目录下的docker-compose文件
[root@localhost bin]# pwd
/usr/local/bin
[root@localhost bin]# ls
docker-compose
[root@localhost bin]# chmod +x /usr/local/bin/docker-compose
[root@localhost bin]# ll
总用量 10616
-rwxr-xr-x. 1 root root 10867152 5月   4 20:08 docker-compose
[root@localhost bin]# docker-compose --version     # 查看版本
docker-compose version 1.25.0-rc4, build 8f3c9c58

3. 部署 Harbor 服务

3.1 下载或上传 Harbor 安装程序

[root@localhost opt]# wget http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz
[root@localhost opt]# ls
harbor-offline-installer-v1.2.2.tgz
[root@localhost opt]# tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/

3.2 修改 harbor 安装的配置文件

[root@localhost opt]# vim /usr/local/harbor/harbor.cfg
  5 hostname = 192.168.190.107          # 设置为Harbor服务器的IP地址或者域名
 59 harbor_admin_password = Harbor12345 # 指定管理员的初始密码,默认的用户名/密码是admin/Harbor12345

关于 Harbor.cfg 配置文件中有两类参数:所需参数和可选参数

(1)所需参数:这些参数需要在配置文件 Harbor.cfg 中设置。如果用户更新它们并运行 install.sh 脚本重新安装 Harbor, 参数将生效。具体参数如下: 

  • hostname:用于访问用户界面和 register 服务。它应该是目标机器的 IP 地址或完全限定的域名(FQDN),例如 192.168.10.23 或 hub.kgc.cn。不要使用 localhost 或 127.0.0.1 为主机名。
  • ui_url_protocol:(http 或 https,默认为 http)用于访问 UI 和令牌/通知服务的协议。如果公证处于启用状态,则此参数必须为 https。
  • max_job_workers:镜像复制作业线程。
  • db_password:用于db_auth 的MySQL数据库root 用户的密码。
  • customize_crt:该属性可设置为打开或关闭,默认打开。打开此属性时,准备脚本创建私钥和根证书,用于生成/验证注册表令牌。当由外部来源提供密钥和根证书时,将此属性设置为 off。
  • ssl_cert:SSL 证书的路径,仅当协议设置为 https 时才应用。
  • secretkey_path:用于在复制策略中加密或解密远程 register 密码的密钥路径。

(2)可选参数:这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动 Harbor 后在 Web UI 上进行更新。如果进入 Harbor.cfg,只会在第一次启动 Harbor 时生效,随后对这些参数的更新,Harbor.cfg 将被忽略。

注意:如果选择通过 UI 设置这些参数,请确保在启动 Harbor 后立即执行此操作。具体来说,必须在注册或在 Harbor 中创建任何新用户之前设置所需的 auth_mode。当系统中有用户时(除了默认的 admin 用户), auth_mode 不能被修改。 具体参数如下:

  • Email:Harbor 需要该参数才能向用户发送“密码重置”电子邮件,并且只有在需要该功能时才启用。请注意,在默认情况下 SSL 连接时没有启用。如果 SMTP 服务器需要 SSL,但不支持 STARTTLS,那么应该通过设置启用 SSL email_ssl = TRUE。
  • harbor_admin_password:管理员的初始密码,只在 Harbor 第一次启动时生效。之后, 此设置将被忽略,并且应在 UI 中设置管理员的密码。请注意,默认的用户名/密码是admin/Harbor12345。
  • auth_mode:使用的认证类型,默认情况下,它是 db_auth,即凭据存储在数据库中。对于LDAP身份验证,请将其设置为 ldap_auth。
  • self_registration:启用/禁用用户注册功能。禁用时,新用户只能由 Admin 用户创建,只有管理员用户可以在 Harbor 中创建新用户。注意:当 auth_mode 设置为 ldap_auth 时,自注册功能将始终处于禁用状态,并且该标志被忽略。
  • Token_expiration:由令牌服务创建的令牌的到期时间(分钟),默认为 30 分钟。
  • project_creation_restriction:用于控制哪些用户有权创建项目的标志。默认情况下,每个人都可以创建一个项目。 如果将其值设置为“adminonly”,那么只有 admin 可以创建项目。
  • verify_remote_cert:打开或关闭,默认打开。此标志决定了当Harbor与远程 register 实例通信时是否验证 SSL/TLS 证书。 将此属性设置为 off 将绕过 SSL/TLS 验证,这在远程实例具有自签名或不可信证书时经常使用。

另外,默认情况下,Harbor 将镜像存储在本地文件系统上。在生产环境中,可以考虑 使用其他存储后端而不是本地文件系统,如 S3、Openstack Swif、Ceph 等对象存储。但需要更新 common/templates/registry/config.yml 文件。

Harbor的默认镜像存储路径在 /data/registry 目录下,映射到docker容器里面的 /storage 目录下。
这个参数是在 docker-compose.yml 中指定的,在 docker-compose up -d 运行之前修改。
如果希望将 Docker 镜像存储到其他的磁盘路径,可以修改这个参数。

4. 启动 Harbor

在配置好了 harbor.cfg 之后,执行 ./prepare 命令(可选),为 harbor 启动的容器生成一些文件(环境),再执行命令 ./install.sh 以 pull 镜像并启动容器。

[root@localhost opt]# cd /usr/local/harbor/
[root@localhost harbor]# ls
common                     docker-compose.yml     harbor.v1.2.2.tar.gz  NOTICE
docker-compose.clair.yml   harbor_1_1_0_template  install.sh            prepare
docker-compose.notary.yml  harbor.cfg             LICENSE               upgrade
[root@localhost harbor]# ./prepare
[root@localhost harbor]# ./install.sh

5. 查看 Harbor 启动镜像

[root@localhost harbor]# docker-compose ps
       Name                     Command               State                   Ports                
---------------------------------------------------------------------------------------------------
harbor-adminserver   /harbor/harbor_adminserver       Up                                           
harbor-db            docker-entrypoint.sh mysqld      Up      3306/tcp                             
harbor-jobservice    /harbor/harbor_jobservice        Up                                           
harbor-log           /bin/sh -c crond && rm -f  ...   Up      127.0.0.1:1514->514/tcp              
harbor-ui            /harbor/harbor_ui                Up                                           
nginx                nginx -g daemon off;             Up      0.0.0.0:443->443/tcp,:::443->443/tcp,
                                                              0.0.0.0:4443->4443/tcp,:::4443->4443/
                                                              tcp, 0.0.0.0:80->80/tcp,:::80->80/tcp
registry             /entrypoint.sh serve /etc/ ...   Up      5000/tcp     

6. 创建一个新项目

(1)浏览器访问:http://192.168.190.107 登录 Harbor WEB UI 界面,默认的管理员用户名和密码是 admin/Harbor12345

(2)输入用户名和密码登录界面后可以创建一个新项目。点击“+项目”按钮 

(3)填写项目名称为“myproject-1”,点击“确定”按钮,创建新项目

(4)此时可使用 Docker 命令在本地通过 127.0.0.1 来登录和推送镜像。默认情况下,Registry 服务器在端口 80 上侦听。

① 登录 Harbor

[root@localhost harbor]# docker login -u admin -p Harbor12345 http://127.0.0.1

② 下载镜像进行测试

[root@localhost harbor]# docker pull nginx

③ 将镜像打标签

格式:docker tag 镜像:标签  仓库IP/项目名称/镜像名:标签

[root@localhost harbor]# docker tag nginx:latest 127.0.0.1/myproject-1/nginx:v1
[root@localhost harbor]# docker images
nginx                         latest            605c77e624dd   2 years ago   141MB
127.0.0.1/myproject-1/nginx   v1                605c77e624dd   2 years ago   141MB

④ 上传镜像到 Harbor

[root@localhost harbor]# docker push 127.0.0.1/myproject-1/nginx:v1

(5)在 Harbor 界面 myproject-1 目录下可看见此镜像及相关信息

7. 在其他客户端上传镜像

 以上操作都是在 Harbor 服务器本地操作。如果其他客户端登录到 Harbor,就会报如下错误。出现这问题的原因为Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜像默认使用的是 HTTP 服务,所以与私有镜像交互时出现以下错误。

其他客户端尝试登录:

[root@localhost ~]# docker login -u admin -p Harbor12345 http://192.168.190.107
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get "https://192.168.190.107/v2/": dial tcp 192.168.190.107:443: connect: connection refused
# 目标服务器拒绝了连接

(1)在 Docker 客户端配置操作

① 解决方法

解决办法一:在 Docker server 启动的时候,增加启动参数,默认使用 HTTP 访问。

[root@localhost ~]# vim /usr/lib/systemd/system/docker.service
 13 ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.190.107 --containerd=/run/contain    erd/containerd.sock
或
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.190.107

解决办法二:修改 daemon.json 配置

[root@localhost ~]# vim /etc/docker/daemon.json
{
  "insecure-registries": ["192.168.190.107"],  # 不要重复办法一,否则会冲突
  "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}

② 重启 Docker,再次登录

[root@localhost ~]# systemctl daemon-reload 
[root@localhost ~]# systemctl restart docker

③ 再次登录 Harbor

[root@localhost ~]# docker login -u admin -p Harbor12345 http://192.168.190.107
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
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@localhost ~]# cat /root/.docker/config.json
{
	"auths": {
		"192.168.190.107": {
			"auth": "YWRtaW46SGFyYm9yMTIzNDU="
		}
	}
}
# 将自动保存凭据到/root/.docker/config.json,下次登录时可直接使用凭据登录 Harbor

④ 下载镜像进行测试

[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[root@localhost ~]# docker pull 192.168.190.107/myproject-1/nginx:v1
[root@localhost ~]# docker images
REPOSITORY                          TAG       IMAGE ID       CREATED       SIZE
192.168.190.107/myproject-1/nginx   v1        605c77e624dd   2 years ago   141MB

⑤ 上传镜像进行测试

[root@localhost ~]# docker pull cirros
[root@localhost ~]# docker tag cirros:latest 192.168.190.107/myproject-1/cirros:v2
[root@localhost ~]# docker push 192.168.190.107/myproject-1/cirros:v2

(2)刷新 Harbor 的 Web 管理界面进行查看,会发现 myproject-1 项目里面有两个镜像

四、维护管理 Harbor 

1. 通过 Harbor Web 创建项目

在 Harbor 仓库中,任何镜像在被 push 到 regsitry 之前都必须有一个自己所属的项目。
单击“+项目”,填写项目名称,项目级别若设置为"私有",则不勾选。如果设置为公共仓库,则所有人对此项目下的镜像拥有读权限,命令行中不需要执行"Docker login"即可下载镜像,镜像操作与 Docker Hub 一致。

2. 创建 Harbor 用户

2.1 创建用户并分配权限

在 Web 管理界面中单击系统管理 -> 用户管理 -> +用户,
填写用户名为“zs”,邮箱为“[email protected]”,全名为“zhangsan”,密码为“Abc123456”,注释为“管理员”(可省略)。
附:用户创建成功后,单击左侧“...(竖着的三个点)”按钮可将上述创建的用户设置为管理员角色或进行删除操作,本例不作任何设置。

2.2 添加项目成员

单击项目 -> myproject-1-> 成员 -> + 成员,填写上述创建的用户 zs 并分配角色为“开发人员”。
附:此时单击左侧“...”按钮仍然可对成员角色进行变更或者删除操作

2.3 在客户端上使用普通账户操作镜像

① 删除上述打标签的本地镜像

[root@localhost ~]# docker rmi 192.168.190.107/myproject-1/cirros:v2
[root@localhost ~]# docker images
REPOSITORY                          TAG       IMAGE ID       CREATED       SIZE
192.168.190.107/myproject-1/nginx   v1        605c77e624dd   2 years ago   141MB
cirros                              latest    f9cae1daf5f6   3 years ago   12.6MB

② 先退出当前用户,然后使用上述创建的账户 zs 登录

[root@localhost ~]# docker logout 192.168.190.107
Removing login credentials for 192.168.190.107
[root@localhost ~]# docker login -u zs -p Abc123456 http://192.168.190.107
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
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@localhost ~]# docker pull 192.168.190.107/myproject-1/cirros:v2
[root@localhost ~]# docker images | grep v2
192.168.190.107/myproject-1/cirros   v2        f9cae1daf5f6   3 years ago   12.6MB

[root@localhost ~]# docker tag cirros:latest 192.168.190.107/myproject-1/cirros:v3
[root@localhost ~]# docker push 192.168.190.107/myproject-1/cirros:v3

3. 查看日志

Web 界面日志,操作日志按时间顺序记录用户相关操作

4. 修改 Harbor.cfg 配置文件 

在 Harbor 服务器上操作:

要更改 Harbor的配置文件中的可选参数时,请先停止现有的 Harbor实例并更新 Harbor.cfg;然后运行 prepare 脚本来填充配置; 最后重新创建并启动 Harbor 的实例。

使用 docker-compose 管理 Harbor 时,必须在与 docker-compose.yml 相同的目录中运行。

[root@localhost harbor]# cd /usr/local/harbor
[root@localhost harbor]# docker-compose down -v
Stopping harbor-jobservice  ... done
Stopping nginx              ... done
Stopping harbor-ui          ... done
Stopping harbor-db          ... done
Stopping harbor-adminserver ... done
Stopping registry           ... done
Stopping harbor-log         ... done
Removing harbor-jobservice  ... done
Removing nginx              ... done
Removing harbor-ui          ... done
Removing harbor-db          ... done
Removing harbor-adminserver ... done
Removing registry           ... done
Removing harbor-log         ... done
Removing network harbor_harbor
[root@localhost harbor]# vim harbor.cfg   # 只能修改可选参数
[root@localhost harbor]# ./prepare
[root@localhost harbor]# docker-compose up -d
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating registry           ... done
Creating harbor-db          ... done
Creating harbor-adminserver ... done
Creating harbor-ui          ... done
Creating harbor-jobservice  ... done
Creating nginx              ... done

如果有以下报错,需要开启防火墙 firewalld 服务解决:
Creating network "harbor_harbor" with the default driver
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule:  (iptables failed: iptables --wait -t nat -I DOCKER -i br-b53c314f45e8 -j RETURN: iptables: No chain/target/match by that name.
 (exit status 1))

systemctl restart firewalld.service
docker-compose up -d

5. 移除 Harbor 服务容器同时保留镜像数据/数据库,并进行迁移

在 Harbor 服务器上操作:

5.1 移除 Harbor 服务容器

[root@localhost harbor]# cd /usr/local/harbor
[root@localhost harbor]# docker-compose down -v

5.2 把项目中的镜像数据进行打包

持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的/var/log/Harbor/目录下

[root@localhost harbor]# ls /data/registry/docker/registry/v2/repositories/myproject-1/
cirros  nginx
[root@localhost harbor]# cd /data/registry/docker/registry/v2/repositories/myproject-1/
[root@localhost myproject-1]# tar zcvf registry.tar.gz ./*
[root@localhost myproject-1]# ls
cirros  nginx  registry.tar.gz

6. 如需重新部署,需要移除 Harbor 服务容器全部数据

cd /usr/local/harbor
docker-compose down -v
rm -r /data/database
rm -r /data/registry
;