一、容器
1.Docker 和虚拟机,物理主机
- Bootloader:它负责设备的启动过程。
- Shell:Shell是一种编程语言,它可以控制其他文件,进程以及所有其他程序。
- Kernel:它是操作系统的主要组件,管理内存,CPU和其他相关组件。
- Desktop Environment:这是用户通常与之交互的环境。
- Graphical server(图形服务器):它是操作系统的子系统,用于在屏幕上显示图形
- Applications: 这些是执行不同用户任务(例如word,excel等)的程序集。
- Daemons : 后台服务提供商。
- 用于应用程序执行的流程管理。
- 内存和I / O(输入/输出)管理。
- 系统调用控制(内核的核心行为)。
- 借助设备驱动程序进行设备管理。

- 传统虚拟机是虚拟出一个主机硬件,并且运行一个完整的操作系统 ,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内核之上,容器并没有自己的内核,也不需要虚拟硬件,相当轻量化
- 每个容器间是互相隔离,每个容器内都有一个属于自己的独立文件系统,独立的进程空间,网络空间,用户空间等,所以在同一个宿主机上的多个容器之间彼此不会相互影响
二、Docker
1.什么是docker
2.Docker和传统虚拟机的区别
Docker容器 |
虚拟机 | |
特性 |
所有容器共享宿主机内核 |
每个虚拟机都有独立的操作系统和内核 |
隔离性 |
通过namespace实现资源隔离,通过cgroup实现限制资源的最大使用量 |
完全隔离,每个虚拟机都有独立的硬件资源 |
启动速度 |
秒级启动速度 |
分钟级启动速度 |
性能损耗 |
容器相当于宿主机的进程,性能几乎没有损耗 |
需要通过hypervisor虚拟机管理程序对宿主机资源虚拟访问,至少有20%~50%的性能损耗 |
系统支持量(单机) |
单机容量能够支持成百上千个容器 |
单机容量最多支持几十个虚拟机 |
3.Docker核心概念
镜像
容器
仓库
4.Linux中的namespace( 命名空间)
namespace |
系统调用参数 |
隔离内容 |
UTS |
CLONE_NEWUTS |
主机名与域名 |
IPC |
CLONE_NEWWIPC |
信号量、消息队列和共享内存 |
PID |
CLONE_NEWPID |
进程编号 |
NETWORK |
CLONE_NEWNET |
网络设备、网络栈、端口等 |
MOUNT |
CLONE_NEWNS |
挂载点(文件系统) |
USER |
CLONE_NEWUSER |
用户和用户组(3.8以后的内核才支持) |
5.Namespace

- 怎么样保证每个容器都有不同的文件系统并且能互不影响?
- 一个docker主进程内的各个容器都是其子进程,那么如果实现同一个主进程下不同类型的子进程?各个容器子进程间能相互通信(内存数据)吗?
- 每个容器怎么解决IP及端口分配的问题?
- 多个容器的主机名能一样吗?
- 每个容器都要不要有root用户?怎么解决账户重名问题
隔离类型 |
功能 |
系统调用参数 |
MNT Namespace(mount) |
提供磁盘挂载点和文件系统的隔离能力 |
CLONE_NEWNS |
IPC Namespace(Inter-Process Communication) |
提供进程间通信的隔离能力,包括信号量,消息队列和共享内存 |
CLONE_NEWIPC |
UTS Namespace(UNIXTimesharing System) |
提供内核,主机名和域名隔离能力 |
CLONE_NEWUTS |
PID Namespace(ProcessIdentification) |
提供进程隔离能力 |
CLONE_NEWPID |
Net Namespace(network) |
提供网络隔离能力,包括网络设备,网络栈,端口等 |
CLONE_NEWNET |
User Namespace(user) |
提供用户隔离能力,包括用户和组 |
CLONE_NEWUSER |
TimeNamespace |
提供时间隔离能力 |
CLONE_NEWTIME |
syslogNamespace |
提供syslog隔离能力 |
syslognamespace是由华为工程师RuiXiang(瑞翔)提出的,但没有合并到linux内核中,后systemd在2020年2在2020年2 月实现了一个名为“journalnamespace”的类似功能 |
Controlgroup(cgroup)Namespace |
提供进程所属的控制组的身份隔离 |
6.Control groups

cgroups 具体实现
- blkio: 块设备IO限制
- cpu: 使用调度程序为 cgroup 任务提供 cpu 的访问
- cpuacct: 产生 cgroup 任务的 cpu 资源报告
- cpuset: 如果是多核心的 cpu,这个子系统会为 cgroup 任务分配单独的 cpu 和内存
- devices: 允许或拒绝 cgroup 任务对设备的访问
- freezer: 暂停和恢复 cgroup 任务
- memory: 设置每个 cgroup 的内存限制以及产生内存资源报告
- net_cls: 标记每个网络包以供 cgroup 方便使用
- ns: 命名空间子系统
- perf_event: 增加了对每 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所有线程以及运行在特定CPU上的线程
容器管理工具
7.容器 runtime

- runc: 早期libcontainer是Docker公司控制的一个开源项目,OCI的成立后,Docker把libcontainer项目移交给了OCI组织,runC就是在libcontainer的基础上进化而来,目前Docker默认的runtime,runc遵守OCI规范
低级容器运行时与高级容器运行时
- High-Level:高级运行时提供基于API的远程管理操作,客户端可以通过高级别运行时管理容器的整个生命周期(创建、删除、重启、停止),高级别运行时并不真正直接运行容器,而是调用低级别运行时运行,比如dockerd、containerd都是高级别运行时。
- Low-Level:接受高级别运行时的指令,按照相应的指令运行容器,因此低级别运行时真是运行容器的地方,例如runc
