Nanespce、Cgroup:容器虚拟化核心技术,在内核的概念。
Namespace:六项隔离
UTS:主机名和域名
IPC:信号量消息列队和共享内存
PID:进程编号
NET:网络栈,端口号
USER:用户和组
MNT:挂载点(文件系统)
只要解耦的这六项,其他资源即便有共同的情况,计算机也认为是在两个不同的系统中。
Cgroup:用来控制程序对资源的占用。Ctrl
CGroup的作用:
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/
里面的数字都是pid
[root@localhost /]# cd /proc/1/ns/
启用路由转发
[root@localhost /]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@localhost /]# sysctl -p
启用一个docker容器
[root@localhost /]# docker run -it centos
这里可以看出新建的系统是一个最小化的系统,很多命令都不支持得另外安装
再新建一Ubuntu系统
[root@localhost /]# docker pull ubuntu
1)或者自定义系统,并导入到docker
[root@localhost /]# docker load < my-ubuntu.tar
[root@localhost /]# docker images
启用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
查看进程编号,所有的进程都是1024
[root@localhost cpu]# pwd
/sys/fs/cgroup/cpu
[root@localhost cpu]# cat tasks
查看内存的限制,以组进行限制
[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容器(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
查看没有限制的读写
[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