Docker----网络、CPU、内存、io资源控制
前言:
一个 docker host 上会运行若干容器,每个容器都需要 CPU、内存和 IO 资源。 对于 KVM,VMware 等虚拟化技术,用户可以控制分配多少 CPU、内存资源给每个虚拟机;对于容器,Docker也提供了类似的机制避免某个容器因占用太多资源而影响其他容器乃至整个 host 的性能 。 Docker 基于 Linux 内核提供的 cgroups 功能,可以限制容器在运行时使用到的资源,比如内存、CPU、块 I/O、网络等。
一:Docker网络
1、Docker网络工作方式
安装Docker时,会自动创建三个网络:bridge(创建容器默认连接到此网络)、 none 、host。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j1oTN27x-1587118603749)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587027998054.png)]](https://img-blog.csdnimg.cn/2020041718181731.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1TWluNg==,size_16,color_FFFFFF,t_70)
[root@localhost ~]# docker network ls
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ugWWN4gd-1587118603752)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587028461539.png)]](https://img-blog.csdnimg.cn/20200417181832545.png)
2、bridge模式
在搭建好docker之后,通过ip add 或者 ifconfig命令就可以查看到,虚拟出一块叫做docker 0的一块网卡。 作为docker的默认网络模式,即bridge模式。其中的所有容器将docker0作为网关,这样就能与外界进行通信。
bridge模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上 。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWCunVg0-1587118603753)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587029011787.png)]](https://img-blog.csdnimg.cn/20200417181846572.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1TWluNg==,size_16,color_FFFFFF,t_70)
bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。
3、host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
4、none模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。这个Docker容器没有网卡、IP、路由等信息,需要自己为Docker容器添加网卡、配置IP等。
none 模式下容器只有lookbacp回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。没有办法联网,封闭的网络能很好的保证容器的安全性 。
5、container模式
在container模式中,新创建的容器通过与一个已存在的网络命名空间共享一个网络,如IP地址段和端口。除了网络是共享的,其他进程是隔离的。两个设备之间是通过回环网卡进行通信。
- ###
docker网络管理命令
1、创建新的网段来自定义网络
docker network create --subnet=IP地址段/子网掩码 网络空间的名称
示例:
[root@localhost ~]# docker network create --subnet=172.20.0.0/24 hello
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jWvroV7j-1587118603756)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587109915348.png)]](https://img-blog.csdnimg.cn/20200417181909331.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1TWluNg==,size_16,color_FFFFFF,t_70)
2、给容器test1固定hello的网段IP地址
[root@localhost ~]# docker run -itd --name test1 --network hello --ip 172.20.0.10 centos:7 /bin/bash
[root@localhost ~]# docker ps -a
[root@localhost ~]# docker exec -it 262797b3e335 /bin/bash
[root@262797b3e335 /]# yum install -y net-tools
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ANajHtru-1587118603758)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587110922988.png)]](https://img-blog.csdnimg.cn/20200417182000731.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1TWluNg==,size_16,color_FFFFFF,t_70)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EibcukGc-1587118603760)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587110976470.png)]](https://img-blog.csdnimg.cn/2020041718201711.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1TWluNg==,size_16,color_FFFFFF,t_70)
二:docker的CPU
1、查看cpu使用率控制
[root@localhost ~]# cd /sys/fs/cgroup/cpu/docker
[root@localhost docker]# ls
[root@localhost docker]# cat 262797b3e3354dd2b25dbb67a34218044da3996fe8ca1fd55f96a65e91b55bfd/cpu.cfs_quota_us
-1 :表示不受任何限制
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2HCxlZqb-1587118603761)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587111490754.png)]](https://img-blog.csdnimg.cn/20200417182052715.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1TWluNg==,size_16,color_FFFFFF,t_70)
2、限定CPU使用不超过20%
[root@localhost docker]# docker run -itd --name test1 --cpu-quota 20000 centos:7 /bin/bash
CPU进程数为100000,那么CPU的20%为20000
cpu-quota : 指定cpu使用上限的百分比
[root@localhost docker]# docker ps -a
[root@localhost docker]# docker exec -it 7d1964ccd737 /bin/bash
[root@7d1964ccd737 /]# yum install bc -y 安装bc测试软件
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZxyS84Bz-1587118603762)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587112426291.png)]](https://img-blog.csdnimg.cn/20200417182107660.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1TWluNg==,size_16,color_FFFFFF,t_70)
[root@7d1964ccd737 /]# echo "scale=5000; 4*a(1)" | bc -l -q ‘在容器中计算圆周率5000位’
打开新的终端,用top命令动态查看当前CPU使用率
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ANIjhM2-1587118603763)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587112633099.png)]](https://img-blog.csdnimg.cn/20200417182124192.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1TWluNg==,size_16,color_FFFFFF,t_70)
3、按比例分配cpu资源
(1)创建两台占用cpu资源的容器,一个占1/3、一个占2/3
[root@localhost docker]# docker run -itd --name a1 --cpu-shares 512 centos:7 /bin/bash
[root@localhost docker]# docker run -itd --name a2 --cpu-shares 1024 centos:7 /bin/bas
[root@localhost docker]# docker ps -a
‘可看到a1 和 a2 两个容器’
[root@localhost docker]# docker exec -it 745468f2e78c /bin/bash ‘进入a1容器’
[root@745468f2e78c /]# yum install epel-release -y
[root@745468f2e78c /]# yum install stress -y ‘a1和a2容器都安装压测工具’
[root@745468f2e78c /]# stress -c 4 ‘产生四个cpu线程’
打开新的终端,验证CPU百分比
(a1和a2容器都要打开)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AWYqCmqw-1587118603764)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587114079719.png)]](https://img-blog.csdnimg.cn/2020041718214466.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1TWluNg==,size_16,color_FFFFFF,t_70)
4、限定容器使用指定的CPU
(1)先关闭虚拟机添加cpu核心数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3WyvDDQw-1587118603765)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587114685480.png)]](https://img-blog.csdnimg.cn/20200417182156998.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1TWluNg==,size_16,color_FFFFFF,t_70)
通过top命令,按1查看CPU进程核心数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZvtTMkHS-1587118603766)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587114780965.png)]](https://img-blog.csdnimg.cn/20200417182209786.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1TWluNg==,size_16,color_FFFFFF,t_70)
(2) 指定第2个核心数和第4个核心数运行容器
(先删除所有的容器,再指定。不删除直接指定会报错)
[root@localhost ~]# docker ps -a | awk '{print "docker rm "$1}'|bash
[root@localhost ~]# docker run -itd --name test1 --cpuset-cpus 1,3 centos:7 /bin/bash
[root@localhost ~]# docker exec -it 64d1ea54daea /bin/bash
[root@64d1ea54daea /]# yum install epel-release -y
[root@64d1ea54daea /]# yum install stress -y
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CdLKFqaO-1587118603767)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587115876850.png)]](https://img-blog.csdnimg.cn/20200417182231976.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1TWluNg==,size_16,color_FFFFFF,t_70)
[root@64d1ea54daea /]# stress -c 4
发现cpu1和cpu3工作,其他空闲
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UeOsPwsm-1587118603768)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587117206973.png)]](https://img-blog.csdnimg.cn/20200417182245209.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1TWluNg==,size_16,color_FFFFFF,t_70)
三、docker的内存
1、指定内存使用资源512M
[root@localhost ~]# docker run -itd --name test2 -m 512m centos:7
[root@localhost ~]# docker stats ‘查看容器状态值’
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A965ef3Y-1587118603769)(C:\Users\xumin\AppData\Roaming\Typora\typora-user-images\1587117917883.png)]](https://img-blog.csdnimg.cn/20200417182324853.png)
四:docker 的I/O读写限制
1、 通过命令可以限制容器写入和读取磁盘的速度
限制读某个设备的bps(数据量):
docker run -d --device-read-bps /dev/设备名称:限额大小 镜像名称
示例:
[root@localhost ~]# docker run -d --device-read-bps /dev/sdb:30M centos:7
限制写入某个设备的bps:
docker run -d --device-write-bps /dev/设备名称:限额大小 镜像名称
示例:
[root@localhost ~]# docker run -d --device-write-bps /dev/sda:30M centos:7
Docker的资源限制写到这儿了,谢谢大家的阅读哦!