Docker仓库管理及资源限制
Docker仓库管理及资源限制
Docker仓库,类似于yum仓库,是用来保存镜像的仓库。为了方便的管理和使用docker镜像,可以将镜像集中保存至Docker仓库中,将制作好的镜像push到仓库集中保存,在需要镜像时,从仓库中pull镜像即可。
公有云仓库: 由互联网公司对外公开的仓库
-
官方,
-
阿里云等第三方仓库,
私有云仓库: 组织内部搭建的仓库,一般只为组织内部使用,常使用下面软件搭建仓库
-
docker registory
-
docker harbor
Docker私有云仓库之分布式仓库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组成
-
-
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把日志汇总到 一起
-
安装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
实现开机自动启动
#方法一:通过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:
可通过修改内核参数消除以上警告
[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 也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了
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是一个压力测试工具,可以通过软件仓库进行安装也提供了docker版本的容器
容器CPU限制
官方文档说明: https://docs.docker.com/config/containers/resource_constraints/
一个宿主机,有几十个核心的CPU,但是宿主机上可以同时运行成百上千个不同的进程用以处理不同的 任务,多进程共用一个 CPU 的核心为可压缩资源,即一个核心的 CPU 可以通过调度而运行多个进程, 但是同一个单位时间内只能有一个进程在 CPU 上运行,那么这么多的进程怎么在 CPU 上执行和调度的 呢?
服务器资源密集型
-
CPU 密集型的场景: 优先级越低越好,计算密集型任务的特点是要进行大量的计算,消耗CPU 资 源,比如计算圆周率、数据处理、对视频进行高清解码等等,全靠CPU 的运算能力。
-
IO 密集型的场景: 优先级值高点,涉及到网络、磁盘IO 的任务都是IO 密集型任务,这类任务的特 点是 CPU 消耗很少,任务的大部分时间都在等待 IO 操作完成(因为 IO 的速度远远低于 CPU 和 内存的速度),比如 Web 应用,高并发,数据量大的动态网站来说,数据库应该为IO 密集型
CFS原理
官方站点: https://www.portainer.io/