Docker 不是虚拟机,
它是给应用打包的「集装箱」
没学过运维也没关系。这一页把 50 道选择题里出现的所有名词,按"它到底解决什么问题"重新排成 10 个模块。每个模块先用大白话 + 类比讲清概念,再把对应考题挂上来——点一下就能看答案和为什么。建议从上往下读一遍,再回头点题自测。
先建立心智模型:Docker 到底是什么
一句话:Docker 让你把"应用 + 它需要的一切环境"打包成一个标准化的盒子,在任何机器上都能原样跑起来。理解它最快的方式是和虚拟机对比。
Docker vs 虚拟机:核心差异在"内核"
- 虚拟机:每台 VM 有自己独立的操作系统内核,靠 Hypervisor 虚拟出硬件 → 重、慢、隔离强。
- 容器:所有容器共享宿主机的同一个 Linux 内核,只是把进程、文件系统、网络隔离开 → 轻、秒级启动、性能损耗极小。
- 正因为共享内核,"完全隔离的内核"恰恰不是容器的优势——这是考点(见第 1 题)。
三大件的关系:镜像 → 容器 → 仓库
整个 Docker 世界就围绕三个东西转,先记住这张流程图,后面所有模块都是在补充它的细节:
docker push 把镜像上传,用 docker pull 把别人的镜像下载下来。镜像 ⇄ 仓库,容器从不直接进仓库。对应考题本模块覆盖第 1、13 题
- A. 启动速度更快
- B. 资源占用更少
- C. 完全隔离的内核
- D. 性能损耗更小
- A. 镜像是可读写的
- B. 镜像是容器的运行实例
- C. 镜像是只读模板
- D. 镜像只能从 Docker Hub 获取
镜像 Image:怎么造、怎么管
镜像是 Docker 里最核心、考点最多的一块。要搞懂三件事:它由 Dockerfile 构建、采用分层存储、并有一整套构建/搬运/清理命令。
Dockerfile造镜像的"配方"
Dockerfile 是一行行的指令,从底座开始一层层往上叠。常考指令:
FROM指定基础镜像(底座,如alpine、java:11)。RUN在构建时执行命令(装软件等),每条 RUN 都会生成一个新层,所以要合并多条命令、清缓存来减小体积。COPY/ADD把文件放进镜像(区别见下表)。CMD/ENTRYPOINT指定容器启动时跑什么(区别见下表)。填空题:指定镜像入口点的指令是ENTRYPOINT。
| 对比 | COPY | ADD |
|---|---|---|
| 基本复制 | 复制本地文件/目录 | 复制本地文件/目录 |
| 自动解压 tar | 不支持 | 支持(本地压缩包会自动解压) |
| 远程 URL 下载 | 不支持 | 支持 |
| 建议 | 能用 COPY 就用 COPY(行为更明确) | 仅在需要解压/下载时用 |
| 对比 | CMD | ENTRYPOINT |
|---|---|---|
| 角色 | 默认命令/默认参数 | 固定入口(主程序) |
| 能否被 run 覆盖 | 能被 docker run 后的参数覆盖 | 不易被覆盖(需 --entrypoint) |
| 两者同时存在 | CMD 作为 ENTRYPOINT 的默认参数(最终命令 = ENTRYPOINT + CMD) | |
分层 / 多阶段镜像为什么是一层层的
- 分层好处:省存储(共享底层)、加速构建(命中缓存的层不重建)、便于共享分发。注意:"提高安全性"不是分层带来的好处(第 5 题考点)。
- 多阶段构建(multi-stage):先在"编译阶段"用大镜像编译,再把成品拷进一个干净小镜像——目的就是减小最终镜像体积(第 8 题)。
- digest(摘要):对镜像内容算出的 SHA256,内容一变就变,用来精确锁定不可变的镜像(第 50 题);而
tag只是版本标签、可移动。
命令镜像的造、搬、存、删
docker build -t myapp:1.0 . # 按 Dockerfile 构建镜像
docker tag myapp:1.0 myapp:latest # 打标签(区分版本)
# 拉取(不带 tag 默认拉 :latest)
docker pull nginx # = nginx:latest
# 把"运行中的容器"固化成新镜像
docker commit 容器ID newimage:1.0
# 导出:镜像 vs 容器快照(关键区别!)
docker save myapp:1.0 -o app.tar # save = 存"镜像"(含分层)
docker export 容器ID -o snap.tar # export = 存"容器快照"(扁平)
# 删除镜像
docker rmi myapp:1.0 # remove image
.dockerignore:列出构建时不打包进上下文的文件(如 node_modules、.git),只在 build 时生效,加快构建、减小体积。- 镜像最佳实践:用官方基础镜像、合并 RUN 清缓存、用非 root 运行、用 .dockerignore;"以 root 运行应用"是反面教材(第 27 题)。
对应考题第 3、4、5、8、12、14、18、27、30、33、40、42、43、50 题
- A. COPY 支持自动解压,ADD 不支持
- B. ADD 支持自动解压和 URL 下载,COPY 不支持
- C. 两者功能完全相同
- D. COPY 只能本地,ADD 可复制远程
- A. CMD 不会被 run 参数覆盖
- B. ENTRYPOINT 必须和 CMD 一起用
- C. 两者同时定义时,CMD 作为 ENTRYPOINT 的默认参数
- D. ENTRYPOINT 可被 run 参数覆盖
- A. 减少存储空间
- B. 加速镜像构建
- C. 提高容器安全性
- D. 便于镜像共享
- A. 提高构建速度
- B. 减小最终镜像大小
- C. 增加构建安全性
- D. 支持多平台构建
docker commit 的作用是?- A. 提交容器更改到代码仓库
- B. 将容器保存为新镜像
- C. 提交 Dockerfile 更改
- D. 提交容器配置到注册表
docker save 和 docker export 的区别?- A. save 保存镜像,export 保存容器快照
- B. save 保存容器,export 保存镜像
- C. 两者相同
- D. save 只保存修改层
.dockerignore 正确的是?- A. 只能忽略文件不能忽略目录
- B. 只在构建镜像时生效
- C. 可覆盖 Dockerfile 的 COPY
- D. 必须与 Dockerfile 同目录
- A. 尽量用官方基础镜像
- B. 同一 RUN 内清理缓存
- C. 以 root 用户运行应用
- D. 用 .dockerignore 排除无关文件
USER),降低被攻破后的危害。- A. docker rm
- B. docker rmi
- C. docker remove
- D. docker delete
rmi = remove image。A 是删容器;C/D 无此命令。- A. docker build
- B. docker commit
- C. docker push
- D. docker save
commit 从容器创建镜像;build 从 Dockerfile,push 是上传,save 是导出。- A. 唯一标识镜像
- B. 区分镜像版本
- C. 指定镜像大小
- D. 设置镜像权限
nginx:1.21、nginx:alpine);唯一标识内容的是 digest,不是 tag。docker pull 的默认行为?- A. 拉取 latest 标签
- B. 拉取所有标签
- C. 只拉已缓存的层
- D. 拉取后自动运行
:latest;拉所有标签要 -a;pull 只下载不运行。- A. docker create
- B. docker build
- C. docker make
- D. docker compile
build 按 Dockerfile 构建;create 是创建容器(不启动);C/D 不存在。- A. 镜像的版本号
- B. 内容可寻址标识
- C. 下载次数
- D. 构建时间
image@sha256:...)。容器运行:docker run 全家桶 + 进容器
镜像跑起来就是容器。这块的核心是把 docker run 的常用参数记牢,以及"怎么进到一个正在跑的容器里看一看"。
docker run启动容器的常用参数
--name web # 给容器起名
-p 8080:80 # 端口映射 宿主机:容器
-v /data/html:/usr/share/nginx/html # 挂载目录
-e ENV=prod # 设置环境变量
--restart=always # 随 Docker 自动启动
--rm # 退出后自动删除容器(临时调试用)
nginx
记忆口诀:d 后台、name 起名、p 端口、v 挂载、e 变量、restart 自启、rm 用完即焚。这正是实操题 1(启动 web-server)要用到的组合。
进容器attach 与 exec 的区别
attach 像把屏幕接到容器"正在跑的那个主程序"上,看到的是它的输出,退出时一不小心会把主程序(容器)也停掉;exec 像在容器里另开一个新窗口/新终端,你进去敲命令,退出也不影响主程序。所以"进容器看看"几乎都用 exec。填空题:docker exec -it <容器ID> bash 的作用 = 在运行中的容器内打开一个交互式终端(开新进程执行命令)。其中 -i 保持输入、-t 分配伪终端。
状态容器有哪些状态
官方状态:created(已创建未启动)、running、paused(暂停)、restarting、exited(已退出,口语叫 stopped)、dead。没有 "suspended" 这个状态(第 10 题考点)。
对应考题第 2、10、19、34、38 题
- A. docker attach
- B. docker exec
- C. docker run
- D. docker login
exec -it ... bash 在运行中容器里开新 shell,是标准做法。attach 虽也能连但接的是主进程、退出可能停容器;run 是启动新容器;login 是登录仓库。- A. running
- B. paused
- C. stopped
- D. suspended
suspended 不是 Docker 术语。官方状态含 created/running/paused/restarting/exited/dead;"stopped" 是对 exited 的口语说法。docker run --rm 的作用?- A. 删除镜像
- B. 容器退出后自动删除
- C. 删除所有同名容器
- D. 强制删除运行中容器
- A. 只能在 Dockerfile 定义
- B. 只能在 run 时定义
- C. 可通过 -e 参数设置
- D. 重启后会丢失
-e KEY=value(也可 --env-file);Dockerfile 用 ENV。重启同一容器变量仍在。- A. --restart=always
- B. --auto-start
- C. --respawn
- D. --daemon
--restart=always(还有 unless-stopped、on-failure);B/C/D 都不是有效参数。数据持久化:容器删了数据还在吗
容器是"用完即焚"的,容器内写的数据随容器删除而消失。要让数据活下去,就得把它放到容器之外——这就是卷(Volume)和绑定挂载(Bind Mount)。
两种挂载Volume vs Bind Mount
| 对比 | Volume(卷) | Bind Mount(绑定挂载) |
|---|---|---|
| 写法 | -v 卷名:/容器路径 | -v /宿主机路径:/容器路径 |
| 由谁管理 | Docker 管理(在 Docker 目录下) | 你指定宿主机的具体目录 |
| 典型用途 | 数据库数据等,跨容器共享、可移植 | 开发时挂源码、配置文件 |
| 命令 | docker volume create/ls/rm | 无需创建,直接给路径 |
第 9 题就是考这个:-v /host:/container(冒号左边是宿主机的路径)属于 Bind Mount。
生命周期卷不随容器删除而消失
- 删除容器时,命名卷默认不会被删,会一直保留,需要手动
docker volume rm清理(否则残留)。 - 这正是第 21 题的考点:"删容器时卷也会被删"是错误说法。
对应考题第 9、21 题
-v /host:/container 属于哪种挂载?- A. Volume
- B. Bind Mount
- C. tmpfs
- D. Network Mount
- A. 可在容器间共享数据
- B. 删除容器时卷也会被删除
- C. 可通过 docker volume 命令管理
- D. 支持第三方存储驱动
docker volume rm。其余三项都对。网络:容器怎么通信、怎么被访问
两个问题:① 外面怎么访问到容器(端口映射);② 容器之间、容器和宿主机用什么"网络模式"连接(网络驱动)。
端口映射-p 宿主机端口:容器端口
容器内部的端口默认外面访问不到,需要用 -p 把它映射到宿主机端口。格式恒为 host:container。
网络驱动bridge / host / overlay / macvlan / none
| 驱动 | 说明 |
|---|---|
| bridge | 默认,容器接到虚拟网桥,有自己的网段,靠端口映射对外 |
| host | 容器直接共享宿主机网络栈,无隔离、性能最好,不需端口映射 |
| overlay | 跨多台主机的容器组网(Swarm/集群常用) |
| macvlan | 给容器分配独立 MAC,像物理机一样接入局域网 |
| none | 不配网络 |
注意:vxlan 是底层封装技术,不是 Docker 的网络驱动(第 7 题坑)。
对应考题第 7、17、28、35、49 题
- A. bridge
- B. overlay
- C. macvlan
- D. vxlan
- A. bridge
- B. host
- C. overlay
- D. none
-p 8080:80 的含义?- A. 容器 80 映射到宿主机 8080
- B. 宿主机 80 映射到容器 8080
- C. 暴露 8080 和 80
- D. 两端口间负载均衡
- A. Sandbox
- B. Endpoint
- C. Network
- D. Bridge
--network host 的特点?- A. 容器与宿主机共享网络栈
- B. 容器有独立网络栈
- C. 无法访问外部网络
- D. 只能与宿主机通信
观测与排错:容器到底在干嘛
出问题时靠这几条命令"看现场":看日志、看资源、看进程、看详细配置、看健康。记住每条命令"看什么"就够了。
命令地图看不同维度
| 命令 | 看什么 |
|---|---|
| docker logs | 容器的日志输出 |
| docker stats | 实时资源占用(CPU/内存/网络/IO) |
| docker top | 容器内运行的进程列表 |
| docker inspect | 容器/镜像的详细配置(返回 JSON) |
| docker ps | 容器列表与状态(概览) |
| docker system df | 磁盘占用(镜像/容器/卷) |
- 日志最佳实践:应用把日志输出到 stdout/stderr,由 Docker 日志驱动统一收集(第 48 题);默认日志驱动是
json-file(第 15 题)。 - 健康检查 HEALTHCHECK:定期探测容器是否健康,失败时状态变
unhealthy(本身不重启容器);可用docker inspect查看健康状态(第 31 题)。
对应考题第 6、15、22、25、29、31、45、48 题
- A. docker logs
- B. docker events
- C. docker inspect
- D. docker history
- A. syslog
- B. journald
- C. json-file
- D. none
json-file,日志以 JSON 写到宿主机文件,可被 docker logs 读取。- A. docker disk usage
- B. docker system df
- C. docker info
- D. docker stats
system df 汇总镜像/容器/卷/缓存的磁盘占用;stats 看的是实时资源不是磁盘。docker inspect 返回什么格式?- A. YAML
- B. JSON
- C. XML
- D. 纯文本
--format 提取字段。- A. docker top
- B. docker stats
- C. docker ps
- D. docker info
stats 实时显示 CPU/内存/网络/IO;top 看进程,ps 看列表,info 看引擎信息。- A. 必须在 Dockerfile 定义
- B. 只能运行时动态加
- C. 失败后容器自动重启
- D. 可通过 docker inspect 查看健康状态
- A. docker ps
- B. docker top
- C. docker inspect
- D. docker exec ps aux
docker top 直接列容器内进程(D 的 exec 也能实现,但标准命令是 top)。- A. 写入容器内文件
- B. 输出到标准输出
- C. 禁用所有日志
- D. 定期手动清理
仓库 Registry:镜像存哪、从哪取
镜像造好后要分发、要复用,就需要一个集中存放的地方——这就是镜像仓库。公共的叫 Docker Hub,公司里常自建私有仓库。
概念Docker Hub 与私有仓库
- Docker Hub = 官方公共镜像仓库,
docker pull nginx默认就是从这里拉。 - 私有 Registry 默认监听 5000 端口(自建仓库镜像
registry)。 - 推送流程:
docker tag加上"仓库地址前缀" →docker login→docker push(对应你做过的实操题)。
对应考题第 11、26 题
- A. 配置管理工具
- B. 镜像仓库
- C. 网络管理工具
- D. 日志收集工具
- A. 2375
- B. 2376
- C. 5000
- D. 8080
安全与资源限制
容器共享内核 → 隔离没 VM 强 → 所以要主动收紧权限、限制资源,别让一个容器拖垮整台机器。
安全能力(Capabilities)与非 root
- 容器隔离弱于虚拟机(共享内核);默认 Docker 会丢弃一批高危能力,所以容器 root ≠ 宿主机完整 root。
- 可用
--cap-add/--cap-drop精确增减 Linux Capabilities,按需收紧权限(第 24 题)。 - 应用尽量用非 root 用户运行(呼应第 27 题)。
资源限制 CPU 和内存
CPU 和内存可以同时限,且运行后可用 docker update 修改(第 41 题)。
对应考题第 24、41 题
- A. 隔离级别与虚拟机相同
- B. 默认容器 root 与宿主机 root 权限相同
- C. 可通过 Linux Capabilities 限制权限
- D. 容器无法访问宿主机资源
- A. 只能限 CPU
- B. 只能限内存
- C. 可同时限 CPU 和内存
- D. 运行后无法修改
--cpus、--memory 可同时设;运行后可用 docker update 改。编排与生态:单机之外的世界
一个容器好管,几十上百个就需要"编排工具"。先认清三个层级的工具,以及容器底层是谁在真正跑容器。
分层Compose / Swarm / 容器运行时
- Docker Compose:用一个 yml 文件定义并运行多容器应用(单机多服务,如 web+db),一条命令全拉起(第 23 题)。
- Docker Swarm:Docker 自带的集群编排(多主机),特性有内置服务发现、滚动更新、overlay 跨主机网络等。注意:"自动容器重启"是单机 Docker 本身的功能(--restart),不算 Swarm 特有(第 47 题)。
- 容器运行时(runtime):真正在底层创建并运行容器的组件——
containerd、runc、cri-o。kube-proxy是 Kubernetes 的网络组件,不是容器运行时(第 20 题)。
对应考题第 20、23、47 题
- A. containerd
- B. runc
- C. cri-o
- D. kube-proxy
- A. 管理多个 Docker 主机
- B. 定义和运行多容器应用
- C. 编排 K8s 集群
- D. 监控容器性能
- A. 内置服务发现
- B. 滚动更新
- C. 自动容器重启
- D. 跨主机网络
--restart 功能,不是 Swarm 独有。底层原理与运维杂项(查漏补缺)
剩下这些是零散但常考的点:存储驱动、命名空间隔离、清理命令、重启行为。归到一起扫一遍即可。
底层命名空间与存储驱动
- PID 命名空间:让容器有独立的进程编号空间——容器内 PID 与宿主机不同、看不到宿主机进程、容器内第一个进程是 PID 1(第 44 题)。容器默认不限制进程数(pid limit),可用
--pids-limit设上限(第 46 题)。 - 存储驱动:
overlay2是当前推荐;aufs 不是内核原生支持(第 37 题坑);devicemapper 多用于老 CentOS/RHEL。 docker version/info/system info都能显示 Docker 信息,详略不同(第 39 题选"以上都可以")。
运维重启与清理
docker container prune # 删所有"已停止"容器
docker system prune # 删停止容器+无用网络+悬空镜像+缓存
system prune 不会删除"正在运行"的容器(第 32 题)。
对应考题第 16、32、36、37、39、44、46 题
- A. docker rm -f $(docker ps -aq)
- B. docker container prune
- C. docker system prune
- D. 以上都是
docker system prune 不会删除什么?- A. 停止的容器
- B. 未使用的网络
- C. 正在运行的容器
- D. 悬空镜像
docker restart 与 stop/start 的区别?- A. restart 相当于先 stop 再 start,组合效果相同
- B. restart 不能用于运行中容器
- C. restart 会删除容器
- D. 两者完全不同
- A. overlay2 是推荐驱动
- B. aufs 是 Linux 内核原生支持
- C. devicemapper 用于 CentOS/RHEL
- D. 不同存储驱动可混用
- A. docker version
- B. docker info
- C. docker system info
- D. 以上都可以
- A. 容器内进程 ID 与宿主机不同
- B. 容器内看不到宿主机进程
- C. 容器内 PID 1 是 init 进程
- D. 以上都是
- A. 无限制
- B. 256
- C. 1024
- D. 32768
--pids-limit 设上限(防 fork 炸弹)。50 题答案速查 + 模块定位
自测用:盖住答案先做,再对照。格式 = 题号 · 正确项。颜色块按所属模块,方便回去精读薄弱处。