Docker底层原理
一、传统虚拟机与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
2、CPU限制:
通过-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
更多推荐
所有评论(0)