一、实现原理
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。
1.1 创建nginx映射端口
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
docker run -d --name test1 -P nginx #随机映射端口(从32768开始)
docker run -d --name test2 -p 8080:80 nginx #指定映射端口



1.2 查看容器的输出和日志信息
docker logs 容器的ID/名称

二、 Docker 的网络模式
(1)Host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
(2)Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
(3)None:该模式关闭了容器的网络功能。
(4)Bridge:默认为该模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat 表配置与宿主机通信。
(5)自定义网络


2.1 查看docker网络列表

2.2 指定网络模式
使用docker run创建Docker容器时,可以用 --net 或 --network 选项指定容器的网络模式
host模式:使用 --net=host 指定。
none模式:使用 --net=none 指定。
container模式:使用 --net=container:NAME_or_ID 指定。
bridge模式:使用 --net=bridge 指定,默认设置,可省略。
补充

2.3 网络模式详解
2.3.1 host模式
容器使用宿主机的网络直接公开服务。这意味着日过你在容器中运行一个web服务,那么它就直接绑定到主机的网络接口上,而不是通过docker进行任何网络转发。
与宿主机共享网络名称空间。
docker run -d --name shibin --network host nginx:web
docker inspect shibin


2.3.2 container模式
这种模式允许容器去共享另一个容器网络命名空间,这说明两个容器可以相同的网络接口和IP地址,他们共享的是同一网络命名空间。
多个容器之间共享一个net work namespace(命名空间)。
docker run -itd --name shibint2 centos7:test /bin/bash

docker inspect -f '{{.State.Pid}}' de7721becc0d #查看容器进程号
ls -l /proc/85243/ns #查看容器的进程、网络、文件系统等命名空间编号

docker run -itd --name shibint3 --net=container:de7721becc0d centos7:test /bin/bash
docker inspect -f '{{.State.Pid}}' d190ef61d70f
ls -l /proc/85407/ns
2.3.3 none模式
此网络模式表示将容器拥有自己的网路命名空间,但不会进行任何网络配置,这实际给了用户完全的自主权来给自己配置容器的网络。
自闭空间。
docker run -itd --name shibint4 --network=none centos7:test /bin/bash
docker inspect 6ca926071acf
docker inspect shibint4 | grep NetworkMode


2.3.4 bridge模式
每个新创建的容器都将该网络分配一个IP地址,此网络模式允许所有docker容器之间以及docker宿主机之间进行互相通信。
默认模式,通过VETH对连接容器docker0网桥,网桥分配给容器IP,同时docker0作为局域网内容器的网关,最后与宿主机网卡进行通讯。
brctl show
iptables -t nat -vnL

(1)当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
(2)从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
(3)Docker将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0(容器的网卡),另一端放在主机中, 以 * 这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。可以通过 brctl show 命令查看。veth
(4)使用 docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL 查看。
2.3.5 自定义网络(user-defined network)
docker允许用户创建自己的定义的网络,用户可以定义的网络范围、子网、路由 等参数这种类型网络使用用户可以更好地对容器网络进行控住和隔离(生产业务需求;注:根据甲方指定或领导指定)。
根据业务需求指定静态IP地址。
(1)创建自定义网络
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
docker network ls
docker run -itd --name shibint5 --network mynetwork --ip 172.18.0.10 centos7:test /bin/bash
docker inspect aba32d42eac6
三、CPU资源控制
3.1 cgroups概念
cgroups,是一个非常强大的linux内核工具,他不仅可以限制被 namespace 隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups(Control groups)实现了对资源的配额和度量。
3.2 cgroups四大功能
(1)资源限制:可以对任务使用的资源总额进行限制。
(2)优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级。
(3)资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等。
(4)任务控制:cgroup可以对任务执行挂起、恢复等操作。
3.3 设置CPU使用率上限
Linux通过CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms。
使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。CFS 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 1000~1000000。 周期100毫秒,而容器的 CPU 配额必须不小于 1ms,即 --cpu-quota 的值必须 >= 1000。
docker run -itd --name shinbint6 centos7:test /bin/bash
cd /sys/fs/cgroup/cpu/docker/d9114eb9452bc8bfd58f0bfc923814bdd59e57f10ec087945f923be8db8fe690
cat cpu.cfs_quota_us
cat cpu.cfs_period_us
注意:cpu.cfs_quota_us:表示该cgroups限制占用的时间(微秒),默认为-1,表示不限制。 如果设为50000,表示占用50000/100000=50%的CPU。cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默认为100000。
3.4 进行CPU压力测试

docker exec -it d9114eb9452b /bin/bash
yum install -y vim
vim /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done

chmod +x /cpu.sh
./cpu.sh

3.5 设置50%的比例分配CPU使用时间上限
docker run -itd --name shibint7 --cpu-quota 50000 centos7:test /bin/bash
或
cd /sys/fs/cgroup/cpu/docker/43699328bb88d20059af3e70b503c982c7781f0e70c4c467f47d2634abd01554
echo 50000 > cpu.cfs_quota_us
docker exec -it 43699328bb88 /bin/bash
yum install -y vim
vim /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
chmod +x /cpu.sh
./cpu.sh

3.6 设置CPU资源占用比(设置多个容器时才有效)
docker run -itd --name test01 --cpu-shares 512 centos:7
docker run -itd --name test02 --cpu-shares 1024 centos:7
3.7 分别进入容器,进行压力测试
docker exec -it test01 /bin/bash
docker exec -it test02 /bin/bash

yum install -y epel-release
yum install -y stress
stress -c 4 #产生四个进程,每个进程都反复不停的计算随机数的平方根
3.8 设置容器绑定指定的CPU
(1) 先分配虚拟机4个CPU核数
docker run -itd --name test666 --cpuset-cpus 1,3 centos:7 /bin/bash

(2) 进入容器,进行压力测试
yum install -y epel-release
yum install stress -y
stress -c 4
