Docker仓库管理和资源限制


一、Docker仓库管理

Harbor介绍

在这里插入图片描述
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,由VMware开源,其通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源 Docker Distribution。作为一个企业级私有Registry服务器,Harbor 提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有 Registry 中,确保数据和知识产权在公司内部网络中管控,另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

vmware 官方开源服务: https://vmware.github.io/
harbor 官方github 地址: https://github.com/vmware/harbor
harbor 官方网址: https://goharbor.io/
harbor 官方文档: https://goharbor.io/docs/
github文档: https://github.com/goharbor/harbor/tree/master/docs

Harbor功能官方介绍

  • 基于角色的访问控制: 用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
  • 镜像复制: 镜像可在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
  • 图形化用户界面: 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
  • AD/LDAP 支: Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
  • 审计管理: 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
  • 国际化: 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
  • RESTful API: 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
  • 部署简单: 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。

Harbor组成

在这里插入图片描述

  • Proxy: 对应启动组件nginx。它是一个nginx反向代理,代理Notary client(镜像认证)、Docker client(镜像上传下载等)和浏览器的访问请求(Core Service)给后端的各服务。
  • UI(Core Service): 对应启动组件harbor-ui。底层数据存储使用mysql数据库,主要提供了 四个子功能:
    • UI: 一个web管理页面ui
    • API: Harbor暴露的API服务
    • Auth: 用户认证服务,decode后的token中的用户信息在这里进行认证;auth后端可以接db、ldap、uaa三种认证实现。
    • Token服务(上图中未体现): 负责根据用户在每个project中的role来为每一个docker push/pull命令发布一个token,如果从docker client发送给registry的请求没有带token,registry会重定向请求到token服务创建token。
  • Registry: 对应启动组件registry。负责存储镜像文件,和处理镜像的pull/push命令。Harbor对镜像进行强制的访问控制,Registry会将客户端的每个pull、push请求转发到token服务来获取有效的token。
  • Admin Service: 对应启动组件harbor-adminserver。是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候需要加载adminserver的配置。
  • Job Sevice: 对应启动组件harbor-jobservice。负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log。
  • Log Collector: 对应启动组件harbor-log。日志汇总组件,通过docker的log-driver把日志汇总到一起。
  • DB: 对应启动组件harbor-db,负责存储project、 user、 role、replication、image_scan、access等的metadata数据。

在这里插入图片描述
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 这样一个数据配置管理中心来完成。

安装Harbor

首先需要安装docker-compose工具,然后再安装harbor工具。
在这里插入图片描述
修改配置文件。
在这里插入图片描述
在这里插入图片描述

./prepare 

在这里插入图片描述

./install.sh 

在这里插入图片描述
注意需要开启路由转发功能。要不然可能会出现不了下述界面。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在Linux中使用命令行登录。
在这里插入图片描述
默认使用https登录,需要修改配置文件才行。
在这里插入图片描述
登录成功。
在这里插入图片描述

docker push 192.168.232.10/test/redis:latest

在这里插入图片描述
在这里插入图片描述

二、Docker资源限制

docker资源限制

容器资源限制介绍

官方文档: https://docs.docker.com/config/containers/resource_constraints/

默认情况下,容器没有资源的使用限制,可以使用主机内核调度程序允许的尽可能多的资源,Docker 提供了控制容器使用资源的方法,可以限制容器使用多少内存或 CPU等, 在docker run 命令的运行时配置标志实现资源限制功能。
其中许多功能都要求宿主机的内核支持,要检查是否支持这些功能,可以使用docker info 命令 ,如果内核中的某项特性可能会在输出结尾处看到警告, 如下所示:

WARNING: No swap limit support

OOM (Out of Memory Exception)

对于 Linux 主机,如果没有足够的内存来执行其他重要的系统任务,将会抛出OOM (Out of Memory Exception,内存溢出、内存泄漏、内存异常 ),随后系统会开始杀死进程以释放内存, 凡是运行在宿主机的进程都有可能被 kill ,包括 Dockerd和其它的应用程序, 如果重要的系统进程被 Kill,会导致和该进程相关的服务全部宕机。通常越消耗内存比较大的应用越容易被kill,比如: MySQL数据库,Java程序等。
产生 OOM 异常时, Dockerd尝试通过调整 Docker 守护程序上的 OOM 优先级来减轻这些风险,以便它比系统上的其他进程更不可能被杀死但是容器 的 OOM 优先级未调整, 这使得单个容器被杀死的可能性比 Docker守护程序或其他系统进程被杀死的可能性更大,不推荐通过在守护程序或容器上手动设置-- oom -score-adj为极端负数,或通过在容器上设置 – oom-kill-disable来绕过这些安全措施。

