Docker 的体系结构

              Docker 的体系结构

 

Nanespce、Cgroup:容器虚拟化核心技术,在内核的概念。

Namespace:六项隔离

UTS:主机名和域名

IPC:信号量消息列队和共享内存

PID:进程编号

NET:网络栈,端口号

USER:用户和组

MNT:挂载点(文件系统)

只要解耦的这六项,其他资源即便有共同的情况,计算机也认为是在两个不同的系统中。

Cgroup:用来控制程序对资源的占用。Ctrl  

CGroup的作用:

  1. 资源限制:cgroup可以对进程组使用的资源总额进出限制
  2. 优先级分配:通过分配的cpu时间片数量及磁盘IO带宽大小,实际上就是相当于控制的进程运行的优先级
  3. 资源统计:从group:cgroup可以统计系统资源使用量,比如CPU使用时间,内存使用量等。可用于按量计费。
  4. 进程控制:可以对进程组执行挂机、恢复等操作。

Cgroup的应用:

   内存和交换分区限制

容器内存包括两个部分,物理内存和SWAp,在docker中科院通过参数控制容器内存的使用:

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

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

   容器的CPU限制

通过 -c 或者 --cpu-shares :设置容器使用cpu的权重,如果不设置,默认是1024

--name:给容器命名

   限制容器的Block io:磁盘的读写

bps:每秒读写的数据量

iops:每秒io的次数,io per second

--device-read-bps:设置读取设备的bps

--device-write-bps:设置写入设备的bps

--device-write-iops:设置写入设备的iops

权重比:1024 ,hooks--->钩子 ,权重越大越使用CPU越优先

耦合:冲突解除耦合,解耦。

容器是镜像的实例运行 ,    一个容器必须要有镜像, container-----> images

注意:如果你的应用程序对内核版本有要求,这种情况不推荐使用docker,可以使用KVM,vmwaer 等传统的虚拟化。

busybox:欺骗层

普通虚拟化:完全解耦,docker:半解耦

run:运行一个容器,-i:可交互,-t:伪终端,-d:保持容器后台运行

两个伪文件

[root@localhost /]# ls /proc/  /sys/

Docker 的体系结构_第1张图片

里面的数字都是pid

[root@localhost /]# cd /proc/1/ns/

Docker 的体系结构_第2张图片

启用路由转发

[root@localhost /]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf

[root@localhost /]# sysctl -p

启用一个docker容器

[root@localhost /]# docker run -it centos

这里可以看出新建的系统是一个最小化的系统,很多命令都不支持得另外安装

Docker 的体系结构_第3张图片

再新建一Ubuntu系统

[root@localhost /]# docker pull ubuntu

1)或者自定义系统,并导入到docker

[root@localhost /]# docker load < my-ubuntu.tar

[root@localhost /]# docker images

Docker 的体系结构_第4张图片

启用Ubuntu系统,可以看出版本和我们真实系统版本一样

[root@localhost /]# docker run -it ubuntu

root@4895a3857378:/# uname -r

查看CPU权重

[root@localhost /]# cd /sys/fs/cgroup/cpu/

[root@localhost cpu]# cat  cpu.shares

Docker 的体系结构_第5张图片

查看进程编号,所有的进程都是1024

[root@localhost cpu]# pwd

/sys/fs/cgroup/cpu

[root@localhost cpu]# cat tasks

Docker 的体系结构_第6张图片

查看内存的限制,以组进行限制

[root@localhost memory]# pwd

/sys/fs/cgroup/memory

启动一个实例,要求MEM为200M,MEM-SWAP为300M 。

[root@localhost /]# docker run -it -m 200M --memory-swap 300M centos

查看对内存的限制

[root@6b3bf67480ec /]# cd /sys/fs/cgroup/memory/

[root@6b3bf67480ec memory]# cat memory.limit_in_bytes

209715200      \\ 以字节显示,换算下来200M

查看swap的限制

[root@6b3bf67480ec memory]# cat memory.memsw.limit_in_bytes

314572800      \\ 以字节显示,换算下来300M

查看没有限制的容量

[root@localhost /]# cd /sys/fs/cgroup/memory/

[root@localhost memory]# cat memory.limit_in_bytes

9223372036854771712

运行一个容器并命名容器并查看CPU的权重

[root@localhost /]# docker run -it --name centos1 centos

[root@286a6be1f1ee /]# cat /sys/fs/cgroup/cpu/cpu.shares

1024

基于centos镜像运行一个容器,命名为containerB,cpu权重限制为512

[root@localhost /]# docker run -it --name containerB -c 512 centos

[root@df274444ad24 /]# cat /sys/fs/cgroup/cpu/cpu.shares

512

查看正在运行的容器

[root@localhost /]# docker ps

或者查看所有运行的容器

[root@localhost /]# docker ps --all

Docker 的体系结构_第7张图片

删除docker容器(id 号)

[root@localhost /]# docker rm   8f22e3c1f8e4

运行一个容器,并命名为test,限制磁盘的io量为30M

[root@localhost /]# docker run -it --name test --device-write-bps /dev/sda:30MB centos

测试磁盘限制

infile=写入

outfile=输出

bs=文件大小

count=写的次数

oflag=direct:用来自定dirc IO 方式写文件,这样cat会是--device-write-bps生效

[root@b580b1468d1c /]# time dd if=/dev/zero of=test.txt bs=1M count=800 oflag=direct

[root@b580b1468d1c /]# du -h test.txt

Docker 的体系结构_第8张图片

查看没有限制的读写

[root@b580b1468d1c /]# exit

exit

[root@localhost /]# docker run -it --name testA  centos

[root@6f282d62e6f7 /]# time dd if=/dev/zero of=test.txt bs=1M count=800 oflag=direct

Docker 的体系结构_第9张图片

你可能感兴趣的:(Docker)