Docker 面试题

一、基础必考题

1. Docker 是什么?核心解决什么问题?

Docker 是基于Go 语言开发的容器化引擎,基于 Linux 内核的 Namespace(隔离)、Cgroups(资源限制)、UnionFS(镜像分层)实现。核心价值:一次构建、处处运行,解决环境不一致、依赖冲突、部署繁琐、迁移困难的问题。

2. Docker 和 虚拟机(VM)的核心区别?

维度 Docker 容器 虚拟机 VM
底层 共享宿主机内核 独立 Guest OS
启动速度 秒级 分钟级
资源占用 轻量,几乎无额外开销 重,占用大量 CPU / 内存
隔离性 进程级隔离(弱) 系统级隔离(强)
镜像大小 MB 级 GB 级

3. Docker 三大核心概念?

  • 镜像(Image):只读模板,分层存储,容器的 "模板"
  • 容器(Container):镜像的运行实例,可读写,轻量独立进程
  • 仓库(Registry):存储 / 分发镜像(Docker Hub、Harbor、Nexus)

4. 镜像和容器的区别?

  • 镜像:只读、分层、静态,用于创建容器
  • 容器:读写、动态、运行态,是镜像的实例,一个镜像可启动 N 个容器

二、核心命令题(口述 / 上机高频)

1. 写出常用 docker run 核心参数

复制代码
# 后台运行 + 端口映射 + 数据卷 + 命名 + 开机自启
docker run -d \
  --name my容器 \
  -p 宿主机端口:容器端口 \
  -v 宿主机目录:容器目录 \
  --restart=always \
  镜像名:标签
  • -d:后台运行
  • -p:端口映射(桥接模式)
  • -v:数据卷挂载(持久化)
  • --name:指定容器名
  • --restart=always:异常退出自动重启

2. 进入运行中的容器?exec vs attach 区别?

  • 推荐:docker exec -it 容器ID /bin/bash(开启新终端,退出容器不停止)
  • 不推荐:docker attach 容器ID(进入容器原有终端,退出会导致容器停止)

3. 停止 / 删除容器 / 镜像常用命令

复制代码
# 查看运行容器
docker ps
# 查看所有容器(含停止)
docker ps -a
 
# 优雅停止(发送SIGTERM,等待退出)
docker stop 容器ID
# 强制杀死(SIGKILL,立即停止)
docker kill 容器ID
 
# 删除停止的容器
docker rm 容器ID
# 强制删除运行中容器
docker rm -f 容器ID
 
# 删除镜像
docker rmi 镜像ID

4. 查看容器日志、资源占用

复制代码
# 实时查看日志
docker logs -f 容器ID
# 查看最近100行
docker logs --tail=100 容器ID
 
# 查看容器CPU/内存
docker stats 容器ID

三、Docker 镜像 & 分层原理

1. 镜像为什么分层?UnionFS 作用?

  • 镜像基于 UnionFS(联合文件系统),分层存储、只读
  • 好处
    1. 分层复用,节省存储空间
    2. 构建 / 拉取加速,仅拉取变更层
    3. 易维护、易回滚

