一、传统虚拟机与docker的区别

传统虚拟机:

每个虚拟机都有独立的操作系统,资源的分配由各自的操作系统分别管理

docker

容器没有独立的操作系统,系统资源的分配有docker引擎统一管理

主要通过两个技术实现:namespace、cgroup

namespace主要实现资源的隔离

Cgroup主要实现资源的限制

二、Namespace(名称/命名空间):

名称空间是Linux内核一个强大的特性。

每个容器都有自己单独的六个名称空间,

运行在其中的应用就像是在独立的操作系统中运行一样。

Namespece的六项隔离,实现了容器与宿主机、容器与容器之间的隔离。

它们分别是:

pid namespace(进程隔离)

net namespace(网络隔离)

ipc namespace(进程间交互隔离)

mnt namespace(文件系统隔离)

uts namespace(主机名、域名隔离)

user namespace(用户隔离)

三、Cgroup(control gruop控制组):

控制组(cgroup)是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免当多个容器同时运行时对系统资源的竞争。

控制组可以提供对容器的内存、CPU、磁盘 IO 等资源的限制和审计管理。

mount -t cgroup

查询系统中已经mount 的cgroup的文件系统,这里的-t表示type

cd /sys/fs/cgroup

1、内存限额:

容器内存包括两个部分:物理内存和swap

可以通过参数控制容器内存的使用量:

        -m 或者--memory:  设置内存的使用限额

        --memory-swap: 设置内存+ swap的使用限额

例如:

​运行一个容器,并且限制该容器最多使用200M内存和100M的swap。   

docker run -itd --name container1 -m 200MB --memory-swap 300MB centos:7

cd /sys/fs/cgroup/memory/docker/545dc2376efedb0d48e174fd8a9a614baf64f99fc09

cat memory.limit_in_bytes

209715200

cat memory.memsw.limit_in_bytes

314572800

2CPU限制:

通过-c或者--cpu-shares设置容器使用cpu的权重。如果不设置默认为1024.

例如:

docker run -itd --name container2 -c 512 centos:7

cd /sys/fs/cgroup/cpu/docker/76178cf366cea1d7a60729f21877d135c25141281ae4b6

cat cpu.shares

512

对比一个没有做CPU权重限制的容器。

docker run -itd --name container3 centos:7

cd /sys/fs/cgroup/cpu/docker/4d0858de8e825d362305c05de2293a619d4329ba82dbf8

cat cpu.shares

1024

3、磁盘的读写:(虚拟机模拟现象有较大偏差)

docker中可以通过设置权重,限制bps和iops的方式控制容器读写磁盘的IO.

bps:  每秒读写的数据量  byte per second

iops:  每秒IO的次数     io per second。

默认情况下,所有容器都能够平等的读写磁盘,也可以通过--blkio-weight参数改变容器的blockIO 的优先级。

 --device-read-bps: 显示读取某个设备的bps。

 --device-write-bps: 显示写入某个设备的bps。

 --device-read-iops: 显示读取某个设备的iops。

 --device-write-iops: 显示写入某个设备的iops。

例如:限制testA这个容器,写入/dev/sda这块磁盘的bps为30MB.

docker run -it  --name testA --device-write-bps /dev/sda:30MB centos:7

从/dev/zero输入,然后输出到test.out文件中,每次大小为1M,总共800次,oflag=direct 用来指定directIO方式写文件,这样才会使--device-write-bps生效。

docker exec -it testA  /bin/bash

time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct

800+0 records in

800+0 records out

838860800 bytes (839 MB) copied, 26.6228 s, 31.5 MB/s

real  0m26.629s

user 0m0.005s

sys   0m1.902s

```

再运行一个不做限制testB容器,对比一下速率

docker run -itd --name testB centos:7

docker exec -it testB /bin/bash

time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct

800+0 records in

800+0 records out

838860800 bytes (839 MB) copied, 2.32559 s, 361 MB/s

real  0m2.328s

user 0m0.000s

sys   0m2.107s

更多推荐