一、基础必考题
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 核心参数
bash
# 后台运行 + 端口映射 + 数据卷 + 命名 + 开机自启
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. 停止 / 删除容器 / 镜像常用命令
bash
# 查看运行容器
docker ps
# 查看所有容器(含停止)
docker ps -a
# 优雅停止(发送SIGTERM,等待退出)
docker stop 容器ID
# 强制杀死(SIGKILL,立即停止)
docker kill 容器ID
# 删除停止的容器
docker rm 容器ID
# 强制删除运行中容器
docker rm -f 容器ID
# 删除镜像
docker rmi 镜像ID
4. 查看容器日志、资源占用
bash
# 实时查看日志
docker logs -f 容器ID
# 查看最近100行
docker logs --tail=100 容器ID
# 查看容器CPU/内存
docker stats 容器ID
三、Docker 镜像 & 分层原理
1. 镜像为什么分层?UnionFS 作用?
- 镜像基于 UnionFS(联合文件系统),分层存储、只读
- 好处 :
- 分层复用,节省存储空间
- 构建 / 拉取加速,仅拉取变更层
- 易维护、易回滚
2. 镜像瘦身 / 优化的常用方法?
- 合并
RUN指令,减少镜像层数 - 构建后清理缓存(
yum clean all、rm -rf /var/cache) - 使用 多阶段构建(Multi-stage Build)
- 选用精简基础镜像(
alpine代替centos/ubuntu) - 不安装无用依赖、删除临时文件
四、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 三种持久化方式?
- 数据卷(Volume):Docker 管理宿主机目录,推荐(跨平台、权限友好)
- 绑定挂载(Bind Mount):直接挂载宿主机指定目录
- tmpfs 挂载:内存挂载,重启丢失(仅临时数据)
3. 数据卷核心命令
bash
运行
# 创建数据卷
docker volume create 卷名
# 挂载数据卷
docker run -v 卷名:容器内目录 镜像
# 查看数据卷
docker volume ls
六、Docker 网络模式
1. Docker 4 种默认网络模式?
- bridge(默认):独立网卡,端口映射访问,容器间可通信
- host:共享宿主机网络,无隔离,性能最高
- none:无网络,完全隔离
- container:共享另一个容器的网络栈
2. bridge 模式原理?
- Docker 创建虚拟网桥
docker0,容器分配独立 IP - 宿主机通过 端口映射(-p) 访问容器
- 同一 bridge 下容器可通过容器名 / IP直接通信
3. 容器间如何通信?
- 同 bridge 网络:直接用容器名 / IP 通信
- 自定义 bridge:DNS 解析,推荐生产使用
- 端口映射 + 宿主机 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. 容器启动失败 / 一直重启,怎么排查?
- 看日志:
docker logs -f 容器ID - 检查端口冲突:
netstat -tulpn - 检查资源限制:内存溢出、CPU 打满
- 检查数据卷权限:挂载目录无读写权限
- 进入容器调试:
docker run --rm -it 镜像 /bin/bash手动启动
2. 容器时区不对(8 小时误差)怎么解决?
- 运行时挂载时区:
bash
-v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro
- Dockerfile 配置时区:
bash
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
3. 如何部署 SpringBoot + MySQL 多容器?
- 自定义 bridge 网络(保证 DNS 解析)
- MySQL 挂载数据卷持久化
- SpringBoot 连接地址用容器名 (而非localhost)
- 使用 Docker Compose 统一编排
九、高频易混对比题
-
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进容器