Docker / 命令文档
Docker 基础核心(面试向)
概述
本篇是「Docker 面试核心」系列第一篇,讲清四个概念题高频区:Docker 是什么、容器与镜像的关系、容器与虚拟机的区别、Docker Engine 三件套与 Registry。概念题答得准,后面命令与实战的题才有根。
本系列共六篇:基础、命令、Dockerfile、镜像、网络、资源限制。全部命令与输出均在 CentOS 测试机(Docker 26.1.4,overlay2 + cgroup v1)实测通过。
概念题的回答公式:一句话定义 + 与相邻概念的本质区别 + 一个佐证事实。例如容器与 VM:一句「共享内核的进程隔离」+ 区别在有无 Guest OS + 佐证「容器内 uname -r 与宿主机完全相同」。
Docker 是什么
Docker 是基于 Linux 内核隔离技术(Namespace + Cgroups)的容器化平台,把应用连同运行时环境打包成镜像,实现「一次构建,到处运行」。
测试机上两条命令就能说明 Docker 的客户机/服务端架构:
$ docker version --format "Client: {{.Client.Version}} / Server: {{.Server.Version}}"
Client: 26.1.4 / Server: 26.1.4
$ docker info 2>/dev/null | grep -E "Server Version|Storage Driver|Backing|Cgroup Driver|Cgroup Version"
Server Version: 26.1.4
Storage Driver: overlay2
Backing Filesystem: extfs
Cgroup Driver: cgroupfs
Cgroup Version: 1面试要点:
- Docker 解决的核心痛点是环境一致性与交付效率:依赖、运行时、配置全部固化进镜像
- 架构是客户端/服务端:
docker命令是客户端,真正干活的是 dockerd(守护进程),两者通过 REST API(默认 /var/run/docker.sock)通信 - 底层三件套:Namespace 做隔离(PID/网络/挂载点等),Cgroups 做资源限制,UnionFS(overlay2)做镜像分层
Container 是什么
容器是一个被隔离和限权的「进程组」:有自己的 PID 空间、网络栈、文件系统视图,但与其他容器共享同一个宿主机内核。
两个实测佐证:
# 1) 共享内核:容器内看到的内核版本 = 宿主机内核版本 $ uname -r 3.10.0-1160.119.1.el7.x86_64 $ docker run --rm busybox:latest uname -r 3.10.0-1160.119.1.el7.x86_64 # 2) 独立 PID 空间:容器里 cat 命令自己就是 1 号进程 $ docker run --rm busybox:latest cat /proc/1/comm cat
面试要点:
- 容器的本质是「带隔离视图的进程」,
docker run的主进程就是容器的 PID 1,它退出容器就退出 - PID 1 有特殊语义:负责转发信号给子进程、回收僵尸进程,所以应用必须能正确处理 SIGTERM(这也是
docker stop优雅退出的前提) - 容器不是「轻量虚拟机」:没有 Guest OS、没有引导过程,启动是毫秒级的 fork + 隔离设置
Image 是什么
镜像是容器的只读模板:分层文件系统 + 运行配置(启动命令、环境变量、暴露端口)的打包物。容器 = 镜像的一个可写运行实例。
$ docker images --format "table {{.Repository}}:{{.Tag}}\t{{.Size}}"
REPOSITORY:TAG SIZE
busybox:latest 4.45MB
alpine:3.19 7.4MB面试要点:
- 镜像只读,容器可写层写在最上面(copy-on-write),删容器即丢可写层,持久化要靠 Volume
- 镜像内容寻址:每一层由其内容的 sha256 标识,内容不变则层可被任意镜像共享
- 镜像与容器的关系是「类与实例」:一个镜像可同时跑 N 个容器,互不影响
Container vs VM
| 维度 | 容器 | 虚拟机 |
|---|---|---|
| 内核 | 共享宿主机内核 | Guest OS 独立内核 |
| 启动速度 | 毫秒级(fork 进程) | 分钟级(引导整个 OS) |
| 体积 | MB 级(只含应用与依赖) | GB 级(含完整 OS) |
| 隔离强度 | 进程级(Namespace/Cgroups) | 硬件级(Hypervisor) |
| 密度 | 单机可跑成百上千个 | 受内存与 CPU 硬性约束 |
面试要点:
- 一句话总结:VM 隔离的是「机器」,容器隔离的是「进程视图」;容器更轻更快,VM 隔离更强更彻底
- 容器内不能跑与宿主机不同的内核(比如 Linux 宿主机跑不了 Windows 容器原生镜像)
- 安全敏感场景常用「VM 里跑容器」折中:VM 提供硬边界,容器提供交付效率
Docker Engine:Daemon 与 CLI
Docker Engine = 守护进程(dockerd)+ REST API + 客户端(docker CLI)。CLI 不干活,只是 API 的调用方。
# docker info 暴露了 daemon 的关键运行时信息(面试常问存储驱动与 cgroup) $ docker info 2>/dev/null | grep -E "Storage Driver|Cgroup Version|Server Version" Storage Driver: overlay2 Cgroup Version: 1 Server Version: 26.1.4
面试要点:
- dockerd 挂了正在跑的容器默认也会停(容器进程是 dockerd 管理的子进程树);生产用
systemd托管 dockerd,配live-restore: true可让容器在 daemon 重启时存活 - 访问控制:
/var/run/docker.sock等于宿主机 root 权限,把 sock 挂进容器是高危操作(面试安全题高频) - 存储驱动由后端文件系统决定:ext4/xfs 上用 overlay2(当前默认与唯一推荐)
Registry
Registry 是存放与分发镜像的服务端,镜像通过「仓库名 + Tag/Digest」定位。Docker Hub 是默认公共仓,企业内网用私有 Registry。
$ docker pull busybox:latest # 不写前缀默认 docker.io/library/busybox $ docker pull registry.cn-hangzhou.aliyuncs.com/ns/app:1.0 # 完整地址 = registry/仓库:tag
面试要点:
docker pull不写 registry 前缀时默认走 Docker Hub;国内环境配 registry-mirrors 加速- 镜像传输安全默认走 HTTPS;本地测试仓(如 localhost:5000)被视为非安全仓可直接 HTTP
- push 权限由
docker login凭证决定;企业落地常见 Harbor(带权限管理/漏洞扫描/镜像复制)
高频面试题速答
| 问题 | 一句话答案 |
|---|---|
| 容器和虚拟机的本质区别 | 容器共享宿主机内核做进程级隔离,VM 用 Hypervisor 虚拟整套硬件并带独立内核 |
| 容器的本质是什么 | 被 Namespace 隔离、被 Cgroups 限权的进程组,主进程即容器 PID 1 |
| 镜像和容器的关系 | 镜像只读模板(类),容器是镜像加可写层的运行实例(对象) |
| Docker 底层用了什么技术 | Namespace 隔离视图、Cgroups 限制资源、overlay2 联合文件系统做分层 |
| docker.sock 为什么危险 | 挂载它等于把宿主机 root 控制权交给容器,可借此逃逸 |
| 为什么容器启动快 | 没有引导 Guest OS 的过程,只是创建隔离进程,毫秒级 |
| dockerd 重启容器会挂吗 | 默认会;配置 live-restore: true 后容器可跨 daemon 重启存活 |