OOM优先级机制:
linux会为每个进程算一个分数,最终将分数最高的kill。
/proc/PID/oom_score_adj
范围为 -1000 到 1000,值越高容易被宿主机 kill掉,如果将该值设置为 -1000 ,则进程永远不会被宿主机 kernel kill 。
/proc/PID/oom_adj
范围为 -17 到+15 ,取值越高越容易被干掉,如果是 -17 , 则表示不能被 kill ,该设置参数的存在是为了和旧版本的 Linux 内核兼容。
/proc/PID/oom_score
这个值是系统综合进程的内存消耗量、 CPU 时间 (utime + 、存活时间 (uptime - start time) 和 oom_adj 计算出的进程得分 ,消耗内存越多得分越高,容易被宿主机 kernel 强制杀死。

查看dockerd进程的相关oom值。
在这里插入图片描述

容器的内存限制

Docker 可以强制执行硬性内存限制,即只允许容器使用给定的内存大小。
Docker 也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了。

相关选项

官文文档: https://docs.docker.com/config/containers/resource_constraints/

以下设置大部分的选项取正整数,跟着一个后缀 b 、 k 、m 、 g ,表示字节,千字节,兆字节或千兆字节。

选项描述
-m , – --memory=容器可以使用的最大物理内存量,硬限制,此选项最小允许值为 4m (4 MB),此项较常用
–memory-swap允许此容器交换到磁盘的内存量,必须先用-m 对内存限制才可以使用,详 细说明如下
–memory-swappiness设置容器使用交换分区的倾向性,值越高表示越倾向于使用swap分 区,范围为0-100,0为能不用就不用,100为能用就用
–memory-reservation允许指定小于 --memory 的软限制 ,当 Docker 检测到主机上的争用 或内存不足时会激活该限制,如果使-- memory-reservation,则必须 将其设置为低于 --memory 才能使其优先生效。 因为它是软限制,所 以不能保证容器不超过限制
–kernel-memory容器可以使用的最大内核内存量,最小为 4m,由于内核内存与用户空 间内存隔离,因此无法与用户空间内存直接交换,因此内核内存不足的 容器可能会阻塞宿主机资源,这会对主机和其他容器或者其他服务进程 产生影响,因此不建议设置内核内存大小
–oom-kill-disable默认情况下,如果发生内存不足(OOM)错误,则内核将终止容器中 的进程。要更改此行为,请使用该 --oom-kill-disable 选项。仅在设 置了该 -m/–memory 选项的容器上禁用OOM。如果 -m 未设置该标志, 则主机可能会用完内存,内核可能需要终止主机系统的进程以释放内存
docker run -e MYSQL_ROOT_PASSWORD=123456 -it --rm -m 1g --oom-kill-disable mysql:5.7.29

容器的CPU限制

官方文档说明: https://docs.docker.com/config/containers/resource_constraints/

一个宿主机,有几十个核心的CPU,但是宿主机上可以同时运行成百上千个不同的进程用以处理不同的任务,多进程共用一个 CPU 的核心为可压缩资源,即一个核心的 CPU 可以通过调度而运行多个进程,但是同一个单位时间内只能有一个进程在 CPU 上运行,那么这么多的进程怎么在 CPU 上执行和调度的呢?

Linux kernel 进程的调度基于CFS(Completely Fair Scheduler),完全公平调度。

服务器资源密集型

  • CPU 密集型的场景: 优先级越低越好,计算密集型任务的特点是要进行大量的计算,消耗CPU 资源,比如计算圆周率、数据处理、对视频进行高清解码等等,全靠CPU 的运算能力。
  • IO 密集型的场景: 优先级值高点,涉及到网络、磁盘IO 的任务都是IO 密集型任务,这类任务的特点是 CPU 消耗很少,任务的大部分时间都在等待 IO 操作完成(因为 IO 的速度远远低于 CPU 和内存的速度),比如 Web 应用,高并发,数据量大的动态网站来说,数据库应该为IO 密集型。

CFS原理

cfs定义了进程调度的新模型,它给cfs_rq(cfs的run queue)中的每一个进程安排一个虚拟时钟vruntime。如果一个进程得以执行,随着时间的增长,其vruntime将不断增大。没有得到执行的进程vruntime不变, 而调度器总是选择vruntime跑得最慢的那个进程来执行。这就是所谓的“完全公平”。为了区别不同优先级的进程,优先级高的进程vruntime增长得慢,以至于它可能得到更多的运行机会。CFS的意义在于, 在一个混杂着大量计算型进程和IO交互进程的系统中,CFS调度器相对其它调度器在对待IO交互进程要更加友善和公平。

选项描述
–cpus=指定一个容器可以使用多少个可用的CPU核心资源。例如,如果主机有两个 CPU,如果设置了 --cpus=“1.5” ,则可以保证容器最多使用1.5个的CPU(如果 是4核CPU,那么还可以是4核心上每核用一点,但是总计是1.5核心的CPU)。这 相当于设置 --cpu-period=“100000” 和 --cpu-quota=“150000” 。此设置可在 Docker 1.13及更高版本中可用,目的是替代–cpu-period和–cpu-quota两个参 数,从而使配置更简单,但是最大不能超出宿主机的CPU总核心数(在操作系统 看到的CPU超线程后的数值),此项较常用
–cpu-period=过时选项,指定CPU CFS调度程序周期,必须与 --cpu-quota 一起使用 。默认为 100微秒。大多数用户不会更改默认设置。如果使用Docker 1.13或更高版本, 请改用 --cpus
–cpu-quota=过时选项,在容器上添加 CPU CFS 配额,计算方式为 cpu-quota / cpu-period的 结果值,docker1.13 及以上版本通常使用–cpus 设置此值
–cpuset-cpus用于指定容器运行的 CPU 编号,也就是所谓的CPU绑定。如果一个或多个 CPU,则容器可以使用逗号分隔的列表或用连字符分隔的CPU范围。第一个 CPU的编号为0。有效值可能是 0-3 (使用第一,第二,第三和第四CPU)或 1,3 (使用第二和第四CPU)
–cpu-shares用于设置 cfs 中调度的相对最大比例权重,cpu-share 的值越高的容器,将会分 得更多的时间片(宿主机多核 CPU 总数为 100%,假如容器 A 为1024,容器 B 为 2048,那么容器 B 将最大是容器 A 的可用 CPU 的两倍 ),默认的时间片 1024,最大 262144。这是一个软限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值