Docker
资源隔离
Docker 是利用
linux
的LXC
技术,内核的Kernel namespace
Namespace:
- PID - 通过PID的namespace隔离,可以嵌套
- NET - 通过网络的NET的namespace隔离
- IPC - 隔离IPC
- mnt - 挂在隔离
- Uts - 可以实现每个docker 容器有自己的hostname,daemin name
- User - 让每个容器有自己的用户和组
资源限制
通过controller group进行
默认支持隔离的:
- CPU
- MEM
磁盘需要手动来隔离
配置资源隔离
Docker默认的每个容器的CPU配额是1024.
如果一个机器只有一个容器,那么就占所有,如果两个,则是平分
在进行安装配置的时候,需要用到压力测试工具stress
.
需要在容器中安装测试工具,yum install stress -y
,前提有epel
源。
下面使用Dockerfile来构建镜像
[root@node docker-file]# mkdir stress
[root@node docker-file]# ls
nginx stress
[root@node stress]# cat Dockerfile
FROM centos
RUN rm -rf /etc/yum.repos.d/*
ADD CentOS7-Base-163.repo /etc/yum.repos.d
ADD epel.repo /etc/yum.repos.d/
RUN yum install stress -y && yum clean all
ENTRYPOINT ["stress"]
[root@node stress]# ls
CentOS7-Base-163.repo Dockerfile epel.repo
[root@node stress]# docker build -t stress:v1 .
[root@node stress]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
stress v1 14cb1cb325cd About a minute ago 221 MB
nginx-file v1 592d69098f3a 18 hours ago 399 MB
sijiayong/my-nginx v1 a80ecf40e4d2 19 hours ago 328 MB
docker.io/centos latest 5182e96772bf 2 weeks ago 200 MB
docker.io/nginx latest c82521676580 4 weeks ago 109 MB
docker.io/registry latest b2b03e9146e1 6 weeks ago 33.3 MB
可以看到进行已经制作完成。
CPU测试
配置1核CPU,让stress进行CPU的压力测试
# 使用--rm参数,当容器退出时,自动删除该容器。
[root@node stress]# docker run -it --rm stress:v1 --cpu 1
stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
# 然后打开一个新的终端,top查看:
[root@node ~]# top
top - 15:01:48 up 1 min, 3 users, load average: 0.08, 0.02, 0.01
Tasks: 108 total, 2 running, 49 sleeping, 0 stopped, 0 zombie
%Cpu(s):100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 985712 total, 613288 free, 154292 used, 218132 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 636208 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1504 root 20 0 7320 100 0 R 93.8 0.0 0:02.80 stress
启动两个容器,不同配额
启动两个容器,一个容器不指定配额,一个容器指定512的配额,再次查看CPU使用率:
[root@node ~]# docker run -it stress:v1 --cpu 1
stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
# 再开一个终端
[root@node ~]# docker run -it stress:v1 -c 512 --cpu 1
stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
# 再开一个终端 top查看
[root@node ~]# top
top - 15:04:02 up 3 min, 3 users, load average: 1.23, 0.37, 0.13
Tasks: 109 total, 4 running, 49 sleeping, 0 stopped, 0 zombie
%Cpu(s):100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 985712 total, 588760 free, 173244 used, 223708 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 612468 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1575 root 20 0 7320 96 0 R 50.9 0.0 0:36.96 stress
1618 root 20 0 7320 96 0 R 50.9 0.0 0:21.13 stress
此时每个容器占了CPU的一半。
多个容器使用多个CPU中的一核
参数 --cpuset-cpus 参数,来制定,从0 开始,可以指定多个,以
,
都好分割
# 指定CPU=0
[root@node ~]# docker run -it --rm --cpuset-cpus=0 stress:v1 --cpu 1
stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
# 打开另一个终端top查看
[root@node ~]# top
top - 15:20:14 up 11 min, 2 users, load average: 0.26, 0.14, 0.05
Tasks: 131 total, 3 running, 57 sleeping, 0 stopped, 0 zombie
%Cpu0 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 4016292 total, 3604620 free, 174116 used, 237556 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 3564852 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2139 root 20 0 7320 96 0 R 100.0 0.0 0:06.22 stress
# 在重新启动一个容器,指定CPU=1
[root@node ~]# docker run -it --rm --cpuset-cpus=1 stress:v1 --cpu 1
stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
[root@node ~]# top
top - 15:20:24 up 11 min, 2 users, load average: 0.30, 0.15, 0.06
Tasks: 132 total, 3 running, 57 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0 us, 1.1 sy, 0.0 ni, 98.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 4016292 total, 3601400 free, 177012 used, 237880 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 3561756 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2246 root 20 0 7320 100 0 R 100.0 0.0 0:02.99 stress
可以看到,docker把对应的容器运行那颗CPU上了
内存资源限制
--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空间并不具有其所展现出的空间只是意义。
使用 -m 来给容器分配内存,同样使用stress工具,来对容器进行压测
分配一个128m的内存给容器,然后使用stress运行256m的内存对启动的容器进行压测
[root@node ~]# docker run -it --rm -m 128m stress:v1 --vm 1 --vm-bytes 128m --vm-hang 0
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
^Cstress: FAIL: [1] (415) <-- worker 7 got signal 2
stress: WARN: [1] (417) now reaping child worker processes
stress: FAIL: [1] (421) kill error: No such process
stress: FAIL: [1] (451) failed run completed in 5s
# 上面先压测的128m内存,可以正常运行
[root@node ~]# docker run -it --rm -m 128m stress:v1 --vm 1 --vm-bytes 256m --vm-hang 0
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [1] (415) <-- worker 7 got signal 9
stress: WARN: [1] (417) now reaping child worker processes
stress: FAIL: [1] (421) kill error: No such process
stress: FAIL: [1] (451) failed run completed in 0s
# 上面压测的265m内存,启动后就直接被kill退出了