Docker知识体系
2024-06-07 20:16:32 0 举报
AI智能生成
Docker知识体系
作者其他创作
大纲/内容
网络
联通
同一主机
1. 同网段内的容器直接互通
2. 不同网段
不同主机
原理
docker 创建容器时会自动创建一对网卡(默认bridge),一半放在容器上,一半放在宿主机上,并且这对网卡都被插到了docker0上。可通过brctl show命令查看
分支主题
分支主题
本质
单进程模型
由于一个容器的本质就是一个进程,用户的应用进程实际上就是容器里PID=1的进程,也是其他后续创建的所有进程的父进程。这就意味着,在一个容器中,你没办法同时运行两个不同的应用,除非你的进程是一个公共的PID=1的程序,充当两个不同应用的父进程。
NameSpace
类型
PID
Mount
UTS
Network
IPC
本质
Namespace 其实是Linux创建新进程的一个参数, 系统调用为 clone
int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL);
优势
使用虚拟机技术,必须创建一个虚拟机,这个虚拟机是真实存在的,里面还必须跑着一个真实存在的操作系统,不可避免带来资源损耗
使用容器呢,一个进程而已。不存在虚拟化带来的损耗,也不需要运行单独的操作系统,容器额外占用资源忽略不计。
劣势
隔离不彻底
既然容器只是运行在宿主机上的一种特殊的进程,
那么多个容器之间使用的就还是同一个宿主机的操作系统内核。看似Mount namespace很灵活,挂载其他版本操作系统,如centos或者ubuntu,但并不能改变共享宿主机内核的事实,也就导致了低版本Linux宿主机无法运行高版本Linux内核的容器
无法限制资源使用
Namespace技术将进程隔离出来后,虽然应用自身认为是pid=1的进程,但是在宿主机层面它还是pid=100的应用,和其他宿主机应用是公平竞争关系。也就是说,它可使用的资源(CPU,内存)是可以被其他宿主机应用给占用的,也可能它把整个宿主机资源全部吃光。无论哪种行为,这都不是一个合理的“沙盒”应该有的行为。这个时候就又需要引入Linux的Cgroups技术了。
Cgroups(Linux Control Group)
限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
实践
1. 首先创建一个死循环查看进程号: while : ; do : ; done &
2. 使用 top 命令查看CPU占用 100%
3. 到 /sys/fs/cgroup/cpu 目录下创建一个文件夹 container 后再通过 ls 查看文件夹内容。这些就是资源限制规则文件集合,关注cpu.cfs_period_us和cpu.cfs_quota_us两个文件(可通过cat 命令查看内容),两个文件要配合使用,一个表示cpu的单位时间,另一个表示单位时间内最大分配使用时间,这边默认配置是100000(即100ms)和-1,表示不对其做任何不限制。
4. 接下来将死循环进程限制为最多使用 20% 的CPU,通过命令写入
echo 24996 > container/tasks
echo 20000 > container/cpu.cfs_quota_us
5. 此时再通过 top 命令查看,此时CPU使用已经降到 20%
6. 接下来实验docker, 运行容器,并设置CPU限制:
docker run -id --cpu-period=100000 --cpu-quota=20000 busybox
7. 接下来查看cgroup 目录文件内容,发现文件内容正是刚刚docker设置的参数:
cat /sys/fs/cgroup/cpu/docker/15eb68194b209c47bea9613a1a2e13f4ed468d5a6fc65c06021a548df9d7267f/cpu.cfs_quota_us
cat /sys/fs/cgroup/cpu/docker/15eb68194b209c47bea9613a1a2e13f4ed468d5a6fc65c06021a548df9d7267f/cpu.cfs_period_us
8. 至此,cgroup 就完成了docker的资源限制功能
缺陷
创建限制内存的容器后,进入容器通过free及top查看仍然是宿主机的内存
原因
这是因为Linux系统/proc这个目录记录了系统运行的状态信息,也是top和free主要的信息来源。而/proc这个目录并不知道Cgroups给这个容器做了什么样的限制。在生产环境中,这个问题必须进行修正,否则应用程序在容器里读取到的CPU核数、可用内存等信息都是宿主机上的数据,这会给应用的运行带来非常大的困惑和风险。容器并没有做到对 /proc, /sys 等文件系统的资源视图隔离
改进
使用 lxcfs 做容器的资源视图隔离
虚拟化
通过将真实的硬件抽象为逻辑可控的软件单元, 使得昂贵的硬件资源能够按需,按量分配, 以达到减少资源浪费,实现硬件利用率最大化的目的.. 可扩大扩大硬件容量,简化软件的重新配置过程。可单CPU运行模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间运行而互不影响。
虚拟化技术与多任务及超线程技术完全不同
1. 多任务是指在一个操作系统中多个程序同时并行运行
2. 超线程技术只是单CPU模拟双双CPU来平衡程序运行性能,这两个模拟出来的CPU不能分离,只能协同工作
将不同资源和逻辑单元剥离,形成松耦合关系的技术
虚拟机与容器区别
两者都是抽象硬件并对系统资源提供隔离及配额, 但两者在本质上却存在很大差异
虚拟机: 原理是通过额外的虚拟化层, 将虚拟机中运行的操作系统指令翻译成宿主机系统能够执行的系统调用, 然后操作具体硬件.如此便较好的实现虚拟机与宿主机操作系统的异构
容器技术: 容器则完全建立在操作系统内核特性之上, 是一种与运行硬件无关的虚拟化技术.由于此种方式实现的虚拟化无需转换异构指令的虚拟层, 所以在运行效率上比虚拟机方式更高, 但是只能实现与宿主机操作系统相同的虚拟化.
网络驱动模型
bridge
host
overlay
none
Swarm
滚动更新
docker service update --image redis:4.0.5 redis
--update-delay
--update-parallelism
--update-failure-action
0 条评论
下一页
为你推荐
查看更多