Docker篇之五容器资源配额cpu/内存/io设置案例+搭建私有镜像仓库harbor案例

一、容器资源配额设置(cpu、内存、IO等)

docker可以通过cgroup命令,对容器进行限制一些资源如:CPU、内存、磁盘

1.1 对CPU资源的设置案例步骤

cpu-shares 创建容器时可指定的份额值,是一个弹性加权值,其值不能保证可以获得vcpu或者多少GHz的CPU资源。
默认每个容器的cpu份额都是1024.
只有多个容器在同一个cpu核心上运行,cpu-shares加权值效果才会体现出来。
[root@docker ~]# cat /proc/cpuinfo | grep "processor" #查看当前宿主机上有多少cpu的核
[root@docker ~]# docker ps -a
[root@docker ~]# docker run --name="test01" -itd --cpu-shares 512 centos /bin/bash #设置512份额
[root@docker ~]# docker run --name="test02" -itd --cpu-shares 2048 centos /bin/bash #设置2048份额
[root@docker ~]# docker exec -it test01 /bin/bash #进入test01容器
[root@c0e1de47ab73 /]# cat /sys/fs/cgroup/cpu/cpu.shares #在容器test01中查看刚才配置的cpu份额
[root@docker ~]# docker exec -it test02 /bin/bash #进入test02容器
[root@93c94cd47356 /]# cat /sys/fs/cgroup/cpu/cpu.shares #在容器test02中查看刚才配置的cpu份额
image

CPU core核心控制:使用参数(--cpuset)可以绑定CPU,限定docker容器运行时使用具体的哪个核心

1.1.1 案例1:将容器A和容器B上配置cpuset-cpus和cpu-shares,绑定同一个cpu,同时抢占cpu体现出效果

[root@docker ~]# cat /proc/cpuinfo | grep "processor" #查看此时宿主机上有几个cpu核心
使用linux系统压力测试软件stress,将4个核心的cpu中的第一和第三核心跑满,使用taskset绑定cpu

[root@docker ~]# yum install -y epel-release
[root@docker ~]# yum install -y stress #宿主机上安装stress

参数解释:
-c 产生n个cpu进程,测试cpu。-c 2 产生2个cpu进程。
-i 产生n个io进程,每个进程调用sync(),sync()用于将内存中数据写入硬盘,测试磁盘io。-i 2 产生2个io进程。
-m 测试内存,--vm n 产生n个进程,每个进程不断调用内存分配malloc()和内存释放free()。
时间单位:秒s,分m,时h,天d,年y。
文件大小单位:K,M,G
小测试案例1:产生2个cpu进程(-c 2),2个io进程(-i 2),20秒后停止运行
[root@docker ~]# stress -c 2 -i 2 --verbose --timeout 20s #宿主机上,产生2个cpu进程,2个io进程。cpu只跑在其中2个核心上。20s后停止
另开一个终端,top后,按数字键1 查看
image

大致步骤
1、宿主机上创建2个容器test01、test02;
2、设置test01、test02只运行在cpu0和cpu2上。且test01份额为512,test02份额为1024。
3、测试下test01、test02使用cpu的百分比。

1.宿主机上运行两个容器

[root@docker ~]# docker run --name="test01" --cpuset-cpus 0,2 --cpu-shares 512 -itd centos /bin/bash #指定容器在cpu0和cpu2上运行,使用cpu份额512
[root@docker ~]# docker run --name="test02" --cpuset-cpus 0,2 --cpu-shares 1024 -itd centos /bin/bash #指定容器在cpu0和cpu2上运行,使用份额1024

2.进入test01容器,安装stress,进行压测。测试进程只在第1,3核心

