Docker面试题

2025 年 4 月 7 日 | 阅读 17 分钟

以下是一些最常见的 Docker 问题及其答案,这些问题对求职面试准备非常有帮助。面试官经常会问这些问题,以了解您对 Docker 的熟悉程度。

1. 什么是 Docker?

Docker 是一个开源平台,旨在容器化环境中自动部署、扩展和管理应用程序。它允许您将软件或应用程序与基础设施分离,从而立即交付软件。Docker 使您能够管理基础设施以及应用程序。通过使用 Docker,您可以轻松减少编写代码和在生产环境中执行代码之间的延迟。


2. 什么是容器化?

容器化允许开发人员将应用程序及其依赖项(库、二进制文件和配置文件)打包成一个可移植单元,该单元能够在所有环境中以一致的方式运行。简而言之,Docker 使应用程序的部署过程变得更容易,提高了操作效率,并提供了统一的开发、测试和生产环境。


3. 什么是 Docker 容器?

Docker 容器是轻量级、可移植且高效的容器,它们将应用程序及其运行所需的一切(代码、运行时、库和系统工具)打包在一起。它们共享宿主系统内核,但在隔离的用户空间中运行,因此应用程序无论底层物理参数如何,都能不受干扰地运行。它们比虚拟机更快、更高效,因为它们共享操作系统,而不是每个实例都需要一个功能齐全的独立操作系统。


4. Docker 镜像和 Docker 容器有什么区别?

Docker 镜像和 Docker 容器本质上是同一枚硬币的两面,就持久状态及其在生产环境中的应用而言:镜像是由代码决定的状态;容器是执行时根据代码定义的这些状态的实例。镜像往往是自计算的,也就是说,任何人都可以解释和使用镜像。

容器处于另一个计算领域,其中事物仍然可以被修改。如果您以某种方式更改了一个容器,而您不知道如何重新创建该容器,那么该容器就会变成一个搁浅资产。不同类型的制造商根据它们在容器上操作的镜像或模板来吸引它们。容器一旦停止运行,就会失去相关性;它们被创建是有原因的。

Docker 镜像是静态模板,而容器是这些模板的实时运行实例。


5. 解释 Dockerfile 及其用途。

Dockerfile 是一个文本文件,其中包含一系列在构建 Docker 镜像过程中调用的指令。它通过确保一致、可重现的镜像创建过程来自动化创建镜像的程序。使用 Dockerfile,开发人员可以指定环境、依赖项以及要编译到镜像中的应用程序代码。

Dockerfile 的用途如下:

  • 自动创建 Docker 镜像
  • 应用程序环境中的一致定义
  • 为销售构建可重复和版本控制
  • 合并和简化部署。

Dockerfile 示例


6. 什么是 Docker Hub?

了解 Docker Hub

从 Docker 用户的角度来看,这是一个专门用于存储、共享和管理 Docker 镜像的云服务。可以说它是查找或分发容器镜像的一站式商店。

主要特点

  • 镜像仓库可以是私有的或公共的。
  • 由 Docker 和各自软件供应商跟踪的官方镜像
  • 用于构建和部署的自动化流水线
  • 镜像和标签的版本控制
  • 用于自动化的 CI/CD 集成

7. Docker Daemon 的作用是什么?

代表 Docker 容器、镜像、网络和卷在宿主机上运行的后台服务称为 Docker Daemon。它监听 Docker API 发送的请求,并执行几个由最终用户管理的活动:构建、运行、停止、删除容器等。

Dockerd 的主要功能

  • 容器的运行时操作...
  • 镜像、容器、网络和卷管理...
  • 使用 Docker API 与 Docker 客户端交互...
  • 创建和分发 Docker 镜像...
  • 管理容器的隔离、资源调度和执行

8. 如何在 [操作系统] 上安装 Docker?

要在 Linux Ubuntu 等操作系统上安装 Docker,我将在 Linux 命令行中运行以下命令

在 Windows/Mac 上:从 https://www.docker.com/products/docker-desktop 下载并安装 Docker Desktop。


9. 解释 Docker 容器的生命周期。

下面给出了容器的完整生命周期

  • 创建: 这是容器被创建但尚未启动的时间。
  • 启动: 此阶段将使用 docker start 命令启动一个新创建的容器。
  • 运行中: 此阶段指容器中运行的进程一经启动即表示为“启动”。
  • 暂停: 在有限时间内暂停容器中所有正在运行的进程。
  • 取消暂停: 暂停后继续操作。
  • 停止: 以优雅的方式停止运行中的容器。
  • 杀死: 强制停止运行中的容器。
  • 重启: 先停止,然后再次启动容器。
  • 销毁(删除): 容器将在此阶段通过 docker rm 从系统中删除。

