docker网络模式
docker网络模式分类
- host:容器不会虚拟出自己的网卡和配置自己的ip,而是使用宿主机的ip和端口(就是桥接模式),
- container:创建的容器不会创建处自己的网卡,配置自己的ip,而是和一直指定的容器共享ip、端口范围等
- nong:改模式关闭了容器的网络功能
- bridge:默认为该模式,此模式会为每一个容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat表配置与宿主机通信
- 自定义网络
安装docker时,会自动创建三个网络
[root@localhost ~]# docker network ls
#查看docker网络列表
网络模式详解
host模式
相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。 Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。 一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、iptable规则等都与其他的Network Namespace隔离。 一个Docker容器一般会分配一个独立的Network Namespace。 但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。
container模式
在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
[root@localhost ~]# docker run -itd --name test1 centos:7 /bin/bash
#给容器定义一个名字叫test1
[root@localhost ~]# docker ps -a
#查看镜像信息
[root@localhost ~]# docker inspect -f '{{.State.Pid}}' 4230ca1cab84
#查看容器进程号
[root@localhost ~]# ls -l /proc/2491/ns
#查看容器的进程、网络、文件系统等命名空间编号
[root@localhost ~]# docker run -itd --name test2 --net=container:4230ca1cab84 centos:7 /bin/bash
#给容器创建一个test2的名称,并设置网络模式为container模式
资源控制
cgroup资源控制
cgroups,其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。
cgroup四大功能
资源限制:可以对任何使用的资源总额进行限制 优先级分配:通过分配的CPU时间片数量以及磁盘I/O带宽大小,实际上相当于控制了任务运行优先级 资源统计:可以统计系统的资源使用量,如CPU时长、内存用量等 任务控制:cgroup可以对任务执行挂起、恢复等操作
操作
设置CPU使用率上限
linux可以通过CFS(完全公平调度器)来设置各个进程对CPU的使用。
[root@localhost ~]# docker pull centos:7
#先拉去一个镜像
[root@localhost ~]# docker run -itd --name test5 centos:7 /bin/bash
#运行centos:7,并且标签名为test5
[root@localhost ~]# cd /sys/fs/cgroup/cpu/docker/50a49066a45aaddc12b68e80f9e633532de7078cbbe0820036d833294db95e79/
[root@localhost 50a49066a45aaddc12b68e80f9e633532de7078cbbe0820036d833294db95e79]# cat cpu.cfs_quota_us
[root@localhost 50a49066a45aaddc12b68e80f9e633532de7078cbbe0820036d833294db95e79]# cat cpu.cfs_period_us
#cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默认为100000。
#cpu.cfs_quota_us:表示该cgroups限制占用的时间(微秒),默认为-1,表示不限制。 如果设为50000,表示占用50000/100000=50%的CPU。
CPU压力测试
[root@localhost ~]# docker exec -it 50a49066a45a /bin/bash
[root@50a49066a45a /]# vi /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
[root@50a49066a45a /]# chmod +x /cpu.sh
[root@50a49066a45a /]# ./cpu.sh
再打开一个终端,输入命令“top”,可以看见这个脚本占用的CPU处于最高
设置50%的比例分配CPU使用时间上限
[root@localhost ~]# docker run -itd --name test7 --cpu-quota 50000 centos:7 /bin/bash
#重新创建一个容器运行
[root@localhost ~]# cd /sys/fs/cgroup/cpu/docker/5a7de32b4943f21fc3c1c9743d7987dd2b08f270293937a6d6fc5d6e30674104/
[root@localhost 5a7de32b4943f21fc3c1c9743d7987dd2b08f270293937a6d6fc5d6e30674104]# echo 50000 > cpu.cfs_quota_us
[root@localhost 5a7de32b4943f21fc3c1c9743d7987dd2b08f270293937a6d6fc5d6e30674104]# docker exec -it 5a7de32b4943 /bin/bash
[root@5a7de32b4943 /]# vi /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
[root@5a7de32b4943 /]# chmod +x /cpu.sh
[root@5a7de32b4943 /]# ./cpu.sh
再次输入命令“top”,会发现CPU的使用率在50%左右,cgroup资源限制齐了作用
设置CPU资源占用比(设置多个容器才可以生效)
[root@localhost ~]# docker run -itd --name c1 --cpu-shares 512 centos:7
[root@localhost ~]# docker run -itd --name c2 --cpu-shares 1024 centos:7
#创建两个容器,并且设置CPU指定份额
[root@localhost ~]# yum install -y epel-release
[root@localhost ~]# yum install -y stress
[root@localhost ~]# stress -c 4
#产生四个进程
设置容器绑定指定的CPU
[root@localhost ~]# docker run -itd --name test7 --cpuset-cpus 0,1 centos:7 /bin/bash
#分配虚拟机的1个CPU核数
[root@localhost ~]# yum install -y epel-release
[root@localhost ~]# yum install stress -y
[root@localhost ~]# stress -c 1
#进入容器进行压力测试
#退出容器,执行 top 命令再按 1 查看CPU使用情况。
对内存使用的限制
[root@localhost ~]# docker run -itd --name test8 -m 512m centos:7 /bin/bash
#设置容器可以使用的最大内存
对磁盘I/O配额控制的限制
[root@localhost ~]# docker run -it --name test10 --device-write-bps /dev/sda:1MB centos:7 /bin/bas