一:基础概念类(必问,30题)
1:Docker 是什么?
Docker 是一个开源的应用容器引擎,基于 Go 语言开发,遵循 Apache 2.0 协议开源,能让开发者将应用及其依赖打包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 操作系统的机器上。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
沙箱机制(Sandbox):类比 "独立的封闭盒子",每个 Docker 容器都被限制在自己的 "盒子" 里运行,容器内部的应用、进程、文件系统、网络等,都会与其他容器、以及宿主机系统隔离开来。
"相互之间不会有任何接口":并非绝对无任何交互(可通过配置实现通信),而是指默认情况下,容器之间完全独立,没有直接的访问接口 ------ 比如容器 A 的进程无法直接访问容器 B 的文件、内存,容器 B 的网络端口也不会被容器 A 默认感知,互不干扰、互不影响,就像两个完全独立的 "隔离空间",避免了容器间的相互干扰和误操作(比如一个容器崩溃、出错,不会影响其他容器正常运行)。
补充:这种隔离是基于 Linux Namespace、Cgroups 等底层技术实现的,也是 Docker 轻量且安全的核心原因之一,区别于虚拟机的硬件级隔离,属于操作系统级的轻量隔离。
2:Docker 的核心作用是什么?
标准化打包:将应用及其依赖(如库、配置文件等)统一打包成容器镜像,解决 "开发环境能跑,生产环境跑不起来" 的环境一致性问题;
隔离部署:通过容器沙箱机制,实现多个应用独立运行、互不干扰,节省服务器资源;
便捷分发:镜像可通过仓库(如 Docker Hub)快速分发、复用,简化部署流程;
轻量虚拟化:相比传统虚拟机,容器无需模拟完整操作系统,启动快、资源占用少,提升部署和运行效率。
3:Docker 和虚拟机(VM)的本质区别是什么?
- 虚拟机(VM):基于硬件虚拟化,需要模拟完整的操作系统(Guest OS),每个虚拟机都有独立的内核、内存、磁盘等资源,隔离级别高,但资源占用大、启动慢;
- Docker 容器:基于操作系统级虚拟化,共享宿主机的内核,仅隔离应用的运行环境
- (文件系统、网络、进程等),不模拟完整操作系统,隔离级别低于虚拟机,但资源占用极低、启动极快。
4:容器是什么?
容器(Container)是 Docker 核心组件之一,可以看作一个 "独立的封闭沙箱"。
它是由 Docker 镜像创建的可运行实例,包含了应用程序及其所有依赖(库文件、配置、运行时等),但不包含完整的操作系统内核,而是共享宿主机的内核,通过 Namespace、Cgroups 等底层技术,实现与其他容器、宿主机系统的资源隔离(文件系统、网络、进程、用户等)。
5:镜像是什么?
镜像(Image)是 Docker 核心组件之一,本质是只读的、分层的、文件系统模板,是创建 Docker 容器的基础。
它包含了运行某个应用所需的完整环境:应用程序代码、运行时(如 JDK、Python 环境)、库文件、配置文件、环境变量等,相当于一个 "预制好的、可复用的应用安装包"。
6:仓库是什么?
仓库(Repository)是 Docker 核心组件之一,本质是用于存储和分发 Docker 镜像的远程或本地服务 / 空间,相当于一个 "镜像仓库",专门管理各类 Docker 镜像的上传、存储、下载和版本控制。
关键特点和补充:
- 核心作用:集中管理镜像,实现镜像的复用和分发 ------ 开发者可将本地构建的镜像推送到仓库,也可从仓库拉取所需镜像到本地,快速创建容器。
- 分类:主要分为公有仓库和私有仓库;公有仓库(如 Docker Hub、阿里云容器镜像服务公有版)对外开放,可免费拉取公共镜像;私有仓库(如企业内部搭建的 Harbor、Docker Registry)仅对特定用户 / 群体开放,用于存储私有镜像(如企业内部应用镜像),保障安全性。
- 与镜像的关系:一个仓库可存储多个镜像,每个镜像可通过**"仓库名:标签(tag)"**唯一标识(如 nginx:latest),标签用于区分镜像的不同版本。
7:Docker 的核心组件有哪些?
镜像(Image):只读的文件系统模板,是创建容器的基础(应用 + 依赖的打包包);
容器(Container):镜像的可运行实例,被沙箱隔离,是应用实际运行的环境;
仓库(Repository):存储和分发镜像的服务 / 空间(分公有、私有);
Docker 引擎(Docker Engine):核心运行环境,包含 Docker daemon(后台进程,负责管理镜像、容器)、Docker Client(命令行交互工具,与 daemon 通信)。
8:Docker daemon 是什么,主要作用是什么?
- Docker daemon 是什么?
Docker daemon(Docker 守护进程),本质是 运行在 Docker 宿主机后台的常驻进程进程名通常为 dockerd,是 Docker 引擎(Docker Engine)的核心组成部分,也是 Docker 架构中 "服务端(Server)" 的核心,负责接收和执行 Docker Client(客户端)发送的所有命令。
主要作用是什么?
管理镜像:负责镜像的拉取、推送、构建、存储和删除,处理镜像相关的所有操作;
管理容器:负责容器的创建、启动、停止、重启、删除,以及容器的资源隔离(基于 Namespace、Cgroups)和运行状态维护;
处理客户端请求:监听 Docker Client 发送的命令(如 docker run、docker pull),解析并执行,同时将执行结果返回给客户端;
管理 Docker 相关资源:负责 Docker 网络、数据卷(Volume)等核心资源的创建、配置和维护,协调容器与宿主机、容器与容器之间的交互。
补充(面试加分):Docker daemon 可通过配置文件(如 /etc/docker/daemon.json)自定义配置(如镜像加速、日志限制),默认通过本地 Unix 套接字(unix:///var/run/docker.sock)与 Docker Client 通信,也可配置为远程通信。
9:Docker client 是什么,如何与 Docker daemon 通信?
- Docker Client 是什么?
Docker Client(Docker 客户端),本质是 Docker 的命令行交互工具(也是 Docker 引擎的组成部分),是开发者 / 用户操作 Docker 的入口,无需直接与 Docker daemon 交互,只需输入 Docker 命令(如 docker run、docker pull),即可向 Docker daemon 发送操作请求。
如何与 Docker daemon 通信?(面试核心,记 2 种核心方式)
默认通信方式(本地交互):通过 Unix 套接字(unix:///var/run/docker.sock) 通信,这是 Docker 默认的本地通信方式,仅能在 Docker 宿主机上直接操作(比如在宿主机终端输入 docker 命令)。
远程通信方式(跨主机操作):通过 TCP 协议 通信,需修改 Docker daemon 配置(如 /etc/docker/daemon.json),开启远程访问端口(默认 2375 端口,非加密;2376 端口,TLS 加密),之后客户端可通过指定 daemon 地址(如 docker -H tcp:// 远程宿主机 IP:2375 命令),跨主机向远程 daemon 发送请求。
补充(面试加分):通信流程极简 ------ 用户在 Client 输入命令 → Client 解析命令并封装请求 → 通过对应通信方式(套接字 / TCP)发送给 daemon → daemon 执行命令并返回结果 → Client 展示执行结果。
10:Docker registry 和 Docker Hub 的区别是什么?
核心区别:Docker Registry 是存储镜像的 "底层服务 / 工具"(通用技术),Docker Hub 是基于 Registry 搭建的 "公有镜像仓库平台"(具体产品) ,二者是 "工具与产品""通用与具体" 的关系,详细区别如下(面试简洁版,直接记):
定义不同
- Docker Registry:是 Docker 官方提供的、用于存储和分发镜像的开源服务 / 工具,本质是一个镜像存储的 "底层框架",可部署在本地或服务器,搭建私有仓库(如企业内部用 Registry 搭建私有镜像服务)。
- Docker Hub:是 Docker 公司运营的公有镜像仓库平台,基于 Docker Registry 技术构建,是全球最大的公共 Docker 镜像仓库。
访问权限不同
- Docker Registry:部署后可自定义权限(私有 / 半公开),默认不对外开放,主要用于内部镜像管理(如企业私有仓库)。
- Docker Hub:完全对外开放,所有人可免费拉取公共镜像(如 nginx、mysql 镜像),注册账号后可推送自己的镜像(公共 / 私有仓库)。
功能不同
- Docker Registry:功能简单,仅提供镜像的存储、推送、拉取基础功能,无额外增值服务。
- Docker Hub:除了基础的镜像存储分发,还提供镜像搜索、官方认证镜像、镜像版本管理、团队协作等增值功能。
11:Docker 的 C/S 架构具体指什么?
Docker 的 C/S 架构,核心是 客户端(Client)和服务端(Server)分离 的架构模式,二者协同工作完成所有 Docker 操作,面试简洁答题版(重点记):
- 客户端(C = Client):就是 Docker 命令行工具(Docker Client),是用户 / 开发者操作 Docker 的入口,无需直接操作底层服务,仅负责输入命令(如 docker run、docker pull),并将命令封装成请求,发送给服务端。
- 服务端(S = Server):核心是 Docker 守护进程(Docker daemon,后台常驻进程),运行在 Docker 宿主机上,负责接收客户端的请求,解析并执行(如构建镜像、创建容器、管理网络 / 数据卷等),同时将执行结果返回给客户端。
- 通信方式:默认通过本地 Unix 套接字(unix:///var/run/docker.sock)通信(宿主机本地操作);也可配置 TCP 协议,实现远程客户端访问远程宿主机的 Docker 服务端。
12:Docker 的分层存储是什么意思?
- 每层对应 Dockerfile 一条指令(如 FROM、RUN),仅存储该指令的变更;
- 不同镜像可复用相同底层镜像层,大幅节省存储空间;
- 镜像层只读不可直接修改,修改仅在容器可写层进行,删除容器后可写层数据丢失,只读镜像层不变。
13:Docker 的写时复制(Copy-on-Write)机制是什么?
写时复制机制在 Docker 中有什么作用?
Docker 容器的生命周期分为哪几个阶段?
Docker 适合部署哪些类型的应用?
Docker 不适合部署哪些类型的应用?
什么是容器化?容器化的优势是什么?
Docker 版本分为哪几种,有什么区别?
Docker Engine 包含哪些部分?
什么是 Docker 镜像的分层结构?
Docker 镜像的基础镜像(Base Image)是什么?
容器和镜像的关系是什么?
Docker 仓库的分类有哪些?
私有仓库和公有仓库的区别是什么?
Docker 的核心技术有哪些?
容器化部署和传统部署的区别是什么?
Docker 能实现跨平台部署吗?为什么?
二:常用命令(必考,30题)
如何拉取一个 Docker 镜像?
如何推送一个 Docker 镜像到仓库?
如何构建一个 Docker 镜像?
如何查看本地所有的 Docker 镜像?
如何删除本地的一个 Docker 镜像?
如何给 Docker 镜像打标签?
如何搜索 Docker Hub 上的镜像?
如何查看一个 Docker 镜像的详细信息?
如何创建并启动一个 Docker 容器?
如何查看正在运行的 Docker 容器?
如何查看所有的 Docker 容器(包括停止的)?
如何进入正在运行的 Docker 容器?
如何启动一个已停止的 Docker 容器?
如何停止一个正在运行的 Docker 容器?
如何强制停止一个 Docker 容器?
如何删除一个已停止的 Docker 容器?
如何强制删除一个正在运行的 Docker 容器?
如何查看 Docker 容器的日志?
如何实时查看 Docker 容器的日志?
如何查看 Docker 容器的资源占用情况?
如何限制 Docker 容器的 CPU 使用量?
如何限制 Docker 容器的内存使用量?
如何限制 Docker 容器的磁盘 IO?
如何查看 Docker 容器的 IP 地址?
如何查看 Docker 容器的端口映射情况?
如何重启一个 Docker 容器?
如何批量停止所有正在运行的 Docker 容器?
如何批量删除所有已停止的 Docker 容器?
如何批量删除本地所有的 Docker 镜像?
如何查看 Docker 的版本信息?
如何查看 Docker daemon 的运行状态?
三:Dockerfile(高频,30题)
Dockerfile 是什么?
Dockerfile 的作用是什么?
Dockerfile 中 FROM 指令的作用是什么?
FROM 指令可以指定多个吗?为什么?
Dockerfile 中 RUN 指令的作用是什么?
RUN 指令的两种格式有什么区别?
Dockerfile 中 COPY 指令的作用是什么?
Dockerfile 中 ADD 指令的作用是什么?
COPY 和 ADD 指令的区别是什么?
Dockerfile 中 CMD 指令的作用是什么?
Dockerfile 中 ENTRYPOINT 指令的作用是什么?
CMD 和 ENTRYPOINT 指令的区别是什么?
Dockerfile 中 WORKDIR 指令的作用是什么?
WORKDIR 和 cd 命令的区别是什么?
Dockerfile 中 EXPOSE 指令的作用是什么?
EXPOSE 指令会实际暴露端口吗?
Dockerfile 中 ENV 指令的作用是什么?
如何在 Dockerfile 中设置环境变量并引用?
Dockerfile 中 ARG 指令的作用是什么?
ARG 和 ENV 指令的区别是什么?
Dockerfile 中 VOLUME 指令的作用是什么?
Dockerfile 中 USER 指令的作用是什么?
为什么推荐在 Dockerfile 中使用非 root 用户运行容器?
Dockerfile 中 ONBUILD 指令的作用是什么?
如何通过 Dockerfile 构建最小化镜像?
什么是 Docker 多阶段构建?有什么作用?
如何通过 Dockerfile 优化镜像大小?
.dockerignore 文件的作用是什么?
Dockerfile 中可以使用注释吗?如何注释?
构建 Docker 镜像时,如何指定 Dockerfile 的路径?
构建 Docker 镜像时,如何传递构建参数?
如何验证 Dockerfile 的语法是否正确?
四:数据持久化(20题)
Docker 容器内的数据为什么会丢失?
Docker 数据持久化的目的是什么?
Docker 数据持久化有哪几种方式?
什么是 Docker Volume(卷)?
如何创建一个 Docker Volume?
如何查看本地所有的 Docker Volume?
如何删除一个 Docker Volume?
如何将 Volume 挂载到容器中?
Volume 的数据会随着容器删除而删除吗?
什么是绑定挂载(Bind Mount)?
绑定挂载和 Volume 的区别是什么?
如何使用绑定挂载实现数据持久化?
什么是 tmpfs 挂载?
tmpfs 挂载的适用场景是什么?
如何实现多个容器共享同一个数据卷?
什么是数据卷容器?
如何备份 Docker Volume 中的数据?
如何恢复 Docker Volume 中的数据?
挂载数据卷时,如何设置权限?
如何查看容器的挂载情况?
五:Docker 网络(20题)
Docker 默认的网络模式有哪些?
bridge 网络模式的原理是什么?
host 网络模式的特点是什么?
none 网络模式的适用场景是什么?
container 网络模式的作用是什么?
如何查看 Docker 所有的网络?
如何创建一个自定义 Docker 网络?
如何删除一个自定义 Docker 网络?
如何将容器连接到指定的网络?
Docker 容器之间如何通信?
不同网络模式下的容器可以通信吗?
Docker 端口映射的原理是什么?
如何设置 Docker 容器的端口映射?
如何查看 Docker 容器的端口映射详情?
Docker 网络中的 DNS 解析如何实现?
如何自定义 Docker 容器的 DNS 服务器?
Docker 桥接网络和宿主机网络的关系是什么?
如何实现 Docker 容器访问外网?
如何限制 Docker 容器的网络带宽?
Docker 网络中的网关是什么作用?
六、Docker Compose(20题)
Docker Compose 是什么?
Docker Compose 的作用是什么?
Docker Compose 和 Docker 有什么关系?
如何安装 Docker Compose?
Docker Compose 的核心配置文件是什么?
docker-compose.yml 文件的基本结构是什么?
docker-compose.yml 中 version 字段的作用是什么?
docker-compose.yml 中 services 字段的作用是什么?
如何在 docker-compose.yml 中指定镜像?
如何在 docker-compose.yml 中指定 Dockerfile 路径?
docker-compose.yml 中 ports 字段的作用是什么?
docker-compose.yml 中 volumes 字段的作用是什么?
docker-compose.yml 中 networks 字段的作用是什么?
docker-compose.yml 中 depends_on 字段的作用是什么?
depends_on 能保证容器启动顺序吗?
如何在 docker-compose.yml 中设置环境变量?
Docker Compose 常用命令有哪些?
如何启动 Docker Compose 管理的容器集群?
如何停止 Docker Compose 管理的容器集群?
生产环境中可以直接使用 Docker Compose 吗?为什么?
七:生产/排坑问题(进阶必问,30题)
Docker 容器退出后,日志如何保留?
Docker 容器日志过大,如何清理?
如何限制 Docker 容器日志的大小?
Docker 容器时区不正确,如何解决?
Docker 容器中出现中文乱码,如何解决?
如何给 Docker 容器固定 IP 地址?
Docker 容器启动失败,如何排查原因?
如何优雅停止 Docker 容器?
Docker 镜像太大,如何优化?
Docker 镜像构建速度慢,如何优化?
Docker 容器启动速度慢,可能的原因有哪些?
Docker 容器内存溢出,如何排查和解决?
Docker 容器 CPU 占用过高,如何排查和解决?
Docker 容器磁盘占用过高,如何排查和解决?
Docker 容器之间通信失败,如何排查?
Docker 容器无法访问外网,如何排查?
Docker 私有仓库推送/拉取镜像失败,如何排查?
如何实现 Docker 容器自启动?
如何实现 Docker 容器的滚动更新?
如何实现 Docker 容器的灰度发布?
Docker 容器部署微服务时,如何实现服务发现?
Docker 容器的健康检查如何配置?
Docker 容器健康检查失败,如何处理?
生产环境中,Docker 容器如何监控?
常用的 Docker 监控工具有哪些?
Docker 容器备份和恢复的方案有哪些?
Docker 集群部署和单机部署的区别是什么?
Docker 容器中运行数据库,需要注意什么?
如何避免 Docker 容器权限泄露?
Docker 容器镜像存在漏洞,如何处理?
生产环境中,Docker 的镜像管理策略是什么?
八:原理 & 底层(中高级,20题)
Docker 的底层核心技术有哪些?
什么是 Linux Namespace?
Docker 用到了哪些 Linux Namespace?
PID Namespace 的作用是什么?
NET Namespace 的作用是什么?
MNT Namespace 的作用是什么?
UTS Namespace 的作用是什么?
IPC Namespace 的作用是什么?
USER Namespace 的作用是什么?
什么是 Linux Cgroups?
Cgroups 的核心作用是什么?
Docker 如何利用 Cgroups 进行资源限制?
什么是 UnionFS?
Docker 支持哪些 UnionFS 变体?
UnionFS 在 Docker 中的作用是什么?
Docker 镜像的分层存储是基于什么实现的?
容器是"轻量级虚拟机"吗?为什么不是?
Docker 容器的隔离性是如何实现的?
Docker daemon 的工作原理是什么?
Docker 镜像的构建原理是什么?
九:场景题(20题)
如何把 SpringBoot 项目打包成 Docker 镜像?
如何把 Java 项目打包成 Docker 镜像?
如何把 Go 项目打包成 Docker 镜像?
如何把前端(Vue/React)项目打包成 Docker 镜像?
微服务项目如何用 Docker 部署?
如何用 Docker 部署 MySQL 数据库?
如何用 Docker 部署 Redis 缓存?
如何用 Docker 部署 Nginx 服务器?
如何用 Docker 部署 Tomcat 容器?
如何实现 Docker 容器与宿主机之间的文件传输?
如何在 Docker 容器中安装软件?
如何调试 Docker 容器中的应用程序?
如何将本地已有的项目迁移到 Docker 容器中?
如何实现 Docker 容器的跨主机部署?
如何用 Docker Compose 部署多容器应用?
Docker 容器部署的应用,如何实现负载均衡?
如何处理 Docker 容器中的配置文件?
如何实现 Docker 容器的自动伸缩?
如何用 Docker 部署分布式应用?
Docker 容器部署后,如何进行版本回滚?