10. 使用哪种方法创建 Docker 容器?

可以使用 docker run 命令创建 Docker 容器。

例如,

说明

此命令创建并运行一个容器 -d:在后台运行容器(分离模式)--name:为容器分配一个名称--:运行此容器将使用基于 nginx 的镜像。


11. 如何列出正在运行的 Docker 容器?

要查看正在运行的容器,我将使用以下任何命令

其他选项有

docker ps -a - 它显示所有容器的列表,无论它们是正在运行还是已停止。

docker ps -q - 它仅输出容器 ID。

docker ps --filter "status=exited" - 它仅显示处于停止状态的容器。


12. 什么是 Docker 卷?

Docker 卷是用于持久化由 Docker 容器生成和使用的数据的存储单元。它们由 Docker 管理,并存储在宿主机文件系统(Linux 上的 /var/lib/docker/volumes/)中由 Docker 管理的部分。卷旨在即使在容器停止或删除后也能持久存在,使其成为数据存储、容器之间共享数据和维护应用程序状态的理想选择。

Docker 卷的主要功能

  • 持久性: 即使在容器重启后,存储在卷中的数据也保持不变。
  • 易用性: 卷完全由 Docker 管理,与绑定挂载相比,更容易备份、迁移和管理。
  • 数据共享: 卷可以在多个容器之间共享,为容器间通信提供了一种机制。
  • 性能: 卷针对 Docker 进行了优化,通常比其他数据存储方法具有更好的性能。

创建和使用卷的示例


13. 什么是 Docker Compose,它的组件和优点是什么?

基本上,Docker Compose 允许我们定义和管理多容器 Docker 应用程序。应用程序服务、网络和卷在 YAML 文件 (docker-compose.yml) 中配置。因此,使用 Docker Compose,可以轻松运行由相互连接的容器组成的复杂应用程序。

Docker Compose 的组件

  • 服务: 这些为应用程序容器提供定义。
  • 网络: 这些定义了容器之间通信的网络需求。
  • 卷: 这些允许容器之间的数据持久性。

优点

  • 您只需一个配置文件即可安装它。
  • 它有助于扩展和管理服务以及协调容器。
  • 它允许环境特定的配置和变量替换。

示例: docker-compose.yml 文件


14. 如何在 Docker Compose 中扩展容器?

在 Compose 中扩展 Docker 容器,本质上意味着创建服务的多个副本。这是因为在这种情况下,服务可以轻松进行负载平衡并有效处理大量流量。

要扩展服务,请使用以下命令

示例

它指示编排创建 docker-compose.yml 中定义的 Web 服务的三个实例。借助 Docker Compose,这会自动处理所有此类实例之间的网络通信。


15. CMD 和 ENTRYPOINT 之间有什么区别?

在 Dockerfile 中,它们实现两个不同的目的,但在容器启动时与容器交互时可以互换使用。

CMD: 它为可执行文件提供默认参数,在执行过程中可以通过提供额外的参数来覆盖。

ENTRYPOINT: 它指的是每次进入容器时将执行的主命令。运行时发送的任何参数都将附加到 ENTRYPOINT 的参数中。

示例 Dockerfile

这里唯一的区别是 ENTRYPOINT 运行 Python 脚本,而 CMD 设置默认值(端口号),尽管这些值可以在运行时选择性地更改。


16. 如何在 Docker 容器之间复制文件?

docker cp 命令足以在 Docker 容器和宿主系统之间复制文件。

将文件从宿主机复制到容器

将文件从容器复制到宿主机


17. docker stop 和 docker kill 有什么区别?

docker stop 和 docker kill 之间的区别如下:

  • Docker stop 速度很慢,因为它向运行中的容器发送终止信号,以优雅地关闭其中的所有进程。
  • Docker kill 只是尽可能快地发送 SIGKILL 信号以终止容器。

18. 如何将更改提交到 Docker 容器?

从命令行,您可以将更改提交到正在运行的 Docker 容器,以使用以下命令创建新镜像:docker commit container_id new_image_name。它捕获容器的当前状态并将其保存为新镜像。


19. 解释 Docker 网络。

这是 Docker 网络,容器可以使用它直接相互通信、与宿主操作系统通信或与外部世界通信。所有通信通道都保持隔离、安全和可扩展。

