欢迎光临
我们一直在努力

Docker面试题(不定时更新)

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


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

💡 知识点解析:

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

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

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

🗣️ 面试参考回答:

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

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

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

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

  • 性能: 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 应用最常用的那几个步骤:

  • 选底座 (FROM)

  • 设工作目录 (WORKDIR)

  • 拷代码 (COPY)

  • 装依赖/打包 (RUN)

  • 启动 (CMD / ENTRYPOINT)

  • 🗣️ 面试参考回答:

    “常见的 Dockerfile 指令包括:

  • FROM:指定基础镜像;
  • RUN:在构建时执行命令(如安装软件);
  • COPY / ADD:将本地文件复制到镜像中(ADD 还支持自动解压和 URL 下载);
  • WORKDIR:设置工作目录;
  • CMD:容器启动时默认执行的命令(可被 docker run 覆盖);
  • EXPOSE:声明容器运行时监听的端口(仅为文档作用,不实际发布端口);
  • 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 中用于实现数据持久化和数据共享的机制。它本质上是宿主机文件系统中的一个目录,被直接挂载到容器中。

    它的主要作用有:

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

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

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


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

    💡 知识点解析:

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

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

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

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

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

  • 🗣️ 面试参考回答:

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

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

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

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

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

    赞(0)
    未经允许不得转载:171主机测评 » Docker面试题(不定时更新)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址