Docker面试题(不定时更新)

基础可以参考我之前写的博客:
docker(从入门到精通)


1. Docker 和虚拟机的区别是什么?

💡 知识点解析:

这是 Docker 面试的必考题。核心区别在于"隔离的层次":

  • 虚拟机 (VM): 像盖了一栋完全独立的新房子。它有自己的地基(虚拟硬件)、墙壁和房顶(完整的 Guest OS 操作系统)。所以它很重,启动慢。

  • Docker (容器): 像在现有的房子里打了个隔断。大家共用一个地基(宿主机 Linux 内核),只把家具(应用代码和依赖库)隔离开。所以它很轻,启动是毫秒级的。

🗣️ 面试参考回答:

"Docker 容器和虚拟机最大的区别在于架构资源利用率

  1. 架构不同: 虚拟机是硬件级虚拟化 ,每个 VM 都要运行一个完整的操作系统(Guest OS),非常笨重;而 Docker 是操作系统级虚拟化 ,容器之间共享宿主机的内核,只隔离应用进程和依赖。

  2. 启动速度: Docker 启动是秒级甚至毫秒级的;而虚拟机启动需要分钟级。

  3. 体积: Docker 镜像通常只有几十 MB;而虚拟机镜像动辄几 GB。

  4. 性能: Docker 因为没有额外的操作系统开销,性能几乎接近原生;虚拟机则有额外的资源损耗。"


2. Docker 中的镜像是什么?

💡 知识点解析:

  • 类比: 镜像(Image)就是"光盘"或者面向对象里的"类 (Class)"。

  • 特性: 它是只读的。

  • 分层: 像千层饼一样。底层是 OS,上面是 JDK,再上面是 Tomcat,最上面是你的代码。每改动一次就是加一层。

🗣️ 面试参考回答:

"镜像 (Image) 是一个只读的模板,它是创建容器的基础。

从技术角度看,镜像是分层存储 的。它包含了一个完整的操作系统环境 (如 root 文件系统),以及应用运行所需的所有依赖(库文件、配置文件、代码等)。

因为镜像是分层的,所以它具有复用性强、体积小 的特点。当我们启动容器时,实际上就是在镜像的顶部加了一层可写层。"


3. 运行 Docker 容器的命令是什么?

💡 知识点解析:

核心命令是 docker run。但面试官通常想看你知道多少参数。

  • 后台运行:-d

  • 端口映射:-p

  • 起名字:--name

  • 挂载数据:-v

🗣️ 面试参考回答:

"启动容器最核心的命令是docker run

常用的参数组合通常是:

docker run -d -p 宿主机端口:容器端口 --name 容器名 -v 宿主机目录:容器目录 镜像名

例如启动一个 Nginx:

docker run -d -p 80:80 --name my-nginx nginx

这表示后台运行 Nginx,将宿主机的 80 端口映射到容器的 80 端口。"


4. 说出几个 Dockerfile 的常见指令

💡 知识点解析:

Dockerfile 是造镜像的"说明书"。

你需要记住构建一个 Java 或 Python 应用最常用的那几个步骤:

  1. 选底座 (FROM)

  2. 设工作目录 (WORKDIR)

  3. 拷代码 (COPY)

  4. 装依赖/打包 (RUN)

  5. 启动 (CMD / ENTRYPOINT)

🗣️ 面试参考回答:

"常见的 Dockerfile 指令包括:

  1. FROM:指定基础镜像;
  2. RUN:在构建时执行命令(如安装软件);
  3. COPY / ADD :将本地文件复制到镜像中(ADD 还支持自动解压和 URL 下载);
  4. WORKDIR:设置工作目录;
  5. CMD :容器启动时默认执行的命令(可被 docker run 覆盖);
  6. EXPOSE:声明容器运行时监听的端口(仅为文档作用,不实际发布端口);
  7. ENV:设置环境变量。

5. COPY 和 ADD 的区别,CMD 和 ENTRYPOINT(entrypoint) 的区别

💡 知识点解析:

这是细节题,很容易混淆。

  • COPY vs ADD: COPY 是老实人,只负责复制;ADD 是高级版,能解压 tar.gz,还能下网络文件(但不推荐用它下网络文件)。

  • CMD vs ENTRYPOINT:

    • CMD: 像是"备胎"。如果你 docker run 后面加了命令,CMD 就失效了。

    • ENTRYPOINT: 像是"门神"。不管你 run 后面加什么,它都会执行。你加的东西会变成它的参数。

🗣️ 面试参考回答:

"这两组指令的区别如下:

COPY 和 ADD:

  • COPY: 功能简单,只能将本地文件复制到镜像中。推荐优先使用 COPY。

  • ADD: 功能更强大。除了复制本地文件,它还支持自动解压 (如 tar 包)和下载远程 URL 的文件。