有几点需要注意

  • 容器可以通过 Docker 的 DNS 服务自动发现彼此。
  • 不同的用例将使用不同的网络驱动程序。

20. Docker 网络的类型有哪些?

  • 在桥接网络(默认网络类型)中,容器在同一宿主机上相互通信。
  • 主机类型将所有网络请求直接传递到主机的网络堆栈,从而消除了主机和容器之间的任何网络隔离。
  • 覆盖网络允许在不同 Docker 主机上运行的容器相互通信。
  • 无网络(None)是一个没有网络接口的隔离容器。
  • Macvlan 为容器分配一个唯一的 MAC 地址。

21. 如何检查 Docker 镜像?

您可以使用以下命令检查 Docker 镜像

此命令将显示镜像的元数据、层信息和配置数据。


22. Docker Swarm 和 Kubernetes 有什么区别?

Docker SwarmKubernetes 都是容器编排工具,但它们在架构、可扩展性和功能集方面有所不同。以下是区别:

特性Docker SwarmKubernetes
易用性设置和使用更简单更复杂的设置和配置
可扩展性适用于中小型部署专为大规模生产环境设计
负载均衡内置负载均衡需要外部工具(如 Ingress 或 Service Mesh)
网络使用简单的覆盖网络使用更高级的网络模型 (CNI)
存储支持对持久存储的支持有限支持动态存储配置
监控和日志记录基本日志记录通过 Prometheus、ELK 等进行高级监控和日志记录。
高可用性内置领导者选举和故障转移使用 etcd 实现更强大的高可用性机制
社区与生态系统较小的社区庞大的社区和广泛采用

何时使用哪个?

  • 如果您需要一个简单、轻量级且易于配置的编排工具,请使用 Docker Swarm
  • 如果您需要具有自动伸缩、高级网络和强大存储选项的企业级编排,请使用 Kubernetes

23. 解释 Docker 中的多阶段构建。

这意味着多阶段构建是在 Dockerfile 中使用多个 FROM 语句来缩小镜像的大小。每个 FROM 都是一个不同的构建阶段。

多阶段构建:如何以及为何使用它。

  • 清除最终镜像中过多的依赖项。
  • 它只在构建过程中临时存放其本质上不安全的工具和库。
  • 简化了 Dockerfile 的维护。

示例

# 阶段 1:构建

# 阶段 2:生产

第一阶段(builder)编译 Go 应用程序。第二阶段(alpine)只包含最终的二进制文件,使镜像更小更安全。


24. 什么是 Docker Secret?如何使用它?

Docker Secrets 已被证明是一个熟练的工具,可帮助开发人员在 Docker Swarm 环境中安全地存储、管理和部署敏感数据,例如密码、API 密钥和 TLS 证书。因此,Secrets 在静态和传输过程中都经过加密。

通过在终端中运行命令来使用 Docker Secrets 的步骤

1. 创建一个 Secret

2. 使用 Secret 部署服务

3. 在容器内部访问 Secret

Secrets 以文件形式挂载到容器内的 /run/secrets/ 中。

优点

  • 为机密或个人数据提供安全存储。
  • 只有允许的服务才能访问此信息。
  • 数据在静态和传输过程中都进行了加密。

25. 如何保护 Docker 容器?

我将使用以下方法来保护 Docker 容器

  • 仅使用简化的基础镜像
  • 限制权限
  • 启用 SELinux/AppArmor
  • 使用只读文件系统
  • 使用 Docker Secrets 加密敏感数据。
  • 应扫描镜像是否存在漏洞。
  • 限制资源使用
  • 监控和日志审计

26. Docker 如何处理数据持久性?

Docker 提供了几种处理数据持久性的方法。

卷 - 由 Docker 管理,容器删除后仍然持久。

  • 绑定挂载 - 将宿主机的文件夹映射到容器中。
  • Tmpfs 挂载(用于临时存储)。

27. 什么是 Docker 命名空间?

Docker 实现命名空间进程隔离。

命名空间类型它隔离什么
PID隔离进程 ID。
NET隔离网络堆栈。
IPC隔离进程间通信方法。
MNT隔离文件系统挂载点。
UTS分离主机名和域设置。

USER 用户的独特标识

示例

(使用宿主机的 PID 命名空间)


28. 解释 Docker cgroups。

控制组(cgroups)限制并监控应用程序的使用:CPU、内存、I/O,命令如下

  • 内存限制 - 限制为 500MB。
  • CPU 限制 - 限制为 1 个核心。

29. 如何管理 Docker 日志?

