Docker核心概念#
一句话答案#
Docker 三要素:镜像(只读模板)、容器(运行实例)、仓库(存储分发),底层靠 Namespace 隔离 + Cgroup 限制资源。
核心要点
核心概念:
- 镜像(Image):只读的分层文件系统模板,包含运行应用所需的一切
- 容器(Container):镜像的运行实例,有自己的文件系统/网络/进程空间
- 仓库(Registry):存储和分发镜像(Docker Hub / 私有仓库)
镜像分层: 每条 Dockerfile 指令生成一层,分层存储 + Copy-On-Write
核心命令: docker build(构建) / docker run(运行) / docker exec -it(进入) / docker compose up(编排)
隔离技术: Namespace(PID/NET/MNT等隔离) + Cgroup(CPU/内存限制)
Namespace 底层原理(隔离)#
本质: 内核给进程(task_struct)挂一组命名空间指针,同一 namespace 内的进程共享一套资源视图,互相看不到外面。隔离的是”看到什么”。
六类 Namespace:
| 类型 | 隔离内容 |
|---|---|
| PID | 进程树(容器内 PID 从 1 重新计数) |
| NET | 网卡 / 路由表 / iptables / 端口 |
| MNT | 挂载点 / 文件系统视图 |
| UTS | 主机名 / 域名 |
| IPC | 信号量 / 消息队列 / 共享内存 |
| USER | UID/GID 映射(容器内 root 可映射为宿主普通用户) |
三个系统调用驱动: clone()(创建进程时带 CLONE_NEWxxx 标志,新建并加入 namespace)、unshare()(当前进程脱离原 namespace 进新的)、setns()(加入已存在的 namespace,docker exec 就靠它进入容器)。
PID namespace 映射: 容器主进程在容器内是 PID 1,在宿主机上却是一个普通大 PID;映射是单向的——宿主机能看到并管理容器进程,容器内却看不到宿主进程树,这就是”隔离”的不对称性。
Cgroup 底层原理(限制)#
本质: 以层级树组织进程分组,每个子系统(controller)对一组进程的某类资源做计量和限制。Namespace 管”看到什么”,Cgroup 管”能用多少”。
- CPU:
cpu.cfs_period_us(调度周期,默认 100ms)+cpu.cfs_quota_us(每周期可用 CPU 时间)。quota/period = 限制核数,例如 quota=50000 即 0.5 核;CFS 调度器在每个周期内扣减配额,用完即被节流(throttle)。 - 内存:
memory.limit_in_bytes设上限,进程总内存超限触发 cgroup OOM killer,杀掉组内进程(容器 OOM 即源于此,与宿主全局 OOM 区分)。 - v1 vs v2: v1 每个 controller 各自独立层级树,配置分散;v2 统一为单一层级树(unified hierarchy),便于多资源协同与统计,现代发行版默认 v2。
为什么容器比 VM 轻#
容器只是被 Namespace + Cgroup 圈起来的宿主机进程,直接复用宿主内核,无需 Guest OS、无 Hypervisor 指令翻译,因此 MB 级开销、秒级启动、单机数百容器。
面试回答(2分钟版)
Docker的核心概念围绕三要素展开:镜像、容器和仓库。镜像是只读的分层文件系统模板,Dockerfile每条指令生成一层,层之间共享存储;容器是镜像的运行实例,在镜像之上加一个可写层,采用Copy-On-Write策略;仓库比如Docker Hub或私有Harbor,负责镜像的存储和分发。底层实现依赖两个Linux内核机制——Namespace提供隔离能力,包括PID、Network、Mount等多个维度的隔离,让每个容器看起来像一个独立系统;Cgroup提供资源限制能力,控制每个容器能用多少CPU和内存,防止互相抢占。日常开发中最常用的命令是docker build构建镜像、docker run启动容器、docker compose做多容器编排。实际项目中我们用多阶段构建来减小镜像体积,用docker compose管理本地开发环境的多服务依赖,生产环境则交给K8s编排。理解分层机制对优化构建速度很关键——把不常变的依赖层放前面,频繁变动的代码层放后面,可以充分利用缓存。
追问与易错
追问方向:
- “Namespace 和 Cgroup 分别做什么?”→ Namespace 提供隔离(PID/Network/Mount/UTS/IPC/User 六种),让容器看起来有独立的进程树和网络;Cgroup 提供资源限制,控制容器能用多少 CPU/内存,防止互相抢占
- “镜像分层存储的好处?”→ 多个容器共享相同的只读层节省磁盘,拉取镜像时只下载缺失的层节省带宽;写操作通过 Copy-On-Write 在可写层完成,不影响其他容器
- “docker compose 和 K8s 有什么区别?”→ compose 是单机多容器编排工具,适合本地开发和测试;K8s 是分布式集群编排平台,支持多节点调度、自动扩缩容、滚动更新、服务发现等生产级能力
易错点:
- ❌ 把 Namespace 和 Cgroup 混为一谈——Namespace 管”隔离视图”(看不看得到),Cgroup 管”资源配额”(用得了多少),是正交的两件事
- ❌ 以为容器是”轻量级虚拟机”——容器本质就是被圈起来的宿主机进程,没有独立内核,不存在”虚拟化层”
- ❌ 不知道
docker exec怎么进容器——靠setns()把当前进程加入目标容器的各个 namespace