CMD 和 ENTRYPOINT:

  • CMD: 指定容器启动时的默认 命令。如果 docker run 后面指定了其他命令,CMD 会被覆盖。

  • ENTRYPOINT: 指定容器启动时一定 会执行的命令。如果 docker run 后面指定了参数,这些参数会被追加到 ENTRYPOINT 后面,作为参数传入。"


6. Docker 中的数据卷是什么,有什么作用?

💡 知识点解析:

容器是"用完即扔"的。如果你把数据库装在容器里,容器一删,数据也没了。这很可怕。

数据卷 (Volume) 就是把宿主机的一个目录"穿透"进容器里。

  • 持久化: 容器删了,文件还在宿主机硬盘上。

  • 共享: 两个容器可以读同一个硬盘目录。

🗣️ 面试参考回答:

"数据卷 (Volume) 是 Docker 中用于实现数据持久化数据共享 的机制。它本质上是宿主机文件系统中的一个目录,被直接挂载到容器中。

它的主要作用有:

  1. 数据持久化: 容器删除后,数据卷中的数据不会丢失(例如 MySQL 的数据文件)。

  2. 数据共享: 可以在宿主机和容器之间,或者多个容器之间共享数据。

  3. 修改方便: 可以直接在宿主机修改配置文件,容器内立即生效,不需要进入容器内部。"


7. 请简要介绍 Docker 网络的几种模式

💡 知识点解析:

容器怎么上网?怎么互相访问?

  1. Bridge (默认): 每个人都有自己的独立 IP,通过虚拟网桥(docker0)连接。

  2. Host: 容器"裸奔",直接用宿主机的 IP 和端口。快,但是端口容易冲突。

  3. None: 没网卡,只有 loopback。适合安全性极高的任务。

  4. Container: 蹭网。蹭另一个容器的网卡,IP 一样。

🗣️ 面试参考回答:

"Docker 常见的网络模式有四种:

  1. Bridge 模式(默认): 桥接模式。容器拥有独立的 Network Namespace(独立的 IP、端口),通过 docker0 网桥与宿主机通信。

  2. Host 模式: 容器与宿主机共享网络栈。容器没有独立的 IP,直接使用宿主机的 IP 和端口。性能最好,但容易端口冲突。

  3. None 模式: 容器有独立的网络空间,但没有任何网络配置(没有网卡、IP),完全隔离。

  4. Container 模式: 一个容器共享另一个已存在容器的网络栈。它们俩看起来像是一个机器上的两个进程。"


8. 如何创建一个自定义的 Docker 网络?

💡 知识点解析:

为什么要自定义?因为默认的 Bridge 网络不能通过"名字"访问,只能通过 IP。自定义网络后,由于内置了 DNS,容器之间可以直接 ping 容器名。

命令:docker network create。

🗣️ 面试参考回答:

"创建命令是:docker network create 网络名称

为什么要自定义?

因为 Docker 默认的 bridge 网络不支持通过容器名 (Container Name) 进行通信,只能用 IP,而 IP 是变动的。

创建自定义网络后,在这个网络内的容器可以通过容器名直接互相访问(Docker 自带了 DNS 解析),这在微服务架构中非常重要。"


9. 什么是 docker-compose?

💡 知识点解析:

  • 问题: 如果我有 10 个微服务,我要敲 10 次 docker run 吗?太累了,而且还得记谁先启动谁后启动。

  • 解决: 写一个 docker-compose.yml 文件,把 10 个服务的配置(镜像、端口、环境变量)都写进去。然后敲一个命令 docker-compose up,全起来了。

  • 定位: 单机编排工具。

🗣️ 面试参考回答:

"Docker Compose 是一个用于定义运行多容器 Docker 应用程序的工具。

它通过一个YAML 文件 (docker-compose.yml)来配置应用的所有服务(包括镜像、启动顺序、网络依赖、数据卷等)。

然后只需要执行一条命令docker-compose up,就可以一次性启动并管理整个应用集群。它非常适合在开发环境或单机环境下快速部署微服务项目。"

相关推荐
feathered-feathered3 小时前
Redis基础知识+RDB+AOF(面试)
java·数据库·redis·分布式·后端·中间件·面试
毕设源码-赖学姐3 小时前
【开题答辩全过程】以 高校排课系统的优化设计与实现为例,包含答辩的问题和答案
java·eclipse
q_19132846953 小时前
基于SpringBoot2+Vue2的行业知识答题考试系统
java·vue.js·spring boot·mysql·毕业设计·计算机毕业设计·演示文稿
上78将3 小时前
Java中既有编译执行又有解释执行,这个怎么理解?
java·开发语言
Mr_Xuhhh3 小时前
JAVA期末重点
java·开发语言·python
a程序小傲3 小时前
小红书Java面试被问:java创建对象有哪些方式?
java·开发语言·面试
树下水月3 小时前
docker 启动后 如何通过对应的进程 找docker-compose.yaml 编排文件
运维·docker·容器
代码or搬砖4 小时前
Spring Cache讲解
java·后端·spring
凯子坚持 c4 小时前
Docker 网络管理深度解析与实践指南
运维·docker·容器