2. 镜像瘦身 / 优化的常用方法?

  1. 合并 RUN 指令,减少镜像层数
  2. 构建后清理缓存(yum clean allrm -rf /var/cache
  3. 使用 多阶段构建(Multi-stage Build)
  4. 选用精简基础镜像(alpine 代替 centos/ubuntu
  5. 不安装无用依赖、删除临时文件

四、Dockerfile 核心考点

1. 常用 Dockerfile 指令

FROM:指定基础镜像(必须第一条)

RUN:构建镜像时执行命令(创建层)

CMD:容器启动默认命令,可被命令行覆盖

ENTRYPOINT:容器启动固定命令,不易被覆盖

COPY:复制本地文件到镜像(仅复制)

ADD:支持复制 + 自动解压压缩包 + 远程文件(慎用)

WORKDIR:设置工作目录

EXPOSE:声明暴露端口(仅声明,不发布)

ENV:设置环境变量

VOLUME:声明匿名数据卷

2. CMD 和 ENTRYPOINT 核心区别?

  • CMD :可被 docker run 后面的命令覆盖
  • ENTRYPOINT :命令不会被覆盖,run 后面的参数会作为参数传递
  • 组合用法:ENTRYPOINT 固定命令 + CMD 传默认参数

3. ADD 和 COPY 区别?

  • COPY:仅本地文件复制,安全简单,推荐
  • ADD:额外支持:自动解压 .tar.gz、拉取远程 URL(不推荐,不安全)

4. 什么是多阶段构建?

将构建环境和运行环境分离,第一阶段编译打包,第二阶段仅复制运行包,大幅减小最终镜像体积

五、容器数据持久化

1. 容器默认数据为什么会丢失?

容器是可读写层 ,删除容器后,可读写层数据一并删除,数据不持久化

2. Docker 三种持久化方式?

  1. 数据卷(Volume):Docker 管理宿主机目录,推荐(跨平台、权限友好)
  2. 绑定挂载(Bind Mount):直接挂载宿主机指定目录
  3. tmpfs 挂载:内存挂载,重启丢失(仅临时数据)

3. 数据卷核心命令

复制代码
# 创建数据卷
docker volume create 卷名
# 挂载数据卷
docker run -v 卷名:容器内目录 镜像
# 查看数据卷
docker volume ls

六、Docker 网络模式

1. Docker 4 种默认网络模式?

  1. bridge(默认):独立网卡,端口映射访问,容器间可通信
  2. host:共享宿主机网络,无隔离,性能最高
  3. none:无网络,完全隔离
  4. container:共享另一个容器的网络栈

2. bridge 模式原理?

  • Docker 创建虚拟网桥 docker0,容器分配独立 IP
  • 宿主机通过 端口映射(-p) 访问容器
  • 同一 bridge 下容器可通过容器名 / IP直接通信

3. 容器间如何通信?

  1. 同 bridge 网络:直接用容器名 / IP 通信
  2. 自定义 bridge:DNS 解析,推荐生产使用
  3. 端口映射 + 宿主机 IP:跨主机 / 外部访问

七、底层原理

1. Docker 隔离 & 限制依赖哪两个核心技术?

  • Namespace :实现资源隔离(PID、网络、挂载、主机名、IPC、用户)
  • Cgroups :实现资源限制(CPU、内存、磁盘 IO、带宽)

2. Namespace 隔离哪些资源?

  • PID:进程 ID 隔离
  • NET:网络栈、网卡、端口隔离
  • MNT:文件系统挂载点隔离
  • UTS:主机名 / 域名隔离
  • IPC:信号量、消息队列隔离
  • USER:用户 / 用户组隔离

3. Cgroups 作用?

限制容器使用的CPU 核心数、内存上限、磁盘 IO、网络带宽,防止单个容器耗尽宿主机资源。

4. Docker 为什么比虚拟机启动快?

  • 容器共享宿主机内核,无需启动完整操作系统
  • 仅启动业务进程,无 Hypervisor、GuestOS 开销

八、实战排查题(场景题)

1. 容器启动失败 / 一直重启,怎么排查?

  1. 看日志:docker logs -f 容器ID
  2. 检查端口冲突:netstat -tulpn
  3. 检查资源限制:内存溢出、CPU 打满
  4. 检查数据卷权限:挂载目录无读写权限
  5. 进入容器调试:docker run --rm -it 镜像 /bin/bash 手动启动

2. 容器时区不对(8 小时误差)怎么解决?

运行时挂载时区

复制代码
-v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro
  1. Dockerfile 配置时区:

    复制代码
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

    九、高频易混对比题

docker stop vs docker kill

    • stop:优雅退出(SIGTERM → 等待 → SIGKILL)
    • kill:强制立即杀死(SIGKILL)

容器退出码常见含义

  • 0:正常退出
  • 137:OOM 内存溢出(被内核杀死)
  • 125:Docker 命令错误
  • 126:权限不足 / 无法执行
  • 127:命令找不到

docker save vs docker export

  • save:保存镜像,保留分层 / 元数据
  • export:导出容器快照,丢失分层信息

十、面试一句话速记

Docker = Namespace 隔离 + Cgroups 资源限制 + UnionFS 分层

镜像只读分层,容器读写临时,数据卷持久化

CMD 可覆盖,ENTRYPOINT 不覆盖

bridge 默认网络,host 共享网络

排查三板斧:logs → stats → exec 进容器

相关推荐
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn861 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智1 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_1 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉1 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦1 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
2601_961875241 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant