1.4 私有registry与docker资源限制 - Go语言中文社区

1.4 私有registry与docker资源限制


 私有registry


  • 安装与配置

安装

保证 yum 仓库中 extras 仓库的正常使用。软件名为 docker-registry

[root@CentOS174 ~]# yum info docker-registry.x86_64 
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Available Packages
Name        : docker-registry
Arch        : x86_64
Version     : 0.9.1
Release     : 7.el7
Size        : 123 k
Repo        : extras/7/x86_64
Summary     : Registry server for Docker
URL         : https://github.com/docker/docker-registry
License     : ASL 2.0
Description : Registry server for Docker (hosting/delivering of repositories and images).

配置

查看 docker-registry 的配置文件 /etc/docker-distribution/registry/config.yml

[root@CentOS174 ~]# cat /etc/docker-distribution/registry/config.yml
version: 0.1  #配置文件版本
log:
  fields:
    service: registry   #服务名
storage:
    cache:
        layerinfo: inmemory  #使用内存作为缓存
    filesystem:
        rootdirectory: /var/lib/registry   #上传的镜像文件保存路径
http:
    addr: :5000   #服务监听的地址与端口
  • 上传镜像

使用 docker image tag 命令定义镜像的 tag (标签)

[root@CentOS74 share]# docker image tag miriam:CentOS-Nginx 192.168.30.174:5000/centos-nginx:v0.1-1

    语法:docker image tag 镜像名 仓库[:端口]/镜像名:标签

[root@CentOS74 share]# docker image ls
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
192.168.30.174:5000/centos-nginx   v0.1-1              a552c4114b92        2 days ago          272MB

修改 Docker daemon 的配置文件 /etc/docker/daemon.json 中添加

"insecure-registries": ["192.168.30.174:5000"]  #定义不安全的仓库信息

使用 docker image push 命令上传镜像

[root@CentOS74 share]# docker image push 192.168.30.174:5000/centos-nginx:v0.1-1
The push refers to repository [192.168.30.174:5000/centos-nginx]
a390acf3ee8a: Pushed 
252a273c5530: Pushed 
b1160b2b4364: Pushed 
fea3884383d3: Pushed 
bcc97fbfc9e1: Pushed 
v0.1-1: digest: sha256:ea63b8a18a79089662164f1ea7277951c256b835cb019fdb02abf949556b7b2c size: 1365
  • Harbor

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

特性

    多租户内容签名和验证
    安全和漏洞分析
    审核日志记录
    身份集成和基于角色的访问控制
    实例之间的映像复制
    可扩展的API和图形用户界面
    国际化(目前是英文和中文)

部署

1、保证本地安装有较新版本的 docker 与 docker-compose

2、从 github 上下载需要的 Harbor Harbor下载地址

3、展开 harbor-offline-installer-RELEASES.tgz 后,根须需求编辑安装配置文件 harbor.cfg 中必要的项

[root@CentOS174 harbor]# ls
common  docker-compose.clair.yml  docker-compose.notary.yml  docker-compose.yml  ha  harbor.cfg  harbor.v1.4.0.tar.gz  install.sh  LICENSE  NOTICE  prepare

4、执行 install.sh 脚本,此时会展开 harbor.v1.4.0.tar.gz,并安装其中打包的镜像

5、访问 Hardor

Docker资源限制


  • 内存限制

OOM

Out Of Memory,一般是由于程序编写者对内存使用不当,如对该释放的内存资源没有释放,导致其一直不能被再次使用而使计算机内存被耗尽的现象。重启计算机即可,但根本解决办法还是对代码进行优化。

一旦发生 OOME,任何进程都有可能被杀死,包括 docker daemon 在内。为此,Docker 特地调整了 docker daemon 的 OOM 优选级,以免它被内核强制杀死,但容器的优选级并未被调整

相关参数

选项 描述
-m or --memory 内存限制,格式是数字加单位,单位可以为 b,k,m,g。最小为 4M
--memory-swap 内存+交换分区大小总限制。格式同上。必须比 -m 设置的大
--memory-reservation 内存的软性限制。格式同上
--oom-kill-disable 是否阻止 OOM killer 杀死容器,默认没设置
--oom-score-adj 容器被 OOM killer 杀死的优先级,范围是[-1000, 1000],默认为 0
--memory-swappiness 用于设置容器的虚拟内存控制行为。值为 0~100 之间的整数
--kernel-memory 核心内存限制。格式同上,最小为 4M

-m or --memory 与 --memory-swap

--memory-swap --memory 效果
正数S 正数M 容器可用总空间为 S,其中 ram 为 M,swap 为 (S-M),若 S=M,则无可用 swap 资源
0 正数M 相当于未设置 swap (unset)
unset 正数M 若主机 (Docker Host) 启用了 swap,则容器的可用 swap 为 2*M
-1 正数M 若主机 (Docker Host) 启用了 swap,则容器可使用最大至主机上的所有 swap 空间的 swap 资源

注意:在容器内使用free命令可以看到的swap空间并不具有其所展现出的空间指示意义

--memory-reservation

一种软性限制,用于节制容器内存使用。给 --memory-reservation 设置一个比 -m 小的值后,虽然容器最多可以使用 -m 使用的内存大小,但在宿主机内存资源紧张时,在系统的下次内存回收时,系统会回收容器的部分内存页,强迫容器的内存占用回到 --memory-reservation 设置的值大小

