返回顶部

Docker仓库管理及资源限制

Docker仓库管理及资源限制

Docker仓库,类似于yum仓库,是用来保存镜像的仓库。为了方便的管理和使用docker镜像,可以将镜像集中保存至Docker仓库中,将制作好的镜像push到仓库集中保存,在需要镜像时,从仓库中pull镜像即可。

Docker 仓库分为公有云仓库和私有云仓库

公有云仓库: 由互联网公司对外公开的仓库

私有云仓库: 组织内部搭建的仓库,一般只为组织内部使用,常使用下面软件搭建仓库

  • docker registory

  • docker harbor

 

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  》 最后安装Harbor

#一键安装harbor脚本

#!/bin/bash
#
#********************************************************************
#Author:          wei
#QQ:  
#Date:         2020-11-14
#FileName:    install_harbor.sh
#URL:  
#Description: The test script
#Copyright (C): 2020 All rights reserved
#********************************************************************
. /etc/init.d/functions


set -e
COLOR="echo -e \\E[1;32m"
COLOR1="echo -e \\E[1;31m"
END="\\E[0m"


#ubuntu依赖包
ubuntu_page="
wget
apt-transport-https
ca-certificates
curl
software-properties-common
python3-pip
"
#centos依赖包
centos_page="
wget
yum-utils
device-mapper-persistent-data
lvm2
"
harbor_version=harbor-offline-installer-v1.10.4.tgz

#centos7安装
install_centos7() {
   ${COLOR}"开始安装 Docker....."${END}
   #安装依赖包
   for PAGE in ${centos_page};do
       rpm -q $PAGE &> /dev/null || yum -y -q install $PAGE
   done

   #添加源信息
   yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo && action "添加源信息成功!" || { action "添加源信息失败,请检查命令!" false ; exit; }

   #更新安装docker-ce
   yum makecache fast &> /dev/null
   yum -y install docker-ce &> /dev/null

   #配置镜像加速器
   mkdir -p /etc/docker
   cat > /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": ["https://jcbawuya.mirror.aliyuncs.com"]
}
EOF

   #重载配置文件
   systemctl daemon-reload

   #启动服务
   ${COLOR}"正在启动 Docker....."${END}
   sleep 2
   systemctl start docker && action "docker启动成功!" || action "docker启动失败,请检查配置文件!" false
}

#centos8安装
install_centos8() {
   ${COLOR}"开始安装 Docker....."${END}
   #安装依赖包
   for PAGE in ${centos_page};do
       rpm -q $PAGE &> /dev/null || yum -y -q install $PAGE
   done
   yum -y install https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.1.el7.x86_64.rpm &> /dev/null
   #添加源信息
   cat > /etc/yum.repos.d/docker.repo <<EOF
[docker]
name=docker
gpgcheck=0
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/8/x86_64/stable/
EOF

    #更新安装docker-ce
    yum clean all &> /dev/null
    yum -y install docker-ce &> /dev/null && action "docker安装完成!" || action "docker按照失败!请检查网络及Yum源!" false

    #配置镜像加速器
    mkdir -p /etc/docker
    cat > /etc/docker/daemon.json <<-'EOF'
{
     "registry-mirrors": ["https://jcbawuya.mirror.aliyuncs.com"]
}
EOF

    #重载配置文件
    systemctl daemon-reload

    #启动服务
    ${COLOR}"正在启动 Docker....."${END}
    sleep 2
    systemctl start docker && action "docker启动成功!" || action "docker启动失败,请检查配置文件!" false
}

#ubuntu安装
install_ubuntu() {
    ${COLOR}"开始安装 Docker....."${END}
    #更新源及安装依赖包
    apt-get update &> /dev/null
    for PAGE in ${ubuntu_page};do
        dpkg -s $PAGE &> /dev/null || apt -y install $PAGE &> /dev/null
    done

    #安装GPG证书
    curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

    #写入软件源信息
    echo 'deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic stable' >> /etc/apt/sources.list
    #更新源信息
    apt -y update &> /dev/null

    #配置镜像加速器
    mkdir -p /etc/docker
    cat > /etc/docker/daemon.json <<EOF
{
     "registry-mirrors": ["https://jcbawuya.mirror.aliyuncs.com"]
}
EOF

    #安装docker-ce
    ${COLOR}"正在安装Docker,请稍等...."${END}
    apt-get -y install docker-ce &> /dev/null && ${COLOR}"docker启动成功!"${END} || ${COLOR1}"docker启动失败,请检查配置文件!"${END}
}

