设置特权级运行的容器:–privileged=true
有的时候我们需要容器具备更多的权限,比如操作内核模块,控制 swap 交换分区,挂载
USB 磁盘,修改 MAC 地址等。
1.容器特权
[root@foundation24 docker]# docker run --help |grep privileged ##过滤权限
--privileged Give extended privileges to this container
在没加特权的时,容器默认只有ro权限
[root@foundation24 docker]# docker run -it --name vm1 ubuntu
root@64a079965cdc:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
84: eth0@if85: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:2/64 scope link
valid_lft forever preferred_lft forever
root@64a079965cdc:/# ip link set down eth0 ##尝试down掉eth0
RTNETLINK answers: Operation not permitte
添加特权级运行,容器可以执行所有超级用户的权限:
[root@foundation24 docker]# docker run -it --name vm2 --privileged=true ubuntu
root@fcd094afbdd7:/# ip link set down eth0
2.内存memory的压侧
[root@foundation24 docker]# docker run --help |grep memory
--kernel-memory string Kernel memory limit
-m, --memory string Memory limit
--memory-reservation string Memory soft limit
--memory-swap string Swap limit equal to memory plus swap: '-1' to enable unlimited swap
--memory-swappiness int Tune container memory swappiness (0 to 100) (default -1)
做一个名字叫vm1 的 内存为100M swap分区为100M的容器,在调用stree镜像来压侧90M ,不会结束,这里后面的vm 1 代表单线程
[root@foundation24 docker]# docker run --rm -it --name vm1 -m 100M --memory-swap 100M stress --vm 1 --vm-bytes 90M
在开一台物理机: top 查看
在开启一个100M的容器,压侧为110M,还是不会停止,因为在允许范围内,当内存不够的时候,会占用swap分区,所以还是会一直跑下去,swap分区的大小为所给内存的2倍。
[root@foundation24 docker]# docker run --rm -it --name vm1 -m 100M stress --vm 1 --vm-bytes 110M
top查看,cpu已经没有很高的占有率,说明已经进入swap分区
当为199M时,压侧还是不会停止,但是很慢
当为200M时,停止
3.cup的压侧:
lscpu来看cup的基本信息
第一种方式
用各占一个cpu来工作,一个压侧512M 一个压侧1024M
[root@foundation24 docker]# docker run --rm -it --cpu-shares 512 stress -c 1
[root@foundation24 docker]# docker run --rm -it --cpu-shares 1024 stress -c 1
top查看
为什么不存在优先级,是因为,总共有4个cpu,一边调用一个,完全在工作承受范围了,系统的进程就是在允许范围了给与最大的工作能力调用,所以在承受范围之内是没有优先级的。
第二种方式:
当同时压侧所有的cpu ,4个时,一个压侧512M,一个压侧1024M
[root@foundation24 docker]# docker run --rm -it --cpu-shares 512 stress -c 4
[root@foundation24 docker]# docker run --rm -it --cpu-shares 1024 stress -c 4
top查看
可以清楚的看到4个cpu 被同时压侧时,会出现优先级,1024的比512的块两倍
4.最大吞吐量的限制
[root@foundation24 docker]# docker run --help |grep bps
--device-read-bps throttled-device Limit read rate (bytes per second) from a device (default [])
--device-write-bps throttled-device Limit write rate (bytes per second) to a device (default [])
4.1限制
写入的吞吐量
docker run –rm -it –device-write-bps /dev/sda:10M ubuntu ##限制吞吐量为10M
dd if=/dev/zero of=testfile bs=1M count=1000 oflag=direct ##在无限零设备中取一个1000M的设备
[root@foundation24 ~]# docker run --rm -it --device-write-bps /dev/sda:10M ubuntu
root@7404a6735243:/# dd if=/dev/zero of=testfile bs=1M count=1000 oflag=direct
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 99.9522 s, 10.5 MB/s
Docker是一个运用容器的服务,容器并不只有docker
Cgroups是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。最初由google的工程师提出,后来被整合进Linux内核。Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC
Runc -> docker engine -> daemon
以下实验在rhel6.5上进行
[root@server6 ~]# yum isstall -y libcgroup.x86_64 ##下载容器
[root@server6 /]# /etc/init.d/cgconfig start
Starting cgconfig service: [ OK ]
[root@server6 ~]# cd /cgroup/
[root@server6 cgroup]# ls
blkio cpu cpuacct cpuset devices freezer memory net_cls
[root@server6 cgroup]# cd memory/
1.内存memory:
最大的内存量 (理论上是无限的)
怎么设置容器的内存量:
[root@server6 memory]# vim /etc/cgconfig.conf ##定义一个组x1,在x1组里面加上最大的内存为200M
[root@server6 cgroup]# /etc/init.d/cgconfig restart
Stopping cgconfig service: [ OK ]
Starting cgconfig service: [ OK ]
查看先x1分组中最大内存:
[root@server6 memory]# cd x1/
[root@server6 x1]# cat memory.limit_in_bytes
209715200
真实的呢内存量为free+ buffers+cached
这样也可以压侧300M,因为swap分担了100M
[root@server6 ~]# free -m
total used free shared buffers cached
Mem: 996 260 735 0 33 159
-/+ buffers/cache: 68 928
Swap: 991 0 991
[root@server6 ~]# cgexec -g memory:x1 dd if=/dev/zero of=file1 bs=1M count=300 ##压侧一个300M的
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 0.922426 s, 341 MB/s
[root@server6 ~]# free -m
total used free shared buffers cached
Mem: 996 465 530 0 33 358
-/+ buffers/cache: 74 922
Swap: 991 0 991
设置容器总共可以使用内存和swap总共为200M
[root@server6 memory]# vim /etc/cgconfig.conf ##设置内存和swap分区总共200M
[root@server6 ~]# cd /dev/shm/ ##进入内存管理空间
[root@server6 shm]# free -m
total used free shared buffers cached
Mem: 996 261 735 0 33 159
-/+ buffers/cache: 68 928
Swap: 991 0 991
[root@server6 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file1 bs=1M count=300 ##压侧300M
Killed
illed
[root@server6 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file1 bs=1M count=199 ##压侧
Killed
[root@server6 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file1 bs=1M count=190 ##压侧
190+0 records in
190+0 records out
199229440 bytes (199 MB) copied, 0.0963854 s, 2.1 GB/s
[root@server6 shm]# free -m
total used free shared buffers cached
Mem: 996 451 544 0 33 349
-/+ buffers/cache: 68 927
Swap: 991 0 991
内存管理的实验:
利用了两个脚本加载出来的内存页不一样来进行压侧的比对
加权:
[root@server6 ~]# ls
memapp1 memapp2
[root@server6 ~]# chmod +x memapp*
下载插件:
[root@server6 ~]# yum install -y /lib/ld-linux.so.2
运行脚本memapp1 ,可以看出内存页为4096,一内存页=4kb
[root@server6 ~]# ./memapp1
Process ID is: 2414
Grabbing 4096 pages of memory
Success!
Press any key to exit
运行脚本memapp2 ,可以看出内存页为8192
[root@server6 ~]# ./memapp2
Process ID is: 2415
Grabbing 8192 pages of memory
Success!
Press any key to exit
进行环境内存内存的设置:
[root@server6 ~]# vim /etc/cgconfig.conf ##这样设置就可以使得只有脚本一压侧才可以,二不可以
[root@server6 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service: [ OK ]
Starting cgconfig service: [ OK ]
建立用户
[root@server6 shm]# useradd xqq
[root@server6 shm]# su - xqq
在/dev/shm 目录下重无限零设备中拉取一个300M的空间,作为压侧使用
[xqq@server6 ~]$ cd /dev/shm/
[xqq@server6 shm]$ dd if=/dev/zero of=file1 bs=1M count=300
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 0.214833 s, 1.5 GB/s
[root@server6 shm]# vim /etc/cgrules.conf
开启cgred服务
[root@server6 shm]# /etc/init.d/cgred start
Starting CGroup Rules Engine Daemon: [ OK ]
将脚本防到xqq用户的加目录下:
[root@server6 ~]# ls
memapp1 memapp2
[root@server6 ~]# mv * /home/xqq/
测试:
[xqq@server6 ~]$ ls
memapp1 memapp2
[xqq@server6 ~]$ ./memapp1
Process ID is: 2513
Grabbing 4096 pages of memory
Success!
Press any key to exit
[xqq@server6 ~]$ ./memapp2
Process ID is: 2514
Grabbing 8192 pages of memory
Killed
2.cpu
[root@server6 cpu]# vim /etc/cgconfig.conf
测试:
[root@server6 ~]# cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &
[1] 2327
top查看:
3.设置设备吞吐量
blkio.throttle.read_bps_device 读取设备的吞吐量
[root@server6 blkio]# ll /dev/vda ##设备型号很重要
brw-rw---- 1 root disk 252, 0 Aug 21 13:53 /dev/vda
[root@server6 blkio]# vim /etc/cgconfig.conf
[root@server6 blkio]# vim /etc/cgconfig.conf ##设置读取最大吞吐量为1000kb/s
[root@server6 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service: [ OK ]
Starting cgconfig service: [ OK ]
[root@server6 x3]# cat blkio.throttle.read_bps_device
252:0 1000000
[root@server6 ~]# cgexec -g blkio:x3 dd if=/dev/vda of=/dev/null &
[1] 2353
[root@server6 ~]# yum install -y iotop
查看iotop
4.容器的暂停与恢复
[root@server6 cgroup]# cd freezer/
[root@server6 freezer]# ls
cgroup.event_control cgroup.procs notify_on_release release_agent tasks
[root@server6 freezer]# vim /etc/cgconfig.conf ##设置一个空的组
[root@server6 freezer]# cd x4/
[root@server6 x4]# dd if=/dev/zero of=/dev/null &
[1] 2388
[root@server6 x4]# echo 2388 > tasks
[root@server6 x4]# cat freezer.state
THAWED
[root@server6 x4]# echo FROZEN > freezer.state ##冻结,有时候不确定服务是否有用,所以冻结,而不kill
[root@server6 x4]# cat freezer.state
FROZEN
top查看,任务被冻结
解冻:
[root@server6 x4]# echo THAWED > freezer.state
[root@server6 x4]# cat freezer.state
THAWED
top查看,任务出现继续运行: