龙空技术网

运维必备技能:Docker私有仓库部署和管理

删库跑路吧 1677

前言:

而今兄弟们对“nginx g daemon off”大致比较重视,小伙伴们都想要分析一些“nginx g daemon off”的相关文章。那么小编也在网上收集了一些对于“nginx g daemon off””的相关知识,希望我们能喜欢,小伙伴们一起来学习一下吧!

技能目标:

· 掌握Harbor工作原理

· 掌握Harbor安装部署

· 掌握Harbor日常操作管理

4.1 案例分析

4.1.1 案例概述

Docker官方镜像仓库是一个用于管理公共镜像的地方,大家可以在上面找到想要的镜像,也可以把自己的镜像推送上去。但是,有时候服务器无法访问互联网,或者不希望将自己的镜像放到互联网上,那么就需要用到Docker Registry私有仓库,它可以用来存储和管理自己的镜像。最近BDQN公司将项目全部打包成镜像有部署私有仓库服务的需求,经过几轮商讨,最终选择Docker Harbor,Docker Harbor有可视化的Web管理界面可以方便管理Docker镜像操作也很方便简单,又提供了多个项目的镜像权限管理控制功能等。

4.1.2 案例前置知识点

1. 什么是Harbor

Harbor是VMware公司开源的企业级Docker Registry项目,其目标是帮助用户迅速搭建一个企业级的Docker Registry服务。它以Docker公司开源的Registry为基础,提供了管理UI。基于角色的访问控制(Role Based AccessControl)、AD/LDAP集成、以及审计日志(Auditlogging) 等企业用户需求的功能。通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源 Docker Distribution。作为一个企业级私有 Registry 服务器,Harbor 提供了更好的性能和安全,以提升用户使用 Registry 构建和运行环境传输镜像的效率。

2. Harbor的优势

1) 基于角色控制:用户和仓库都是基于项目进行组织的,而用户基于项目可以拥有不同的权限。

2) 基于镜像的复制策略: 镜像可以在多个Harbor实例之间进行复制(同步)。适用于负载平衡、高可用性、多数据中心、混合和多云场景。

3) 支持LDAP / AD:Harbor与现有的企业LDAP / ADA集成,用于用户认证和管理。

4) 图像删除和垃圾收集:镜像可以被删除,也可以回收镜像占用的空间。

5) 图形UI:用户可以轻松浏览、搜索镜像仓库以及对项目进行管理。

6) 审计: 对存储库的所有操作都进行记录。

7) RESTful API:用于大多数管理操作的RESTful API,易于与外部系统集成。

3. Harbor在架构上主要由五个组件构成

1)Proxy:Harbor的Registry、UI、token等服务。通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。

2)Registry:负责储存Docker镜像,并处理Docker push/pull 命令。由于要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次Docker pull/push请求都要携带一个合法的token,Registry会通过公钥对token 进行解密验证。

3)Core services这是Harbor的核心功能,主要提供以下服务:

· UI(Harbor-ui):提供图形化界面,帮助用户管理Registry上的镜像(image), 并对用户进行授权。

· Webhook:为了及时获取registry上image状态变化的情况,在Registry上配置webhook,把状态变化传递给UI模块。

· Token服务:负责根据用户权限给每个Docker push/pull命令签发token.Docker客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。

4)Database(Harbor-db):为coreservices提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。

5)Log collector(Harbor-log):为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析,如图4.1所示。

图4.1

Harbor的每个组件都是以Docker容器的形式构建的,因此,使用Docker Compose来对它进行部署。在源代码中(), 用于部署Harbor的Docker Compose模板位于Harbor/make/docker-compose.tpl。

4.1.3 案例环境

1. 本案例实验环境

本案例环境如表4-1所示。

表4-1创建Docker Compose 环境

2. 案例需求

1)通过Harbor创建Docker私有仓库。

2)图形化管理Docker私有仓库镜像。

3. 案例实现思路

1)部署Docker Compose。

2)部署Harbor服务。

3)通过Harbor来管理上传的私有镜像。

4)维护Harbor。

4.2 案例实施

4.2.1 部署Harbor所依赖的Docker Compose服务

1. 下载最新Docker-Compose

[root@Harbor ~]# curl -L -`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

[root@Harbor ~]# chmod +x /usr/local/bin/docker-compose

2. 查看Docker-Compose版本判断安装是否成功

[root@Harbor ~]# docker-compose -v

docker-compose version 1.21.1, build 5a3f1a3

