05 :从进程说起
1、容器本身没有价值,有价值的是"容器编排"
2、什么是进程?
一旦"程序"被执行起来,它就从磁盘上的二进制文件,变成
1、计算机内存中的数据
2、寄存器里的值
3、堆栈中的指令
4、被打开的文件
5、以及各种设备的状态信息的一个集合。
像这样一个程序运行起来后的计算机执行环境的综合,就是我们今天的主角:进程
3、容器技术的核心功能:
1、就是通过约束和修改进程的动态表现,从而为其创造出一个"边界"
2、Cgroups 技术是用来制造约束的主要手段
3、Namespace 技术则是用来修改进程视图的主要方法。
4、Linux容器最基本的实现原理了
[root@luoahong ~]# docker run -it busybox /bin/sh
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
57c14dd66db0: Pull complete
Digest: sha256:7964ad52e396a6e045c39b5a44438424ac52e12e4d5a25d94895f2058cb863a0
Status: Downloaded newer image for busybox:latest
/ # ps
PID USER TIME COMMAND
1 root 0:00 /bin/sh
6 root 0:00 ps
请帮我启动一个容器,在容器里执行 /bin/sh,并且给我分配一个命令行终端跟这个容器交互
本来,每当我们在宿主机上运行了一个 /bin/sh 程序,操作系统都会给他分配一个进程编号,比如PID=100
这个编号是进程的唯一标识,就像员工的工牌一样,所以PID=100,可以粗略地理解为这个/bin/sh是我们公司里的第
100号员工,而第1号员工就自然是比尔 · 盖茨这样统领全局的人物。
而除了我们刚刚用到的 PID Namespace,Linux操作系统还提供了 Mount、UTS、IPC、
Network 和 User 这些 Namespace用来对各种不同的进程上下文进行“障眼法”操作
5、容器,其实是一种特殊的进程而已
实际上是在创建容器进程时,指定了这个进程所需要启用的一组 Namespace 参数。这样,容器就只能“看”到当前
Namespace 所限定的资源、文件、设备、状态,或者配置而对于宿主机以及其他不相关的程序,它就完全看不到了。
6、容器和虚拟机的比较
这时,这些进程就会觉得自己是各自 PID Namespace,里的第 1 号进程,只能看到各自 Mount Namespace里挂载
用来对各种不同的进程上下文进行“障眼法”操作
06 :隔离与限制
Namespace 技术实际上修改了应用进程看待整个计算机"视图"被操作系统做了限制,只能"看到"某些指定的内容
1、容器相对于虚拟机最大的优势是?
“敏捷”和“高性能”是容器相较于虚拟机最大的优势,也是它能够在 PaaS 这种更细粒度的资源管理平台上大行其道的重要原因
优点:“敏捷”和“高性能”
缺点:隔离的不彻底
不能被Namespace 化的资源和对象 比如时间
2、限制
1、Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等
[root@luoahong container]# pwd
/sys/fs/cgroup/cpu/container
[root@luoahong container]# while : ; do : ; done &
[1] 1447
[root@luoahong container]# cat /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us
-1
[root@luoahong container]# cat /sys/fs/cgroup/cpu/container/cpu.cfs_period_us
100000
[root@luoahong container]# echo 20000 > /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us
[root@luoahong container]# echo 1447 > /sys/fs/cgroup/cpu/container/tasks
2、Linux Cgroups 的设计还是比较易用的,简单粗暴地理解呢,它就是一个子系统目录加上一组资源限制文件的组合
docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash $ cat /sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_period_us
100000
$ cat /sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_quota_us
20000
3、容器是一个单进程模型
[root@k8s-master ~]# docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash
root@beac9236771e:/# cd /sys/fs/cgroup/cpu/
root@beac9236771e:/sys/fs/cgroup/cpu# ls
cgroup.clone_children cgroup.procs cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat cpuacct.usage notify_on_release
cgroup.event_control cpu.cfs_period_us cpu.rt_period_us cpu.shares cpuacct.stat cpuacct.usage_percpu tasks
root@beac9236771e:/sys/fs/cgroup/cpu# cat cpu.cfs_period_us
100000
root@beac9236771e:/sys/fs/cgroup/cpu# cat cpu.cfs_quota_us
20000
root@beac9236771e:/sys/fs/cgroup/cpu# pwd
/sys/fs/cgroup/cpu $ mount -l | grep tmpfs
none on /tmp type tmpfs (rw,relatime) [root@k8s-master cpu]# mount -l | grep tmpfs
devtmpfs on /dev type devtmpfs (rw,nosuid,size=1006112k,nr_inodes=251528,mode=755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=203192k,mode=700)
这就意味着这个 Docker 容器,只能使用到 20% 的cpu带宽