一、基础必考题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、Nexus4. 镜像和容器的区别镜像只读、分层、静态用于创建容器容器读写、动态、运行态是镜像的实例一个镜像可启动 N 个容器二、核心命令题口述 / 上机高频1. 写出常用 docker run 核心参数# 后台运行 端口映射 数据卷 命名 开机自启 docker run -d \ --name my容器 \ -p 宿主机端口:容器端口 \ -v 宿主机目录:容器目录 \ --restartalways \ 镜像名:标签-d后台运行-p端口映射桥接模式-v数据卷挂载持久化--name指定容器名--restartalways异常退出自动重启2. 进入运行中的容器execvsattach区别推荐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 镜像ID4. 查看容器日志、资源占用# 实时查看日志 docker logs -f 容器ID # 查看最近100行 docker logs --tail100 容器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 三种持久化方式数据卷VolumeDocker 管理宿主机目录推荐跨平台、权限友好绑定挂载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 通信自定义 bridgeDNS 解析推荐生产使用端口映射 宿主机 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 小时误差怎么解决运行时挂载时区-v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:roDockerfile 配置时区ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime echo $TZ /etc/timezone3. 如何部署 SpringBoot MySQL 多容器自定义 bridge 网络保证 DNS 解析MySQL 挂载数据卷持久化SpringBoot 连接地址用容器名而非localhost使用 Docker Compose 统一编排九、高频易混对比题docker stop vs docker killstop优雅退出SIGTERM → 等待 → SIGKILLkill强制立即杀死SIGKILL容器退出码常见含义0正常退出137OOM 内存溢出被内核杀死125Docker 命令错误126权限不足 / 无法执行127命令找不到docker save vs docker exportsave保存镜像保留分层 / 元数据export导出容器快照丢失分层信息十、面试一句话速记Docker Namespace 隔离 Cgroups 资源限制 UnionFS 分层镜像只读分层容器读写临时数据卷持久化CMD 可覆盖ENTRYPOINT 不覆盖bridge 默认网络host 共享网络排查三板斧logs→stats→exec进容器