4.2.2 部署Harbor服务

Harbor被部署为多个Docker容器,因此可以部署在任何支持Docker的Linux发行版上。目标主机需要安装Python、Docker和Docker Compose。

1. 下载Harbor安装程序

[root@Harbor ~]# wget http:// harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz

[root@Harbor ~]# tar xvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/

2. 配置Harbor参数文件

配置参数位于文件/usr/local/harbor/harbor.cfg中。安装之前需要修改IP地址。

vim /usr/local/harbor/harbor.cfg

hostname = 192.168.168.91

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

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

· hostname:用于访问用户界面和register服务。它应该是目标机器的IP地址或完全限定的域名(FQDN),例如192.168.168.91或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时才应用。

· ssl_cert_key:SSL密钥的路径,仅当协议设置为https时才应用。

· secretkey_path:用于在复制策略中加密或解密远程register密码的密钥路径。

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

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

· 电子邮件设置:Harbor需要这些参数才能向用户发送"密码重置"电子邮件,并且只有在需要该功能时才需要。请注意,在默认情况下SSL连接时没有启用。如果SMTP服务器需要SSL,但不支持STARTTLS,那么应该通过设置启用SSL email_ssl = TRUE。

· harbour_admin_password:管理员的初始密码,只在Harbour第一次启动时生效。之后,此设置将被忽略,并且应在UI中设置管理员的密码。请注意,默认的用户名/密码是admin/Harbor12345。

· auth_mode:使用的认证类型,默认情况下,它是db_auth,即凭据存储在数据库中。对于LDAP身份验证,请将其设置为ldap_auth。

· self_registration:( 打开或关闭,默认打开)启用/禁用用户注册功能。禁用时,新用户只能由Admin用户创建,只有管理员用户可以在Harbour中创建新用户。 注意:当auth_mode设置为ldap_auth时,自注册功能将始终处于禁用状态,并且该标志被忽略。

· token_expiration:由令牌服务创建的令牌的到期时间(分钟),默认为30分钟。

· project_creation_restriction:用于控制哪些用户有权创建项目的标志。默认情况下,每个人都可以创建一个项目。如果将其值设置为"adminonly",那么只有admin可以创建项目。

· verify_remote_cert:打开或关闭,默认打开。此标志决定了当Harbour与远程register实例通信时是否验证SSL/TLS证书。将此属性设置为off将绕过SSL/TLS验证,这在远程实例具有自签名或不可信证书时经常使用。

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

3. 启动并安装Harbor

配置完成就可以启动Harbor了,如下操作:

[root@Harbor harbor]# sh /usr/local/harbor/install.sh

4. 查看Harbor启动镜像

查看Harbor启动镜像,如下所示。

[root@Harbor 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, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp

registry /entrypoint.sh serve /etc/ ... Up 5000/tcp

如果一切都正常,应该可以打开浏览器访问的管理页面,默认的管理员用户名和密码是admin/harbor12345。如图4.2所示,说明部署成功。

图4.2

至此, Harbor已经搭建完成,具体在WEB UI下面操作也是非常的简单,只有几个选项。

5. 创建一个新项目

1)输入用户名和密码登录界面后可以创建一个新项目。点击"+项目"按钮,如图4.3所示。

图4.3

2)填写项目名称为"myproject-kgc",如图4.4所示。

图4.4

3)点击"确定"按钮,成功创建后如图4.5所示。

图4.5

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

5)登录Harbor。

[root@Harbor ~]# docker login -u admin -p Harbor12345

WARNING! Using --password via the CLI is insecure. Use --password-stdin.

Login Succeeded

6)下载体积小点的镜像进行测试。

[root@Harbor ~]# docker pull cirros

7)镜像打tag。

[root@Harbor ~]# docker tag cirros 127.0.0.1/myproject-kgc/cirros:v1

8)上传镜像到Harbor。

[root@Harbor ~]# docker push 127.0.0.1/myproject-kgc/cirros:v1

The push refers to repository [127.0.0.1/myproject-kgc/cirros]

30063a215fed: Pushed

97ff63f27246: Pushed

f70e23dbea2d: Pushed

v1: digest: sha256:3fd64cb391e075e9e7335392aaa89d18029aafe5ca24cc123545c7b8c9c1d59c size: 943

9)在Harbor界面myproject-kgc目录下就可以看见这个镜像,以及这个镜像的一些信息,如图4.6所示。

图4.6