[root@docker ~]# docker exec -ti test01 /bin/bash
[root@21bd1d57dc3c /]# cd /etc/yum.repos.d/
[root@21bd1d57dc3c yum.repos.d]# sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
[root@21bd1d57dc3c yum.repos.d]# sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
[root@21bd1d57dc3c yum.repos.d]# yum install -y epel-release #安装epel扩展源
[root@21bd1d57dc3c yum.repos.d]# yum install -y stress #安装stress压测软件
[root@21bd1d57dc3c yum.repos.d]# stress -c 2 -v -t 30s #-c 2 产生2个cpu进程。-t 30s 30s后结束
参数:-v 显示版本号;-t (--timeout指定运行几秒后停止)
image

3.进入test02容器,安装stress,进行压测。测试进程只在第1,3核心

[root@docker ~]# docker exec -ti test02 /bin/bash
[root@ad568b3b28b9 /]# cd /etc/yum.repos.d/
[root@ad568b3b28b9 yum.repos.d]# sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
[root@ad568b3b28b9 yum.repos.d]# sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
[root@ad568b3b28b9 yum.repos.d]# yum install -y epel-release
[root@ad568b3b28b9 yum.repos.d]# yum install -y stress
[root@ad568b3b28b9 yum.repos.d]# stress -c 2 -v -t 10m #压测10min中
image

4.同时也进入test01容器,stress压测10min中

[root@21bd1d57dc3c /]# stress -c 2 -v -t 10m
image

2个容器,只占用cpu0、cpu2。且压测是容器所占的份额比例,差不多是1:2;符合之前设置的份额512:1024

1.2 对内存进行控制--防止内存泄漏,导致物理机内存无限增长。

-m --memory="" 限制容器的内存使用量。

1.2.1 测试案例1:设置test03容器,使用的内存上限为128m

