重要到不要不要的-docker底层知识
Posted Friends of the wind
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重要到不要不要的-docker底层知识相关的知识,希望对你有一定的参考价值。
概念
Namespace(名称空间):
名字空间是Linux内核一个强大的特性。每个容器都有自己单独的名字空间,运行在其中的应用都像是在独立的操作系统中运行一样。名字空间保证了容器之间彼此互不影响。namespec六项隔离,实现了容器与宿主机、容器与容器之间的隔离。
IPC: 共享内存、消息列队
MNT: 挂载点、文件系统
NET: 网络栈
PID: 进程编号
USER: 用户、组
UTS: 主机名、域名
释义:
ipc 名字空间
容器中进程交互还是采用了 Linux 常见的进程间交互方法(interprocess communication – IPC), 包括信号量、消息队列和共享内存等。然而同 VM 不同的是,容器的进程间交互实际上还是 host 上具有相同
mnt 名字空间
类似 chroot,将一个进程放到一个特定的目录执行。mnt 名字空间允许不同名字空间的进程看到的文件结构不同,这样每个名字空间 中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个名字空间中的容器在 /proc/mounts 的信息只包含所在名字空间的 mount point。
net 名字空间
有了 pid 名字空间, 每个名字空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 名字空间实现的, 每个 net 名字空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。Docker 默认采用 veth 的方式,将容器中的虚拟网卡同 host 上的一 个Docker 网桥 docker0 连接在一起。
pid 名字空间
不同用户的进程就是通过 pid 名字空间隔离开的,且不同名字空间中可以有相同 pid。所有的 LXC 进程在 Docker 中的父进程为Docker进程,每个 LXC 进程具有不同的名字空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。
user 名字空间
每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。
uts 名字空间
UTS(“UNIX Time-sharing System”) 名字空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 主机上的一个进程。
常用命令
提示:无非是增删改查
例如:
1、 查
查看镜像
docker images
查看所有容器
docker ps -a
保存镜像
docker save -o nginx.tar nginx:latest
2、 增
载入镜像
docker load -i nginx.tar
3、 删
删除容器
如果程序正在运行,则需要先停止
docker stop testweb
删除镜像
高级命令
Cgroup(控制组):
控制组(cgroups)是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。
控制组技术最早是由 Google 的程序员 2006 年起提出,Linux 内核自 2.6.24 开始支持。
控制组可以提供对容器的内存、CPU、磁盘 IO 等资源的限制和审计管理。
四大功能:
1)资源限制:cgroup可以对进程组使用的资源总额进行限制。
2) 优先级分配:通过分配的cpu时间片数量以及硬盘IO带宽大小,实际上相当于控制了进程运行的优先级别。
3)资源统计:cgroup可以统计系统资源使用量,比如cpu使用时间,内存使用量等,用于按量计费。同时,还支持挂起动能,也就是说通过cgroup把所有资源限制起来,对资源都不能使用,注意着并不是说我们的程序不能使用了,只是不能使用资源,处于等待状态。
4)进程控制:可以对进程组执行挂起、恢复等操作。
1、限制使用内存大小
运行一个容器,并且限制该容器最多使用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.
运行一个容器,限制使用512MB
docker run -itd --name container2 -c 512 centos:7
验证:
cd /sys/fs/cgroup/cpu/docker/5f0614e25a5414ded52905240fd7086bdf3db317aa21a84ed4e48f904ca794e3/
cat cpu.shares
3、 限制容器的Block IO(磁盘的读写速率等)
注释:
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。
1)运行一个容器,限制testa这个容器,写入/dev/sda这块磁盘的bps为30MB。
docker run -it --name testa --device-write-bps /dev/sda:30MB centos:7
2)验证:从/dev/zero输入,然后输出到test.out文件中,每次大小为1M,总共800次,oflag=direct 用来指定directIO方式写文件,这样才会使–device-write-bps生效。
从宿主机进入docker里面的centos7
docker exec -it testA /bin/bash
执行创建指定大小文件命令
time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
由图可见,大小限制在30MB左右
以上是关于重要到不要不要的-docker底层知识的主要内容,如果未能解决你的问题,请参考以下文章