6. 客户端上传镜像

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

[root@client ~]# docker login -u admin -p harbor12345

WARNING! Using --password via the CLI is insecure. Use --password-stdin.

Error response from daemon: Get : dial tcp 192.168.168.91:443: getsockopt: connection refused

1) 在Docker客户端配置操作如下:

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

[root@client ~]#vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.168.91

2)重启Docker,再次登录

[root@client ~]# systemctl daemon-reload

[root@client ~]# systemcl restart docker

3)再次登录Harbor

[root@client ~]# docker login -u admin -p harbor12345

WARNING! Using --password via the CLI is insecure. Use --password-stdin.

Login Succeeded

4)下载体积小一点的镜像进行测试

[root@client ~]# docker pull cirros

5)镜像打标签及上传到myproject-kgc项目里面

[root@client ~]# docker tag cirros 192.168.168.91/myproject-kgc/cirros:v2

[root@client ~]# docker push 192.168.168.91/myproject-kgc/cirros:v2

6)查看Harbor的web管理界面,myproject-kgc项目里面有两个镜像。如图4.7所示:

图4.7

4.2.3 Harbor日常操作管理

1. 通过Harbor Web 创建项目

点击"+项目",按规范填写项目名称。本章案例中项目级别设置为"私有",即不勾选(勾选后会变为"公开"),如上图4.3和图4.4所示。如果设置为公共仓库,则所有人对此项目下的镜像拥有读权限,命令行中不需要执行"Docker login"即可下载镜像,镜像操作与Docker hub一致。

2. 创建Harbor用户

1)创建用户并分配权限

系统管理->用户管理->+用户,填写用户名为"kgc-user01",邮箱为kgc-user01@kgc.cn,全名为"课超新人",密码为"A123a456",注释为"管理员",如图4.8所示。

图4.8

点击""确定"按钮后,可将上述创建的用户设置为管理员角色或进行删除操作。这里不作任何设置,如图4.9所示。

图4.9

2)添加项目成员

项目->myproject-kgc-test->成员->+成员,填写上述创建的用户并分配角色为"开发人员",如图4.10所示。

图4.10

可对成员角色进行变更或者删除操作,如图4.11所示。

图4.11

3)在客户端上用普通账户镜像操作

(1)删除上述打标签的本地镜像.

[root@client ~]# docker rmi 192.168.168.91/myproject-kgc/cirros:v2

Untagged: 192.168.168.91/myproject-kgc/cirros:v2

Untagged: 192.168.168.91/myproject-kgc/cirros@sha256:3fd64cb391e075e9e7335392aaa89d18029aafe5ca24cc123545c7b8c9c1d59c

(2)首先退出当前用户,然后使用上述创建的账户kgc-user01登录。

[root@client ~]# docker logout 192.168.168.91

Removing login credentials for 192.168.168.91

[root@client ~]# docker login 192.168.168.91

Username: kgc-user01

Password:

Login Succeeded

(3)下载192.168.168.91/myproject-kgc/cirros标签为v1的镜像。

[root@client ~]# docker pull 192.168.168.91/myproject-kgc/cirros:v1

v1: Pulling from myproject-kgc/cirros

Digest: sha256:3fd64cb391e075e9e7335392aaa89d18029aafe5ca24cc123545c7b8c9c1d59c

Status: Downloaded newr image for 192.168.168.91/myproject-kgc/cirros:v1

3. 查看日志

Web界面日志,操作日志按时间顺序记录用户相关操作,如图4.12所示。

图4.12

4.2.4 管理 Harbor

可以使用docker-compose来管理Harbor。一些有用的命令如下所示(必须在与docker-compose.yml相同的目录中运行)。

1. 停止/启动/重启Harbor

[root@Harbor]# cd /usr/local/harbor

[root@Harbor Harbor]# docker-compose stop | start | restart

2. 修改Harbor.cfg配置文件

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

[root@Harbor Harbor]# docker-compose down -v

[root@Harbor Harbor]# vi harbor.cfg

[root@Harbor Harbor]#./prepare

[root@Harbor Harbor]# docker-compose up –d

3. 移除Harbor服务容器同时保留镜像数据/数据库

[root@Harbor Harbor]# docker-compose down –v

4. 移除Harbor服务容器全部数据(重新部署时采用)

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

[root@Harbor ~]# rm -r /data/database

[root@Harbor ~]# rm -r /data/registry

标签: #nginx g daemon off #docker私有仓库nginx