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,就可以一次性启动并管理整个应用集群。它非常适合在开发环境或单机环境下快速部署微服务项目。"

相关推荐
Coder码匠17 分钟前
Dockerfile 优化实践:从 400MB 到 80MB
java·spring boot
李慕婉学姐8 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
奋进的芋圆9 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin10 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model200510 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
huaweichenai10 小时前
docker部署kkFileView实现文件预览功能
运维·docker·容器
荒诞硬汉10 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国10 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_9418824810 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
han_11 小时前
从一道前端面试题,谈 JS 对象存储特点和运算符执行顺序
前端·javascript·面试