Docker / 命令文档

Docker 基础核心(面试向)

$ docker 8 个章节 Linux 命令详解

概述

本篇是「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 重启存活

同分类 · 其他命令文档