有一些可能的方法可以帮助我管理 Docker 日志,如下所示:

  • 您有时间戳记录,如下所示:
  • 此驱动程序的日志配置
  • 现在将日志发送到 ELK 或 Fluentd

30. 什么是 Docker 中的 BuildKit?

BuildKit 比 Build 作为一个构建器做得更好,因为它速度快、缓存好、并行执行。要使用 BuildKit,请执行命令行指令 DOCKER_BUILDKIT=1 docker build .。优点包括:构建速度快、并行运行、更好的缓存。


31. 什么是 Docker 插件?

Docker 服务插件的扩展包括但不限于

  • 添加卷插件示例。
  • 列出已安装的插件

32. 如何从 Dockerfile 构建 Docker 镜像?

Dockerfile 是创建 Docker 镜像的指令;要使用 Dockerfile 创建镜像:docker build -t my-image-name。

创建镜像的命令

. (点) 指的是当前目录,它应该包含 Dockerfile。

Dockerfile 示例

Dockerfile 完成以下操作:

  • 将 ubuntu:latest 作为基础镜像。
  • 将 /app 定义为容器的工作目录。
  • 将文件从宿主机复制到容器文件系统。
  • 在容器内安装 curl 命令。
  • 在容器启动时,将回显“Hello, Docker!”。

33. 如何标记 Docker 镜像?

此过程标记镜像以启用版本控制。

示例

这会重命名镜像,以便将其推送到 Docker Hub 等仓库。

要查看所有标记的镜像,请使用命令


34. 如何将镜像推送到 Docker Hub?

在 Docker Hub 上共享镜像的步骤

步骤 1:打开 Docker Hub。

步骤 2:docker login

步骤 3:为 Docker Hub 标记镜像

步骤 4:将镜像推送到 Docker Hub

步骤 5:因此,其他人可以通过以下方式拉取它

docker pull mydockerhubusername/my-image:v1.0


35. 如何删除 Docker 镜像和容器?

我将使用以下命令删除 Docker 镜像和容器

删除所有已停止的容器

删除镜像

删除所有未标记的镜像

查看活动容器


36. docker exec 命令的用途是什么?

使用 docker exec 命令,您可以在已经运行的容器中运行命令。

示例

  • -i(交互式)保持会话打开
  • -t(TTY)能够进行终端仿真
  • bash 在容器内启动 shell

37. 如何在 Docker 中配置资源限制?

Docker 允许您使用资源限制来限制容器的 CPU 和内存使用。您可以使用以下命令在运行容器时设置限制:

  • memory=512m:将容器限制为 512 MB RAM。
  • cpus=1:将容器限制为 1 个 CPU 核心。

列出容器的资源利用率


38. Dockerfile 中的 COPY 和 ADD 有什么区别?

特性COPYADD
函数将文件和目录从宿主机复制到容器复制文件、提取存档和从 URL 下载
语法COPY src destADD src dest
Tar 解压不能是的
远程 URL 支持不能是的

示例

  • COPY
  • COPY myfile.txt /app/
  • ADD archive.tar.gz /app/

39. 如何与其他团队共享 Docker 镜像?

共享 Docker 镜像可以通过多种方式完成

1. 通过 Docker Hub 推送

2. 推送到私有注册表

3. 将镜像保存和加载为 Tar 文件

4. 加载到另一台机器 -

此方法在没有互联网时非常有用。


40. 如何排除失败的 Docker 容器故障?

要排除失败的 Docker 容器故障,我将执行以下步骤

1. 检查容器日志

2. 检查容器

它将显示环境变量、卷挂载和其他网络设置。

3. 检查进程

4. 访问容器 shell

5. 重启容器

6. 用于调试

容器现在以交互方式运行以进行调试。


41. 解释 Docker 的 Overlay Network。

Docker 的 Overlay Network 允许容器相互通信,即使它们设置在不同的主机上。Overlay Network 功能包括

  • 多主机 Docker Swarm 网络
  • 覆盖在物理或虚拟网络上
  • 加密流量用于容器之间的通信

创建覆盖网络

在 Overlay Network 上运行服务

检查网络

用例

Swarm 中有许多节点,因此允许不同机器上的容器像在同一本地网络上一样进行通信。


42. 如何优化 Docker 镜像构建过程?

