资讯动态

Docker高频面试题与常用指令实战速查

发布时间:2026/10/14 17:27:54 来源:尧图企业网站定制
最近面了不少候选人Docker几乎是必问的技术点。从“镜像和容器有什么区别”到“容器退出后怎么排查”考察范围覆盖基础概念、常用指令和线上实战很多人基础不扎实一个追问就露馅。这篇文章把高频十大面试题、基础知识和常用指令整合到一起既适合准备面试的人突击复习也适合刚接触容器技术的朋友系统性梳理一遍。1. 内容整体设计与思路拆解1.1 为什么面试总爱考DockerDocker现在基本上是后端开发的基础设施技能从部署到持续集成从微服务到数据分析平台几乎每个场景都有容器技术参与。面试官问Docker并不是想考记忆而是通过一系列问题判断候选人有没有真正用容器处理过问题。比如问“容器缺少资源限制会怎样”背后考察的是对CGroups机制的理解深度。所以准备面试时单纯背命令意义不大需要把原理、实战、命令串成一条线。我观察到一个规律能把“做什么”和“为什么这么设计”说清楚的人通常实际用容器写过东西只能背出孤立概念的人大部分时候纸上谈兵。这份整理的目的就是把两者的距离拉近一点。1.2 如何组织这份知识体系这份内容分为三层。第一层是基础概念搞清楚镜像、容器、仓库三者关系以及Docker和虚拟机在隔离方式上的本质差异第二层是高频面试题覆盖网络、存储、镜像构建、多容器编排、资源限制等最常考的方向第三层是常用指令与排查技巧。三层之间有明显的递进关系——基础概念决定能不能答对题实操技巧决定能不能答出亮点指令速查帮助面试前做最后突击。如果你完全没接触过Docker建议先顺着章节往下读每个命令都实际敲一遍如果你已经写过一些容器可以重点看第2章和第4章把容易答偏的地方补扎实。2. 高频十大面试题深度拆解先放一张总览表把十道高频题列出来再逐题展开。编号面试题考察点1容器与虚拟机有什么区别隔离级别、资源利用2镜像与容器有什么关系分层存储、运行实例3如何优化Docker镜像构建多阶段构建、缓存4数据卷和挂载怎么选持久化、共享数据5网络模式怎么选桥接、宿主机、容器互联6CMD和ENTRYPOINT有什么区别启动入口设计7COPY和ADD有什么区别镜像构建指令细节8如何限制容器CPU和内存CGroups、配额控制9docker-compose如何编排多容器声明式编排、依赖关系10容器日志如何管理、为什么要无状态日志采集、可替换性2.1 隔离边界容器与虚拟机的本质区别题1这道题几乎必问。本质区别在于虚拟化的层级不同。虚拟机通过Hypervisor虚拟化硬件层每个虚拟机需要完整的操作系统内核所以镜像大、启动慢容器虚拟化的是操作系统层所有容器共享宿主机内核通过命名空间实现隔离、CGroups实现资源控制所以镜像小、启动快。这里有个容易被忽略的加分点容器启动快不只因为镜像小更因为不需要引导操作系统。一个容器启动本质上就是拉起一个进程而虚拟机要从引导内核开始。如果你能主动提到这个差异面试官会认为你是真的理解而不是背模板。还有一个追问是“容器是不是更安全”。答案是否定的。容器共享宿主机内核一旦内核出现漏洞影响范围更大虚拟机的隔离边界更硬。所以安全的结论不能一概而论。2.2 生命周期镜像与容器的关系题2核心就一句话镜像是静态定义容器是运行实例。如果会类比把镜像比作类容器比作对象比较形象。容器基于镜像创建镜像层是只读的容器启动后会多出一个可写层后续所有写入都发生在这个可写层里。面试官很喜欢追问“同一个镜像启动两个容器它们的数据会互相影响吗”。答案是不会——因为每个容器各自持有独立可写层底层共享的只读层没有任何写入操作。这也是容器能成为“轻量”方案的重要原因物理磁盘上同一份镜像数据只需要存一份多个容器共享它。再往深一点docker commit可以把一个运行中容器的可写层保存成新镜像。这种操作适合临时调试不适合作为标准流程因为人工产生的容器状态不可控。2.3 构建优化如何把镜像做得又小又安全题3面试官常问“怎么把镜像做得小”很多人只答“用alpine基础镜像”这不算错但构不成亮点。真正能拿分的是多阶段构建先用一个包含编译工具链的基础镜像完成编译再把编译产物复制到干净的运行镜像里。这样最终镜像只包含运行所需文件不携带编译器、依赖源码等无关内容。还有一点经常被忽略Dockerfile的指令顺序会直接影响构建缓存命中率。把依赖安装放在业务代码复制之前是很实用的技巧。因为只要依赖清单文件没变化无论业务代码改了多少次依赖层都可以直接命中缓存节省大量构建时间。安全方面也要提一下。不要在镜像里保留私钥等敏感信息多阶段构建天然有帮助——只要密钥只在构建阶段使用就不会出现在最终镜像里。这句话在面试中说出口能把整道题的回答层次拉高一层。2.4 数据持久化Volume与Bind Mount的正确理解题4数据卷和绑定挂载的区别要能讲清楚。数据卷由Docker管理存放位置在宿主机上的Docker目录里适合容器间共享数据绑定挂载直接映射宿主机某个文件路径适合开发期热更新代码和调试。面试有个常见误区容器删除后数据卷还在但匿名卷会随着容器删除而消失。这个细节能够区分是否有实际操作经验。匿名卷是启动容器时没有显式命名的卷一旦容器被删除Docker找不到引用关系它就和容器一起被清理。如果你在docker run时用了-v 容器内路径但没有指定宿主机路径Docker会默认创建匿名卷。很多人以为这是持久化其实它只在容器生命周期内有效。真正需要长期保存的数据要么用命名卷要么用绑定挂载。2.5 网络选型四种网络模式到底怎么选题5bridge、host、none、container四种模式要对比清楚。默认bridge模式为每个容器分配独立IP容器间可以通过容器名互通host模式直接共享宿主机网络栈性能损耗低但牺牲了网络隔离端口也不能重复映射none模式适合完全不需要网络的场景container模式让容器共享另一个容器的网络命名空间。如果回答只是列举概念面试官一般会继续追问“桥接模式下端口映射的本质是什么”。这个问题值得提前准备端口映射实际上是基于iptables规则的转发宿主机收到端口流量后根据规则把流量转到容器IP对应的端口。理解了这一层你才能解释为什么修改iptables有时会影响容器通信。实际选择上开发环境用bridge足够追求极致性能的中间件容器可以考虑host但生产环境里多主机互通还得靠overlay网络。把这句话写进回答面试官基本不会再往下为难。2.6 指令辨析CMD和ENTRYPOINT、COPY和ADD题6、题7这组题目考的是Dockerfile细节。CMD作为默认启动命令docker run时如果附加了参数CMD会被完整覆盖ENTRYPOINT固定入口docker run附加的参数会追加到ENTRYPOINT后面。最佳实践是ENTRYPOINT用来设定不可变的主程序CMD提供默认参数。比如ENTRYPOINT指定nginxCMD里写-g daemon off;你想覆盖配置时直接传参数就行。还有一个细节容易被忽略exec形式和shell形式的区别。exec形式不经过/bin/sh进程接到的信号会被容器进程直接接收推荐使用shell形式用得少了因为它会启动一层shell进程信号传递链路变长优雅停机可能失效。这道题你说出信号接收这一点属于非常扎实的回答。COPY和ADD的区别相对简单。COPY做纯文件复制语义清晰ADD额外支持tar文件自动解压和URL下载但URL下载在镜像构建中不推荐——构建时间不可控下载内容也不可验证。大多数场景用COPY就够只有遇到本地tar包需要解压进镜像时才考虑ADD。2.7 资源与编排容器资源限制和多容器编排题8、题9资源限制这道题命令本身不复杂docker run -m限制内存--cpus限制CPU核数docker-compose里对应mem_limit和cpus。但面试题往往考底层容器通过CGroups实现对内存和CPU的限额控制。回答时把两个概念分清会很有加分效果。CPU份额表示多个容器在CPU争抢时的相对权重不是绝对值CPU配额则是绝对上限规定容器最多只能占用一定比例的CPU时间。很多人把两者混为一谈你要是能说清楚一道基础题就是一道亮眼题。docker-compose这块核心价值是“用声明式YAML描述多个容器之间的关系一条命令拉起整个应用栈”。需要掌握services、networks、volumes三个顶级字段以及depends_on对启动顺序的控制。但depends_on只是控制容器启动顺序不保证依赖的服务接口已经就绪。如果下游服务需要等数据库真正可连接再启动要配合健康检查或者用wait-for脚本做就绪探测。2.8 日志与架构容器该怎样管日志、怎么设计无状态题10这道题现在越来越常考。一个核心原则应用日志建议输出到标准输出不是写到容器内的文件。原因很直接——容器随时可能被删除日志写在容器内部也随时会丢输出到标准输出之后日志采集组件可以直接从容器运行时读出来统一收集。还有一个经典问题为什么一个容器里最好只跑一个进程。因为Docker本身不能良好管理多个进程的守护进程关系容器内进程一多日志归集、进程退出码、信号管理都会变复杂。这条原则落到设计层面就是无状态化容器自身不保存任何必须保留的数据所有状态放外部存储数据卷、数据库、对象存储。容器随时可以销毁重建并且重建后功能完全一致。面试官用这道题判断你是否真正理解“容器就是进程”这一本质。如果你只背出“无状态”这个说法说不出具体做法大概率会被反问“怎么做到无状态”。3. 常用指令实战速查3.1 镜像管理指令镜像名称由仓库名和标签组成默认标签是latest。docker pull ubuntu:22.04从远端仓库拉取指定版本docker images列出本地镜像如果看到仓库名和标签都显示为none说明是中间层镜像或者已经被重新打标签覆盖。docker rmi删除镜像如果提示镜像被容器引用需要先删除对应容器再删镜像。docker tag本质上是给镜像增加一个引用名不是复制一份数据。这个特性在迁移镜像时非常好用pull下来之后用tag改写仓库和标签再push到目标仓库不用重新构建。docker build -t用于从Dockerfile构建镜像-t可以连续指定多个标签比如docker build -t app:1.0 -t app:latest .。3.2 容器生命周期指令docker run是一条复合指令基本等价于create加start。常用参数要熟练--name指定容器名、-d后台运行、-p映射端口、-e设置环境变量、-v挂载数据、--network指定网络、--restart设置重启策略。docker ps只显示运行中容器加-a可以看所有容器包括已退出状态。docker stop发送SIGTERM信号请求优雅停止超时后才会发SIGKILL强杀docker kill直接发SIGKILL强杀适合处理卡死的容器。docker rm删除已停止容器docker rm -f可以直接删除运行中容器。开发调试时养成加--rm的习惯很省心docker run --rm -it alpine sh退出容器后自动清理文件系统不留下垃圾容器。进入容器用docker exec -it 容器名 /bin/sh它是在容器内新起一个进程并分配交互终端docker attach是把当前终端接到容器主进程上一旦主进程退出终端也同步断开。如果只是为了排查问题优先用execattach容易弄僵终端。3.3 数据卷与网络操作数据卷命令不多但容易乱。docker volume create创建卷docker volume ls列出所有卷docker volume inspect查看卷详情和挂载点。docker run -v有两种写法一种用卷名-v mydata:/app/data另一种直接映射宿主机路径-v /home/user/project:/app。前者适合生产环境数据由Docker管理后者适合开发时直接改代码即时生效。网络操作围绕docker network create、docker network connect、docker network disconnect展开。创建一个自定义桥接网络后同一网络里的容器可以用容器名互相访问不需要依赖IP地址。排查容器间通信问题时第一件事是docker network inspect看容器是否在同一网络、IP分配是否合理而不是盲目重启容器。很多时候问题就出在容器连了不同网络。3.4 Dockerfile 核心指令对照指令作用面试关注点FROM指定基础镜像选择原则锁版本不用latestWORKDIR设定工作目录后续相对路径都基于它COPY复制文件进镜像语义简单推荐使用ADD复制并支持解压URL下载不推荐RUN执行构建期命令注意会新增镜像层ENV设置环境变量镜像内全局生效EXPOSE声明容器监听端口文档性质真正映射靠-pCMD默认启动命令docker run可覆盖ENTRYPOINT固定启动入口参数追加不可直接覆盖USER指定运行用户生产环境避免rootHEALTHCHECK定义健康检查编排调度依赖它RUN每执行一条就会增加一个镜像层所以连接符把多条命令写在同一个RUN里能减少层数。FROM、WORKDIR、ENV这类指令不会直接产生大体积数据层但会改变元数据。这个表里最容易被忽略的是HEALTHCHECK——容器化部署平台判断服务是否可用靠的就是健康检查探针很多生产事故都源于探针缺失或配置不合理。4. 常见问题与排查技巧实录4.1 镜像下载慢的克制方法镜像下载慢的时候第一件事不是暴力重试而是先确认是仓库服务波动还是网络链路问题。如果整体拉取都很慢可以检查本机是否配置了镜像加速器也就是容器运行时级别的Registry Mirror配置。配置镜像加速之后拉取流量会走距离更近的镜像站点速度通常有质的提升。构建过程中也有一个省时点充分利用层缓存。把变化频率低的依赖安装命令写在Dockerfile前面代码复制命令放在后面这样代码每次变更只会重跑后续层。另外一个技巧是docker build时使用--cache-from在CI流水线里可以把上一次构建产生的镜像作为缓存来源跨机器复用构建结果实测能省掉一大半重复构建时间。4.2 容器频繁退出怎么办容器一启动就退出不要慌按四步排查。第一步docker ps -a看退出状态码第二步docker logs看业务日志日志可能直接给出报错原因第三步docker inspect看健康状态和OOMKilled标志第四步结合资源限制判断是否内存不足。退出码是有信息量的137代表128加9也就是进程被SIGKILL信号杀掉在容器场景里通常是OOM143代表128加15对应SIGTERM信号通常是被stop主动终止。如果退出码是0说明主进程正常结束但这也不一定是好事——主进程可能执行完初始化就退出了命令被误当成常驻服务。OOM导致的退出盲目重启是没用的要么调大内存限制要么优化业务内存占用先找到内存暴涨点。4.3 磁盘空间告警的清理命令容器和镜像占用大量磁盘日志文件也可能撑满分区。可先用docker system df查看磁盘资源分布它会列出镜像、容器、数据卷和构建缓存各自的占用。docker system prune进入交互式清理模式能清理停止的容器、悬空镜像、未使用的网络和构建缓存加上-a会把所有未被运行容器引用的镜像一并清掉生产环境执行前务必确认。日志清理更值得提前预防。容器日志默认存在宿主机上路径在Docker数据目录的containers子目录下。最推荐做法不是等占满再清理而是提前给json-file日志驱动配置max-size和max-file限制单个日志文件大小和保留份数。这样日志轮转自动完成不会出现单容器日志涨到几十GB的情况。4.4 面试时的加分话术与避坑要点回答面试题时怕的不是不会而是瞎编。遇到没处理过的场景明确说“这个场景我没直接处理过但我的排查思路是”然后按日志、状态、配置的顺序推演一遍。面试官看重的不是答案完美而是思路是否闭环。讲镜像优化时提到多阶段构建最好把具体收益说清楚从源镜像接近几百MB压到运行镜像几十MB构建产物里不包含编译器。这样面试官无论怎么追问你都有实际路径可讲。讲资源限制时避免只答“加内存”可以说清对比内存压力和OOMKilled标志后再给方案。这些细节比背一百条命令管用得多。我个人带新人时最大的感受是Docker不难难的是把命令和原理真正对应起来。命令敲得再熟不理解命名空间的隔离边界遇到问题照样无从下手原理背得再牢不亲手跑一遍docker run --rm -it alpine sh也很难建立手感。这份整理是我把面试、工作、带人过程中的高频知识点做了收敛建议你一边读一边在虚拟机里动手验证。面试前花两三天把第2章的题目自己讲一遍效果比盲目刷题强很多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