[root@docker ~]# docker run --name="test03" -itd -m 128m centos
[root@docker ~]# docker exec -ti test03 /bin/bash
[root@abf24e261afb /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes
image

1.2.2 测试案例2:设置test04容器,只使用2个cpu核心,是能使用2G--2048m内存

[root@docker ~]# docker run --name="test04" --cpuset-cpus 0,1 -m 2048m -itd centos
[root@docker ~]# docker exec -ti test04 /bin/bash
[root@3388e013952e /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes
image

1.3 对磁盘IO进行控制--防止某个容器吃光磁盘IO资源

--device-read-bps value #限制此设备的读速度,单位可以是:kb、mb、gb
--device-write-bps value #限制此设备的写速度

1.3.1 案例1:限制容器test05实例,对硬盘最高的写入速度设定为2MB/s

--device 参数:将主机的设备添加到容器
dd参数:读写数据采用直接IO方式,不走缓存。直接从内存写入到硬盘上。
nonblock:读写数据采用 非阻塞IO方式,优先写dd命令的数据。
[root@docker ~]# docker run --name="test05" -v /var/www/html/:/var/www/html --device /dev/sda:/dev/sda --device-write-bps /dev/sda:2mb -itd centos /bin/bash #运行test05容器,-v 宿主机目录:容器内目录
[root@docker ~]# docker exec -ti test05 /bin/bash
[root@3f4734d07404 /]# time dd if=/dev/sda of=/var/www/html/test.out bs=2M count=50 oflag=direct,nonblock
image
此时,1s写入2MB,限制成功。

1.4 容器运行测试后,自动删除--公司测试环境,启动上百个容器后,结束后自动删除

--rm 参数:当容器命令运行结束后,自动删除容器,自动释放资源。
sleep 参数:sleep 10 10s后自动删除
[root@docker ~]# docker run --name="01" --rm -itd centos sleep 10 #后台运行一个容器,10s后自动删除
image

二、搭建harbor私有镜像仓库

2.1 环境描述

harbor宿主机:cpu4核、内存16GB、磁盘100GB、系统:centos7.8 ip地址:192.168.10.149

2.2 安装harbor的操作步骤

1.为harbor签发证书

[root@localhost ~]# hostnamectl set-hostname harbor && bash #设置主机名并生效
[root@harbor ~]# mkdir -p /data/ssl/ #创建证书的目录
[root@harbor ~]# cd /data/ssl/

[root@harbor ssl]# openssl genrsa -out ca.key 3072 #创建名为ca.key的私钥,rsa类型的3072位
[root@harbor ssl]# openssl req -new -x509 -days 3650 -key ca.key -out ca.pem #根据ca.key这个私钥,生成一个ca.pem根证书,有效时间3650天
image

[root@harbor ssl]# openssl genrsa -out harbor.key 3072 #创建名为harbor.key的私钥,rsa的类型,3072位
[root@harbor ssl]# openssl req -new -key harbor.key -out harbor.csr #生成一个证书请求,后续签发证书需要
image

[root@harbor ssl]# openssl x509 -req -in harbor.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out harbor.pem -days 3650 #签发证书
image

2.安装docker

2.1 关闭防火墙

[root@harbor ssl]# systemctl stop firewalld.service && systemctl disable firewalld.service

2.2 关闭iptables防火墙,并禁用,且清空防火墙规则

[root@harbor ssl]# yum install -y iptables-services #安装iptables
[root@harbor ssl]# service iptables stop && systemctl disable iptables #关闭,且禁用开机自启
[root@harbor ssl]# iptables -F #清空规则

2.3 关闭selinux,重启服务器使其生效

[root@harbor ssl]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
reboot重启服务器

2.4 配置时间同步,编写计划任务

[root@harbor ~]# yum install -y ntp ntpdate
[root@harbor ~]# ntpdate ntp1.aliyun.com #同步阿里云的ntp1服务器
[root@harbor ~]# crontab -e #编写任务

点击查看代码
*/1 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &> /var/log/ntpdate.log

每一分钟都要同步,且写到log里面
[root@harbor log]# systemctl restart crond.service #重启crond服务,使配置生效

2.5 配置harbor机器和docker机器的hosts文件

[root@docker ~]# cat /etc/hosts 在docker宿主机上,添加下面2行主机名解析

点击查看代码
[root@docker ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.83 docker
192.168.10.149 harbor
在harbor机器上同样进行操作
2.6 harbor机器上安装基础软件包

[root@harbor ~]# yum install -y wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel  python-devel epel-release openssh-server socat  ipvsadm conntrack

2.7 harbor宿主机上安装docker-ce
1.先配置docker-ce国内yum源(阿里云)

[root@harbor ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2.安装docker依赖包

[root@harbor ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

3.安装docker-ce

[root@harbor ~]# yum install -y docker-ce

2.8启动docker服务,并设开机自启动。

[root@harbor ~]# systemctl start docker && systemctl enable docker
[root@harbor ~]# systemctl status docker #查看状态
[root@harbor ~]# docker version

2.9开启包转发功能和修改内核参数

[root@harbor ~]# modprobe br_netfilter 首先加载br_netfilter模块。br_netfilter模块,就是用来将桥接流量转发至 iptables链

点击查看代码
[root@ harbor~]# cat > /etc/sysctl.d/docker.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

[root@harbor ~]# sysctl -p /etc/sysctl.d/docker.conf
image

重启docker
[root@harbor ~]# systemctl restart docker

2.10 配置镜像加速器

[root@harbor ~]# vim /etc/docker/daemon.json

点击查看代码
{
 "registry-mirrors": ["https://jnu4y9ae.mirror.aliyuncs.com"]
}

3.安装harbor

3.1 创建harbor的安装目录

[root@harbor ~]# mkdir -p /data/harbor-install/ && cd /data/harbor-install/ #创建安装目录并进入
[root@harbor harbor-install]# ll /data/ssl/ #/data/ssl/目录下,是之前安装的证书
image

3.2 把离线包上传到安装目录/data/harbor-install/里面,解压

链接:https://pan.baidu.com/s/1C3XPap7iQXN55GIAJ2hXDw 提取码:1234
image

[root@harbor harbor-install]# tar -zxvf harbor-offline-installer-v2.3.0-rc3.tgz
[root@harbor harbor]# cd /data/harbor-install/harbor/
[root@harbor harbor]# cp -rafp harbor.yml.tmpl harbor.yml
[root@harbor harbor]# vim harbor.yml #修改配置文件

点击查看代码
①hostname: reg.mydomain.com   改为 hostname: harbor
②https中的certificate: /your/certificate/path   改为 certificate: /data/ssl/harbor.pem
③https中的private_key: /your/private/key/path   改为 private_key: /data/ssl/harbor.key 

邮件和ldap不需要在这里配置,web界面可以配置
harbor默认账户密码:admin/Harbor12345

3.3 安装docker-compose.把docker-compose-Linux-x86_64.64上传到/usr/local/bin/下,并改名为:docker-compose

链接:https://pan.baidu.com/s/1GJZrNBx0xdmNlMJ-NnfmXA 提取码:1234

[root@harbor harbor]# mv /usr/local/bin/docker-compose-Linux-x86_64.64 /usr/local/bin/docker-compose
[root@harbor harbor]# chmod +x /usr/local/bin/docker-compose #加上执行权限
[root@harbor harbor]# docker-compose -v #任意目录查看docker-compose版本即可
image

3.4 上传harbor的离线镜像包到/data/harbor-install/里面,加载,执行安装脚本。

链接:https://pan.baidu.com/s/17OpBish3hxkxqAZK2QOM2Q 提取码:1234
image
[root@harbor harbor-install]# docker load -i docker-harbor-2-3-0.tar.gz
[root@harbor harbor]# cd /data/harbor-install/harbor/
[root@harbor harbor]# ./install.sh
image

3.5 在windows上用浏览器访问harbor私有仓库。调整windows本机hosts文件

在C:\Windows\System32\drivers\etc\ 目录下的hosts文件

image

3.6 停掉harbor和启动harbor

[root@harbor harbor]# cd /data/harbor-install/harbor/ && docker-compose stop
[root@harbor harbor]# cd /data/harbor-install/harbor/ && docker-compose start

3.7 windows机器上浏览器验证

建议谷歌、火狐。输入:https://harbor
image
默认账户密码:admin/Harbor12345

三、harbor私有镜像仓库简单使用

1.新建项目

image

2.新建名为iso-images-0705,且不用输入harbor默认登录密码都可以访问

image

image

3.在宿主机docker上配置,测试使用harbor镜像

[root@docker ~]# vim /etc/docker/daemon.json

点击查看代码
{
 "registry-mirrors": ["https://jnu4y9ae.mirror.aliyuncs.com"],
 "insecure-registries": ["192.168.10.149","harbor"]
}

解释:"insecure-registries": ["192.168.10.149","harbor"] 指的是内网访问harbor时走的是http。
[root@docker ~]# systemctl daemon-reload #重新加载
[root@docker ~]# systemctl restart docker #重启docker服务,若失败,则daemon.json文件格式有问题

[root@docker ~]# docker login 192.168.10.149 #在docker宿主机上,直接登录harbor,输入账号密码/admin Harbor12345
image

3.1 把tomcat.tar.gz上传到docker宿主机的/root/下

链接:https://pan.baidu.com/s/1CqDtmEKojkapkAaBRpkSDw 提取码:1234
[root@docker ~]# docker load -i tomcat.tar.gz #把压缩文件,加载成本地镜像
image

[root@docker ~]# docker tag tomcat:latest 192.168.10.149/iso-images-0705/tomcat:v1 #把tomcat:latest镜像打个标签

image

3.2 把本地镜像推到harbor仓库

[root@docker ~]# docker push 192.168.10.149/iso-images-0705/tomcat:v1 #就会把tomcat:v1镜像推到192.168.10.149/iso-images-0705/
image

3.3 在本地,pull拉取harbor仓库的镜像

[root@docker ~]# docker rmi 921ef208ab56 #首先删除本地所有有关tomcat的镜像
[root@docker ~]# docker pull 192.168.10.149/iso-images-0705/tomcat:v1 #下载
image

image

posted @ 2022-07-04 12:45  菜鸟不想早飞  阅读(118)  评论(0)    收藏  举报