#ubuntu安装harbor
install_harbor_ubuntu(){
    mulu=`pwd`
    myip=`hostname -I | awk '{print $1}'`
    harbor_passwd=123456
       [ -d /apps ] || mkdir -p /apps
    [ -f /root/${harbor_version} ] || { ${COLOR1}"harbor安装包不存在,请检查!"${END}; exit; }
    [[ $mulu == "/root" ]] &&  tar xf $harbor_version -C /apps/ || { cd; tar xf $harbor_version -C /apps/ ; }
    #修改配置文件
    sed -i "s#reg.mydomain.com#${myip}#" /apps/harbor/harbor.yml
    sed -i "s#Harbor12345#${harbor_passwd}#" /apps/harbor/harbor.yml
    sed -i "s/https:/#https/" /apps/harbor/harbor.yml
    sed -i "s/port: 443/#port: 443/" /apps/harbor/harbor.yml
    /apps/harbor/install.sh

    #配置服务文件
    cat > /lib/systemd/system/harbor.service <<EOF
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor

[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/docker-compose -f /apps/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /apps/harbor/docker-compose.yml down

[Install]
WantedBy=multi-user.target
EOF
    #设置开机启动
    systemctl daemon-reload
    systemctl enable harbar.service
}


#centos安装harbor
install_harbor_centos(){
    mulu=`pwd`
    myip=`hostname -I | awk '{print $1}'`
    harbor_passwd=123456
    #创建harbor的目录
    [ -d /apps ] || mkdir -p /apps
    [ -f /root/${harbor_version} ] || { ${COLOR1}"harbor安装包不存在,请检查!"${END}; exit; }
    [[ $mulu == "/root" ]] &&  tar xf $harbor_version -C /apps/ || { cd; tar xf $harbor_version -C /apps/ ; }
    #修改配置文件
    sed -i "s#reg.mydomain.com#${myip}#" /apps/harbor/harbor.yml
    sed -i "s#Harbor12345#${harbor_passwd}#" /apps/harbor/harbor.yml
    sed -i "s/https:/#https/" /apps/harbor/harbor.yml
    sed -i "s/port: 443/#port: 443/" /apps/harbor/harbor.yml
    /apps/harbor/install.sh && ${COLOR}"harbor安装成功"$END || ${COLOR1}"harbor安装失败"$END

    #配置服务文件
    cat > /lib/systemd/system/harbor.service <<EOF
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor

[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/docker-compose -f /apps/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /apps/harbor/docker-compose.yml down

[Install]
WantedBy=multi-user.target
EOF
    #设置开机启动
    systemctl daemon-reload
    systemctl enable harbar.service
}

#安装docker-compose
install_compose(){
#安装docker-compose,需实现安装python3-pip,利用pip库安装harbor
    rpm -q  python3 &> /dev/null || yum -y install python3
    rpm -q  python3-pip &> /dev/null || yum -y install python3-pip
    pip3 install docker-compose -i https://mirrors.aliyun.com/pypi/simple
    ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
}

#系统类型
ostype1=`awk -F'"' '/^VERSION_ID/{print $2}' /etc/os-release`
ostype2=`awk -F'"' '/^NAME/{print $2}' /etc/os-release`
if [[ $ostype2 == "CentOS Linux" ]];then
    if [ $ostype1 = 8 ];then
        rpm -q docker-ce &> /dev/null && action "Docker已安装" || install_centos8
    elif [ $ostype1 = 7 ];then
    rpm -q docker-ce &> /dev/null && action "Docker已安装" || install_centos7       
    fi
elif [[ $ostype2 == "Ubuntu" ]];then
    dpkg -s docker-ce &> /dev/null && ${COLOR}"Docker已安装"$END || install_ubuntu
fi

#判断compose是否安装
docker-compose --version && ${COLOR}"Docker Compose已安装"${END} || install_compose

#harbor安装判断
if [[ $ostype2 == "Ubuntu" ]];then
    if [ -e /lib/systemd/system/harbar.service ];then
        ${COLOR}"harbor已安装"${END};exit
        else
        install_harbor_ubuntu && ${COLOR}"harbor安装完成,已开机启动!"${END}
    fi
elif [[ $ostype2 == "CentOS Linux" ]];then
    if [ -e /lib/systemd/system/harbar.service ];then
        ${COLOR}"harbor已安装"${END};exit
    else
        install_harbor_centos
    fi
fi

 

编辑配置文件 harbor.cfg

最新文档: https://github.com/goharbor/harbor/blob/master/docs/install-config/configure-yml-file.md

 [root@ubuntu1804 ~]#vim /apps/harbor/harbor.cfg
#只需要修改下面两行
hostname = 10.0.0.101  #指向当前主机IP 或 FQDN
ui_url_protocol = http #如果修改为https,需要指定下面证书路径
ssl_cert = /data/cert/server.crt #https时,需指定下面证书文件路径
ss_cert_key = /data/cert/server.key   #https时,需指定下面私钥文件路径
harbor_admin_password = 123456 #指定harbor登录用户admin的密码,默认用户/密码:admin/Harbor12345

实现开机自动启动 harbor

#方法一:通过service文件实现
[root@harbor ~]#vim /lib/systemd/system/harbor.service
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor

[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/docker-compose -f /apps/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /apps/harbor/docker-compose.yml down

[Install]
WantedBy=multi-user.target

[root@harbor ~]#systemctl daemon-reload 
[root@harbor ~]#systemctl enable harbor

#方法二:通过rc.local实现
[root@harbor ~]#cat /etc/rc.local 
#!/bin/bash
cd /apps/harbor
/usr/bin/docker-compose up 

[root@harbor ~]#chmod +x /etc/rc.local

 实现harbor高可用

harbor支持基于策略Docker镜像复制功能,这类似于MYSQL的主从同步。其可以实现不同的数据中心、不同 的运行环境之间同步镜像,并提供友好的管理界面,大大的简化了实际运维中的镜像管理工作,已经有很多互联网公司使用harbor搭建内网docker仓库的案例,并且还实现了双向复制功能

 

 

单机编排之Docker compose

当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容易出错,此时推荐使用 docker 单机编排工具 docker-compose

docker-compose 是 docker 容器的一种单机编排服务,docker-compose 是一个管理多个容器的工 具,比如: 可以解决容器之间的依赖关系,就像启动一个nginx 前端服务的时候会调用后端的tomcat, 那就得先启动tomcat,但是启动tomcat 容器还需要依赖数据库,那就还得先启动数据库,dockercompose 可以用来解决这样的嵌套依赖关系,并且可以替代docker命令对容器进行创建、启动和停止 等手工的操作

因此,如果说docker命令就像linux的命令,docker compse就像shell脚本,可以自动的执行容器批量 操作,从而实现自动化的容器管理,或者说docker命令相当于ansible命令,那么docker compose文 件,就相当于ansible-playbook的yaml文件

docker-compose 项目是Docker 官方的开源项目,负责实现对Docker 容器集群的快速编排,dockercompose 将所管理的容器分为三层,分别是工程(project),服务(service)以及容器 (container)

github地址: https://github.com/docker/compose

官方地址: https://docs.docker.com/compose/

查看配置和格式检查

[root@ubuntu1804 docker-compose]#docker-compose config
services:
 service-nginx-web:
   container_name: nginx-web
   expose:
    - 80
    - 443
   image: 10.0.0.102/example/nginx-centos7-base:1.6.1
   network_mode: bridge
   ports:
    - 80:80/tcp
    - 443:443/tcp
version: '2.1'

[root@ubuntu1804 docker-compose]#docker-compose config -q

 

 

docker的资源限制

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

默认情况下,容器没有资源的使用限制,可以使用主机内核调度程序允许的尽可能多的资源

Docker 提供了控制容器使用资源的方法,可以限制容器使用多少内存或 CPU等, 在docker run 命令的运行时配置标志实现资源限制功能。

其中许多功能都要求宿主机的内核支持,要检查是否支持这些功能,可以使用docker info 命令 ,如果内核中禁用了某项功能可能会在输出结尾处看到警告, 如,WARNING: No swap limit support:

可通过修改内核参数消除以上警告

官方文档: https://docs.docker.com/install/linux/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities

 [root@ubuntu1804 ~]#vim /etc/default/grub
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1 net.ifnames=0"
[root@ubuntu1804 ~]#update-grub
[root@ubuntu1804 ~]#reboot

容器内存限制

 

Docker 可以强制执行硬性内存限制,即只允许容器使用给定的内存大小

Docker 也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了

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

swap限制

--memory-swap #只有在设置了 --memory 后才会有意义。使用 Swap,可以让容器将超出限制部分的内存置换到磁盘上,WARNING: 经常将内存交换到磁盘的应用程序会降低性能

-memory-swap #值为正数, 那么--memory 和--memory-swap 都必须要设置,--memory-swap 表示你能使用的内存和 swap 分区大小的总和,例如:   --memory=300m, --memory-swap=1g, 那么该容器能够使用 300m 物理内存和 700m swap,即--memory 是实际物理内存大小值不变,而 swap 的实际大小计算方式为(--memory-swap)-(--memory)=容器可用 swap

--memory-swap #如果设置为 0,则忽略该设置,并将该值视为未设置,即未设置交换分区

--memory-swap #如果等于--memory 的值,并且--memory 设置为正整数,容器无权访问 swap 

-memory-swap #如果未设置,如果宿主机开启了 swap,则实际容器的swap 值最大为 2x( --memory),即两倍于物理内存大小,例如,如果--memory="300m"与--memory-swap没有设置,该容器可以使用300m总的内存和600m交撒空间,但是并不准确(在容器中使用free 命令所看到的 swap 空间并不精确,毕竟每个容器都可以看到具体大小,宿主机的 swap 是有上限的,而且不是所有容器看到的累计大小)

--memory-swap #如果设置为-1,如果宿主机开启了 swap,则容器可以使用主机上 swap 的最大空间

注: 在容器中执行free命令看到的是宿主机的内存和swap使用,而非容器自身的swap使用情况

stress-ng压力测试工具

stress-ng是一个压力测试工具,可以通过软件仓库进行安装也提供了docker版本的容器

容器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交互进程要更加友善和公平

可视化图形工具Portainer

Portainer是一个可视化的容器镜像的图形化管理工具,利用Portainer可以轻松构建,管理和维护Docker环境。而且完全免费,基于容器化的安装形式,方便高效部署

官方站点: https://www.portainer.io/

官方安装说明: https://www.portainer.io/installation/

 

posted @ 2020-11-22 16:03  九尾cat  阅读(436)  评论(0编辑  收藏  举报