Docker 的体系结构
Nanespce、Cgroup:容器虚拟化核心技术,在内核的概念。
Namespace:六项隔离
UTS:主机名和域名
IPC:信号量消息列队和共享内存
PID:进程编号
NET:网络栈,端口号
USER:用户和组
MNT:挂载点(文件系统)
只要解耦的这六项,其他资源即便有共同的情况,计算机也认为是在两个不同的系统中。
Cgroup:用来控制程序对资源的占用。Ctrl
CGroup的作用:
- 资源限制:cgroup可以对进程组使用的资源总额进出限制
- 优先级分配:通过分配的cpu时间片数量及磁盘IO带宽大小,实际上就是相当于控制的进程运行的优先级
- 资源统计:从group:cgroup可以统计系统资源使用量,比如CPU使用时间,内存使用量等。可用于按量计费。
- 进程控制:可以对进程组执行挂机、恢复等操作。
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:保持容器后台运行
两个伪文件
[[email protected] /]# ls /proc/ /sys/
里面的数字都是pid
[[email protected] /]# cd /proc/1/ns/
启用路由转发
[[email protected] /]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[[email protected] /]# sysctl -p
启用一个docker容器
[[email protected] /]# docker run -it centos
这里可以看出新建的系统是一个最小化的系统,很多命令都不支持得另外安装
再新建一Ubuntu系统
[[email protected] /]# docker pull ubuntu
1)或者自定义系统,并导入到docker
[[email protected] /]# docker load < my-ubuntu.tar
[[email protected] /]# docker images
启用Ubuntu系统,可以看出版本和我们真实系统版本一样
[[email protected] /]# docker run -it ubuntu
[email protected]:/# uname -r
查看CPU权重
[[email protected] /]# cd /sys/fs/cgroup/cpu/
[[email protected] cpu]# cat cpu.shares
查看进程编号,所有的进程都是1024
[[email protected] cpu]# pwd
/sys/fs/cgroup/cpu
[[email protected] cpu]# cat tasks
查看内存的限制,以组进行限制
[[email protected] memory]# pwd
/sys/fs/cgroup/memory
启动一个实例,要求MEM为200M,MEM-SWAP为300M 。
[[email protected] /]# docker run -it -m 200M --memory-swap 300M centos
查看对内存的限制
[[email protected] /]# cd /sys/fs/cgroup/memory/
[[email protected] memory]# cat memory.limit_in_bytes
209715200 \\ 以字节显示,换算下来200M
查看swap的限制
[[email protected] memory]# cat memory.memsw.limit_in_bytes
314572800 \\ 以字节显示,换算下来300M
查看没有限制的容量
[[email protected] /]# cd /sys/fs/cgroup/memory/
[[email protected] memory]# cat memory.limit_in_bytes
9223372036854771712
运行一个容器并命名容器并查看CPU的权重
[[email protected] /]# docker run -it --name centos1 centos
[[email protected] /]# cat /sys/fs/cgroup/cpu/cpu.shares
1024
基于centos镜像运行一个容器,命名为containerB,cpu权重限制为512
[[email protected] /]# docker run -it --name containerB -c 512 centos
[[email protected] /]# cat /sys/fs/cgroup/cpu/cpu.shares
512
查看正在运行的容器
[[email protected] /]# docker ps
或者查看所有运行的容器
[[email protected] /]# docker ps --all
删除docker容器(id 号)
[[email protected] /]# docker rm 8f22e3c1f8e4
运行一个容器,并命名为test,限制磁盘的io量为30M
[[email protected] /]# docker run -it --name test --device-write-bps /dev/sda:30MB centos
测试磁盘限制
infile=写入
outfile=输出
bs=文件大小
count=写的次数
oflag=direct:用来自定dirc IO 方式写文件,这样cat会是--device-write-bps生效
[[email protected] /]# time dd if=/dev/zero of=test.txt bs=1M count=800 oflag=direct
[[email protected] /]# du -h test.txt
查看没有限制的读写
[[email protected] /]# exit
exit
[[email protected] /]# docker run -it --name testA centos
[[email protected] /]# time dd if=/dev/zero of=test.txt bs=1M count=800 oflag=direct