为了优化 Docker 镜像构建过程,我将遵循以下步骤:

  • 使用多阶段构建,将多个镜像组合在一起以实现最小的镜像。
  • 首选较小的基础镜像(例如,alpine 而非 ubuntu)。
  • 通过组合命令减少分层。例如:RUN apt-get update && apt-get install -y package。
  • 考虑 COPY 和 RUN 操作顺序以及它如何影响 Docker 内置缓存
  • 使用 .dockerignore 文件。它将从构建上下文中排除不必要的文件以加快构建速度。
  • 减少依赖项;清除所有未使用的内容。

43. 如何处理容器化应用程序崩溃?

以下几点将有助于处理容器化应用程序崩溃:

  • 当发生错误时,使用 docker logs 检查日志输出。
  • docker ps -a 的退出代码也可能有助于排除故障。
  • 使用 docker stats 密切关注内存或 CPU 的资源限制。
  • Dockerfile 健康检查 (HEALTHCHECK) 也会有所帮助。
  • 重启策略有助于 --restart=always, --restart=on-failure。
  • 如果您在 Kubernetes 上运行 OEM,请使用存活探测和就绪探测。

44. 将传统应用程序迁移到 Docker 需要采取哪些步骤?

我将遵循以下步骤将传统应用程序迁移到 Docker:

  • 识别应用程序的依赖项和架构。
  • 创建一个 Dockerfile 来容器化应用程序。
  • 重构配置以利用环境变量。
  • 使用多阶段构建优化镜像。
  • 单独容器化数据库和外部服务。
  • 使用 docker-compose 在开发环境中进行测试,并使用 Kubernetes 或 Docker Swarm 部署到生产环境。

45. 如何使用 Docker 实现 CI/CD?

以下是我将使用 Docker 实现 CI/CD 的步骤:

  • 选择合适的 CI/CD 工具,例如 Jenkins、GitHub Actions 或 GitLab CI。
  • 编写 Dockerfile 和 docker-compose.yml 进行容器管理。
  • 调整您的管道,通过使用 docker build -t myapp:latest . 构建 Docker 镜像来自动化构建过程。
  • 最后,将这些镜像推送到 Docker Hub、AWS ECR 甚至 GCR 等注册中心。
  • 在 Kubernetes、Helm 或 Docker Swarm 等编排工具下执行自动化部署。
  • 运行健康检查并实施回滚程序。

46. 如何在 Docker 中安全地处理环境变量?

必须通过 Docker secrets (docker secret create) 在 Swarm 中保守秘密。 .env 文件可以保留环境变量(但不能推送到 Git)。使用 Vault 或 AWS Secrets Manager 等秘密管理工具。环境变量也可以通过 docker run --env-file 安全地传递。不要将敏感信息硬编码到 Dockerfile 中。


47. 如何使用 Docker 部署微服务架构?

我将通过以下步骤使用 Docker 部署微服务架构。

  • 每个微服务都打包在单个容器中。
  • 通过 docker-compose 进行本地开发。
  • 将部署配置到 Kubernetes 以进行扩展和编排。
  • 通过 Kubernetes Ingress 或服务网格 (Istio) 进行服务发现。
  • 使用消息代理 (Kafka, RabbitMQ) 进行通信。
  • 集中式日志记录和监控实施 (ELK, Prometheus)。

48. 如何减小 Docker 镜像大小?

通过以下步骤,我将减小 Docker 镜像大小:

  • 您可以使用基于 Alpine 的镜像,而不是标准的 Node 镜像,例如 node:alpine。
  • 删除所有二进制文件以及所有其他不必要的库和工具。
  • 安装软件包时使用 --no-cache 选项避免缓存,以防止创建临时文件。
  • 应应用预构建以消除构建依赖项。
  • 尽可能扁平化 Dockerfile。

49. 如果 Docker 容器启动失败,您会怎么做?

如果 Docker 容器启动失败,我将考虑以下几点:

  • 参考容器的日志 (docker logs )。
  • 运行 docker inspect 检查容器的设置。
  • 检查端口冲突 (docker ps -a)。
  • 正确设置环境变量。
  • 如果它使用数据库,请确保在容器启动之前启动所有依赖项。

50. 如何监控 Docker 容器性能?

如果需要监控 Docker 容器的性能,我将使用以下方法:

  • 使用 docker stats 实时检查实际的 CPU 和内存使用情况。
  • 根据您的需求使用任何 Docker 日志驱动程序,并将其指向 ELK 或 Fluentd 以发送日志。
  • Prometheus 和 Grafana 用于额外监控。
  • 查看 Kubernetes 的监控(Kube-State-Metrics. cAdvisor)。
  • 可以在使用 Prometheus Alertmanager 或 Datadog 创建的警报上配置警报。