--oom-kill-disable

默认情况下,在出现 out-of-memory(OOM) 错误时,系统会杀死容器内的进程来获取更多空闲内存。可以通过设置 --oom-kill-disable 选项来禁止系统内核杀死容器内进程。但请确保只有在使用了 -m--memory 选项时才使用 --oom-kill-disable,否则可能会造成出现 out-of-memory 错误时,系统通过杀死宿主机进程或获取更改内存

--oom-score-adj

一般一个容器只有一个进程,这个唯一进程被杀死,容器也就被杀死了。我们可以通过 --oom-score-adj 选项来设置在系统内存不够时,容器被杀死的优先级

--kernel-memory

核心内存和用户内存不同的地方在于核心内存不能被交换出。不能交换出去的特性使得容器可以通过消耗太多内存来堵塞一些系统服务。可以通过设置核心内存限制来约束这些内存。例如,每个进程都要消耗一些栈页面,通过限制核心内存,可以在核心内存使用过多时阻止新进程被创建

核心内存和用户内存并不是独立的,必须在用户内存限制的上下文中限制核心内存

--memory --kernel-memory 效果
正数U unset 不限制核心内存。这是默认的标准设置方式
正数U 正数K,且K<U 核心内存时用户内存的子集
正数U 正数K,且K>U 因为核心内存的变化也会导致用户计数器的变化,容器核心内存和用户内存都会触发回收行为。这种配置可以让管理员以一种统一的视图看待内存。对想跟踪核心内存使用情况的用户也是有用的。

--memory-swappiness

swappiness 的值是个参考值,是否会发生 swap 跟当前是哪种分页回收及系统当前状态都有关系,所以设置了 --memory-swappiness=0 并不代表一定没有 swap 发生,同时设为 0 也确实会可能发生 OOM

  • CPU限制

Docker 的资源限制和隔离完全基于 Linux cgroups。对 CPU 资源的限制方式也和 cgroups 相同。Docker 提供的 CPU 资源限制选项可以在多核系统上限制容器能利用哪些 vCPU。而对容器最多能使用的 CPU 时间有两种限制方式:一是有多个 CPU 密集型的容器竞争 CPU 时,设置各个容器能使用的 CPU 时间相对比例。二是以绝对的方式设置容器在每个调度周期内最多能使用的 CPU 时间

相关参数

选项 描述
--cpuset-cpus="" 允许使用的 CPU 集,值可以为 0-3,0,1
-c,--cpu-shares= CPU 共享权值(相对权重)
--cpu-period= 限制 CPU CFS 的周期,范围从 100ms~1s,即[1000, 1000000]
--cpu-quota= 限制 CPU CFS 配额,必须不小于1ms,即 >= 1000
--cpuset-mems="" 允许在上执行的内存节点(MEMs),只对 NUMA 系统有效

其中 --cpuset-cpus 用于设置容器可以使用的 vCPU 核编号。-c--cpu-shares 用于设置多个容器竞争 CPU 时,各个容器相对能分配到的 CPU 时间比例。--cpu-period 和 --cpu-quota 用于绝对设置容器能使用 CPU 时间

周期比例

默认情况下,所有的容器得到同等比例的 CPU 周期。在有多个容器竞争 CPU 时我们可以设置每个容器能使用的 CPU 时间比例。这个比例叫作共享权值,通过 -c--cpu-shares 设置。Docker 默认每个容器的权值为 1024,不设置或将其设置为 0,都将使用这个默认值。系统会根据每个容器的共享权值和所有容器共享权值和比例来给容器分配 CPU 时间

注意:这个比例只有在 CPU 密集型的任务执行时才有用。在四核的系统上,假设有四个单进程的容器,它们都能各自使用一个核的 100% CPU 时间,不管它们的 cpu 共享权值是多少。而当一个 CPU 上有四个进程时,其中三个进程空闲时,第一个进程则可以使用 100% 的CPU 时间,只有当另外进程请求使用 CPU 时,才会在请求 CPU 时间的进程间进行权值计算

绝对周期

Linux 通过 CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对 CPU 的使用。CFS 默认的调度周期是 100ms

CFS 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 1000~1000000。而容器的 CPU 配额必须不小于 1ms,即 --cpu-quota 的值必须 >= 1000

我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的 CPU 时间。两者一般配合使用

[root@CentOS74 ~]# docker container run -d --rm --name test --cpu-period 50000 --cpu-quota 25000 miriam:CentOS-Nginx
9edf4ca0ec001b1a0c3c9b72557fed3dcf409de105ded741ada3fd0ab3f04c02

这并不说明我们将宿主机的 CPU 调度周期设置为了 50ms,而是指定该容器在每 50ms 中能够使用 25ms/50ms=50% 的 CPU 运行时间

[root@CentOS74 ~]# docker container run -d --rm --name test --cpu-period 25000 --cpu-quota 50000 miriam:CentOS-Nginx
37e00d0b91df19a2f665538b74531e8f3679cfa01b50466eafad58a5723d0ab6

而当将 CPU 配额值设置大于 CFS 周期时,系统将多分配相应个数的 vCPU 以保证 CPU 配额得以满足

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/M30_Miriam/article/details/81415353
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 19:33:47
  • 阅读 ( 1173 )
  • 分类:docker

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