一.容器和单机容器编排入门与实战 2.2 Dockerfile 镜像分层构建案例、容器资源限制、容器运行时

业务规划及镜像分层构建:

  系统base 镜像构建  system-base
  Nginx 基础镜像构建 nginx-base
  Nginx业务镜像构建  nginx-web1
  在kubernetes业务测试环境运行nginx容器并测试
  在kubernetes业务生产环境运行nginx容器并测试

nginx-ubuntu 完整镜像
system-base-->nginx-base-->nginx-web1  分层构建(具体详见脚本)
root@docker-server1:/usr/local/src/dockerfile# tree -L 3
.
├── nginx-base
│   ├── Dockerfile
│   └── nginx-1.22.1.tar.gz
├── nginx-ubuntu
│   ├── Dockerfile
│   ├── docker-entrypoint.sh
│   ├── frontend.tar.gz
│   ├── nginx-1.22.1.tar.gz
│   ├── nginx.conf
│   └── sources.list
├── nginx-web1
│   ├── Dockerfile
│   ├── build-command.sh
│   ├── frontend.tar.gz
│   └── nginx.conf
├── system-base
│   └── Dockerfile

 

容器资源限制:
Docker 可以强制执行硬性内存限制,即只允许容器使用给定的内存大小。
Docker 也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了。大部分的选项取正整数,跟着一个后缀b,k, m,g,,表示字节,千字节,兆字节或千兆字节。
 Most of these options take a positive integer, followed by a suffix of b, k, m, g, to indicate bytes, kilobytes, megabytes, or gigabytes.
--oom-score-adj #宿主机kernel对进程使用的内存进行评分,评分最高的将被宿主机内核kill掉(越低越不容易被kill),可以指定一个
容器的评分为较低的负数,但是不推荐手动指定。
--oom-kill-disable #对某个容器关闭oom机制。
 

物理内存限制参数:
 -m or --memory #限制容器可以使用的最大内存量,如果设置此选项,最小存值为4m(4兆字节)。
--memory-swap #容器可以使用的交换分区大小,必须要在设置了物理内存限制的前提才能设置交换分区的限制 --memory-swappiness #设置容器使用交换分区的倾向性,值越高表示越倾向于使用swap分区,范围为0-100,0为能不用就不用,100为能用就用。
--kernel-memory #容器可以使用的最大内核内存量,最小为4m,由于内核内存与用户空间内存隔离,因此无法与用户空间内存直接交换,因此内核内存不足的容器可能会阻塞宿主主机资源,这会对主机和其他容器或者其他服务进程产生影响,因此不要设置内核内存大小。
--memory-reservation #允许指定小于--memory的软限制,当Docker检测到主机上的争用或内存不足时会激活该限制,如果使用--memory-reservation,则必须将其设置为低于--memory才能使其优先。 因为它是软限制,所以不能保证容器不超过限制。
--oom-kill-disable #默认情况下,发生OOM时,kernel会杀死容器内进程,但是可以使用--oom-kill-disable参数,可以禁止oom发生在指定的容器上,即 仅在已设置-m / - memory选项的容器上禁用OOM,如果-m 参数未配置,产生OOM时,主机为了释放内存还会杀死系统进程。
 

物理内存限制验证:
假如一个容器未做内存使用限制,则该容器可以利用到系统内存最大空间,默认创建的容器没有做内存资源限制。
# docker pull lorel/docker-stress-ng #测试镜像
# docker run -it --rm lorel/docker-stress-ng --help #查看帮助信息
1、不限制容器内存:
 启动两个内存工作进程,每个内存工作进程最大允许使用内存256M,且宿主机不限制当前容器最大内存:
 root@docker-server1:~# docker run -it --rm --name magedu-c1 lorel/docker-stress-ng --vm 2 --vm-bytes 256M
 root@docker-server1:~# docker stats
2、限制容器最大内存:
root@docker-server1:~# docker run -it --rm -m 256m --name magedu-c1 lorel/docker-stress-ng --vm 2 --vmbytes 256M
root@docker-server1:~# docker stats
 
 
 

CPU限制验证:
 #只给容器分配最多两核宿主机CPU利用率
 # docker run -it --rm --name magedu-c1 --cpus 2 lorel/docker-stress-ng --cpu 4 --vm 4
注:CPU资源限制是将分配给容器的2核心分配到了宿主机每一核心CPU上,也就是容器的总CPU值是在宿主机的每一个核心CPU分配了部分比例。
 Tasks: 288 total, 10 running, 278 sleeping, 0 stopped, 0 zombie
 %Cpu0 : 51.2 us, 0.0 sy, 0.0 ni, 48.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
 %Cpu1 : 26.4 us, 23.4 sy, 0.0 ni, 50.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
 %Cpu2 : 23.1 us, 27.7 sy, 0.0 ni, 49.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
 %Cpu3 : 18.3 us, 31.3 sy, 0.0 ni, 50.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
 将容器运行到指定的CPU上:
 # docker run -it --rm --name magedu-c1 --cpus 2 --cpuset-cpus 1,3 lorel/docker-stress-ng --cpu 4 --vm 4
 基于cpu--shares值(共享值)对CPU进行限制,分别启动两个容器,magedu-c1的--cpu-shares值为1000,magedu-c2的--cpu-shares为500,观察最终效果,--cpu-shares值为1000的magedu-c1的CPU利用率基本是--cpu-shares为500的magedu-c2的两倍:
 # docker run -it --rm --name magedu-c1 --cpu-shares 1000 lorel/docker-stress-ng --cpu 4 --vm 4
# docker run -it --rm --name magedu-c2 --cpu-shares 500 lorel/docker-stress-ng --cpu 4 --vm 4
 
 

验证:
 1.cgroup验证:
 root@docker-server1:~# cat
/sys/fs/cgroup/docker/b7b3755f22962538418dc56c23c03941cd7f97178ed8e25c7d02fbc4ca9878ed/memory.max
 536870912
 root@docker-server1:~# cat
/sys/fs/cgroup/docker/b7b3755f22962538418dc56c23c03941cd7f97178ed8e25c7d02fbc4ca9878ed/cpu.max
 200000 100000
2.systemd限制验证:
 root@docker-server1:~# docker start b7b3755f2296b7b3755f2296
 root@docker-server1:~# ps -ef | grep nginx #过滤出目的服务的进程号
 root 18770 18736 1 17:08 ? 00:00:00 nginx: master process nginx -g daemon off;
systemd+ 18816 18770 0 17:08 ? 00:00:00 nginx: worker process
root@docker-server1:~# cat /proc/18770/cpuset #查询进程的限制
 /system.slice/docker-b7b3755f22962538418dc56c23c03941cd7f97178ed8e25c7d02fbc4ca9878ed.scope
root@docker-server1:~# cat /sys/fs/cgroup/system.slice/docker-
b7b3755f22962538418dc56c23c03941cd7f97178ed8e25c7d02fbc4ca9878ed.scope/cpu.max #查询cpu限制范围
200000 100000
root@docker-server1:~# cat /sys/fs/cgroup/system.slice/docker-
b7b3755f22962538418dc56c23c03941cd7f97178ed8e25c7d02fbc4ca9878ed.scope/memory.max #查询内存限制范围
 536870912
 
 
# docker run -it -d  -m 512m --cpus 2  -p 80:80  nginx:1.20.2-alpine
posted @ 2022-11-27 13:34  梳碧湖砍柴少年  阅读(82)  评论(0)    收藏  举报