什么是 Docker?
Docker 是一个容器平台,开发者可用它将应用及其所有依赖打包,从而保证在不同环境中都能顺畅运行。
尽管容器共享同一操作系统内核,但每个容器都在各自的隔离环境中运行。这样的设置能最大限度减少兼容性问题、降低延迟,并改善开发、测试与运维团队之间的协作。

Docker 标志。图片来源
在 2023 年,Docker 以超过 32% 的份额引领容器化市场。这凸显了它在现代软件开发中的重要性!因此,在与数据相关的岗位面试中,您很可能会被考察 Docker 专业能力。
基础 Docker 面试题
首先,先熟悉一些基础的 Docker 概念。这些入门问题将帮助您建立理解,并为面试的初始阶段做好准备。
1. 什么是 Docker 镜像?
Docker 镜像就像创建容器的蓝图。它包含运行应用所需的一切,例如:
- 代码
- 库
- 配置
当您使用 Docker 镜像时,Docker 会将其转化为容器,即一个完全隔离的环境。应用就在其中独立运行。
2. 什么是 Docker 主机?
Docker 主机是安装 Docker 的系统。它是运行并管理 Docker 容器的主要环境。我们可以在本地设备、虚拟环境或云环境中搭建 Docker 主机。
3. Docker 客户端与 Docker 守护进程有何不同?能举个例子吗?
Docker 客户端与 Docker 守护进程并行工作,但职责不同。Docker 客户端是发送命令的工具,Docker 守护进程是执行这些命令的引擎。
例如,当我们输入 docker run 命令启动容器时,客户端会接收请求并将其发送给 Docker 守护进程,随后守护进程会执行实际工作来启动容器。
4. 您能解释一下 Docker 网络是什么吗?创建 bridge 和 overlay 网络分别用哪些命令?
Docker 网络允许容器与其他容器以及主机进行连接与通信。我们可以使用 docker network create 命令来创建用户定义的网络。
- Bridge 网络:为同一 Docker 主机上的容器间通信创建本地网络。
- 命令:
docker network create -d bridge my-bridge-network - 这会为同一主机上的容器创建名为
my-bridge-network的 bridge 网络。 - Overlay 网络:支持跨多个 Docker 主机的容器通信,通常用于 Swarm 场景。
- 命令:
docker network create --scope=swarm --attachable -d overlay my-multihost-network - 这会创建一个可附加的 overlay 网络
my-multihost-network,供 Docker Swarm 中运行在不同主机上的容器使用。
5. 解释一下 Docker bridge 网络的工作原理。
Bridge 网络是 Docker 连接容器时的默认设置。如果我们不指定网络,Docker 会将其连接到默认的 bridge 网络。该桥接网络连接同一 Docker 主机上的所有容器。每个容器都有唯一的 IP 地址,从而容器之间可以直接通信。
中级 Docker 面试题
这些问题用于考察您对 Docker 中级概念的掌握情况。
6. 什么是 Dockerfile?请说明如何编写。
Dockerfile 是定义构建 Docker 镜像指令的脚本。Dockerfile 中的每条命令都会设置环境中的某个部分。当我们运行这些命令时,Docker 会逐层构建镜像。编写步骤如下:
- 首先选择一个基础镜像,包含应用所需的基本工具。
- 其次在容器内指定工作目录,应用文件会在此处存放并运行。
- 第三步,使用
COPY . .将项目文件复制到容器的工作目录。 - 使用
RUN命令安装依赖。 - 使用
EXPOSE命令指定应用运行的端口。 - 最后定义 Docker 启动容器时应执行的命令。
以下是一个用于 Python Web 应用的简单 Dockerfile 示例:
# Step 1: Choose a base image
FROM python:3.9-slim
# Step 2: Specify the working directory
WORKDIR /app
# Step 3: Copy project files into the container
COPY . .
# Step 4: Install dependencies
RUN pip install -r requirements.txt
# Step 5: Expose the port the app runs on
EXPOSE 5000
# Step 6: Define the default command
CMD ["python", "app.py"]
使用上述 Dockerfile,您可以通过 docker build -t my-python-app . 构建镜像,并使用 docker run -p 5000:5000 my-python-app 运行容器。
7. 什么是 Docker Compose?它与 Dockerfile 有何不同?
Docker Compose 是一个使用 YAML 文件(docker-compose.yml)来定义并管理多容器应用的工具。它允许我们在单个文件中配置服务、网络和数据卷,从而更轻松地管理复杂应用。
与 Dockerfile 的区别:
- Dockerfile 用于通过定义镜像的各层与依赖来构建单个 Docker 镜像。
- Docker Compose 用于运行并编排多个彼此依赖的容器(例如 Web 应用容器与数据库容器)。
例如,一个 docker-compose.yml 文件可能如下:
version: '3.9'
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
db:
image: postgres
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
该文件定义了两个服务:web 和 db,并配置了网络与数据卷。
8. 为什么在 Docker 中要使用数据卷?
我们使用 Docker 数据卷来将数据保存在容器之外。它们在主机上提供独立的位置,即使容器被删除数据仍然存在。此外,数据卷更易于管理、备份,并可在多个容器之间共享。
9. 什么是 Docker 绑定挂载(bind mounts)?为什么更倾向于使用数据卷而非绑定挂载?
通过 Docker 绑定挂载,我们可以在主机与容器之间共享文件。它把主机系统中的某个特定文件(或目录)映射到容器中的位置。对这些文件的任何更改都会即时反映到容器中。
绑定挂载适合实时文件共享,但它依赖主机操作系统,存在安全隐患。
相对而言,Docker 数据卷独立于主机文件系统,因此比挂载更安全。

Docker 绑定挂载与数据卷示意图。图片来源:Docker
10. 什么是 Docker Swarm?
Docker Swarm 是一个容器编排工具,用于在一组 Docker 节点的集群上管理与部署服务。它提供高可用性、可扩展性与负载均衡,使多个主机可作为一个虚拟的 Docker 引擎对外工作。
11. 我们能为 Docker Swarm 实现自动扩缩吗?
不能,Docker Swarm 并不原生支持自动扩缩。要实现这一点,我们需要集成监控工具并使用脚本手动调整实例数量。步骤如下:
- 安装监控工具,如 Prometheus 或 Grafana,用于跟踪 CPU、内存等资源使用情况。
- 设置扩缩触发器。例如,我们可以定义 CPU 使用率超过 82% 时触发扩容。
- 然后编写脚本,使用
docker service scale命令调整副本数。例如,将某服务扩容到 5 个副本:docker service scale <service_name>=5
通过将监控工具、触发条件与脚本结合起来,即使没有内置支持,您也可以在 Docker Swarm 中实现一定程度的自动扩缩。
12. 如何使用 Docker Compose 对服务进行扩缩?
要使用 Docker Compose 扩缩服务,我们可以在 docker-compose up 命令中使用 --scale 标志。此方法通常用于无状态服务(如 Web 服务器)。例如,将 web 服务扩容为 3 个实例:
docker-compose up --scale web=3
需要确保 docker-compose.yml 中的服务定义正确,并使用外部负载均衡或支持多实例的配置。对有状态服务(如数据库)进行扩缩还需额外配置以确保数据一致性。
13. 容器能否自行重启?请定义其 no(默认)与 always 策略。
可以,但需要设置重启策略。
Docker 提供多种重启策略来控制容器何时、如何重启。默认策略为 no,即容器停止后不会重启。使用 always 策略时,容器一旦停止,Docker 会自动重启它。
我们可以使用以下命令应用 always 策略:
docker run --restart=always <container-name>
高级 Docker 面试题
现在,让我们进入高级 Docker 面试题!
14. 解释 Docker 容器的生命周期。
Docker 容器会经历一系列状态,它们定义了容器可能处于的阶段以及各阶段的运行方式。容器生命周期的阶段包括:
- 创建(Create):通过
docker create命令从镜像创建容器。 - 运行(Run):使用
docker start启动容器,直至我们停止或暂停它。 - 暂停(Pause):使用
docker pause暂停进程。该状态下内存与磁盘保持不变。若要恢复,使用docker unpause。 - 停止(Stop):容器不活动时进入停止阶段,但可能由多种原因导致:
- 立即停止:
docker kill命令会直接停止容器而不进行清理。 - 进程完成:容器完成任务后会自动停止。
- 内存不足:当容器占用过多内存时会被停止。
- 删除(Delete):最后,我们通过
docker rm删除已停止或仅创建的容器。
15. 什么是 Docker 镜像仓库?
Docker 镜像仓库存储并共享同名的多个容器镜像给客户或社区。我们可以使用标签来区分不同版本。例如,app/marketing_campaign:v1 表示营销应用的第一个版本,app/marketing_campaign:v2 表示第二个版本。
Docker Hub 是最流行的 Docker 镜像仓库,允许用户公开或私下托管、分享与拉取镜像。其他选择包括 Amazon ECR、Google Artifact Registry 和 GitHub Container Registry。
16. 说说保持 Docker 容器安全的 3 个最佳实践。
为增强容器安全并降低常见漏洞风险,我遵循以下做法:
- 选择轻量镜像:使用如 Alpine 这类最小化基础镜像,减少攻击面。
- 限制系统调用:由于容器可能访问不必要的系统调用,使用 Seccomp 等工具加以限制。
- 保护敏感数据:使用 Docker secrets 管理 API 密钥或密码。它们会加密秘密,并仅在运行时可用。
17. 为什么 Docker 容器需要健康检查?
Docker 容器依赖健康检查来确保其正常运行。若容器虽然处于运行状态却无法处理请求,会给部署带来问题。健康检查可实时监控并即时告警。
例如,可以在 Dockerfile 中这样添加健康检查:
HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD curl -f http://localhost:8080/health || exit 1
该健康检查每 30 秒探测一次容器的健康端点,若连续三次失败则将容器标记为不健康。这样的主动监控有助于及时发现并解决问题。
18. 什么是 Docker 中的悬空镜像(dangling images)?如何清理?
悬空镜像是指不再有任何标签关联的未使用镜像层。它们常在以相同名称与标签创建新镜像时产生,旧层失去引用。这些镜像会占用大量磁盘空间,因此需要清理。方法如下:
- 运行
docker images -f dangling=true查找悬空镜像。 - 然后运行
docker image prune -f一次性删除所有此类镜像。 - 如需手动删除,可用
docker rmi -f $(docker images -f dangling=true -q)。
这些步骤可帮助您高效清理系统并释放存储空间。
Docker 与 Kubernetes 面试题
Docker 与 Kubernetes 经常搭配使用,因此在 Docker 面试中遇到一些 Kubernetes 相关问题并不意外,尤其当岗位偏向 DevOps 时。以下是一些可能被问到的问题:
19. Docker 与 Kubernetes 的主要区别是什么?
Docker 是一个容器化平台,用于构建、分发与运行容器,重点在于创建与管理单个容器。而 Kubernetes 是一个编排平台,旨在大规模管理多个容器,负责在节点集群上进行部署、扩缩、负载均衡与自我修复。
想了解更多差异,请参阅 Kubernetes 与 Docker 对比 博文。
20. 对比 Docker Swarm 与 Kubernetes。
Kubernetes 与 Docker Swarm 都用于管理容器,但工作方式不同:
- Kubernetes 更擅长管理大型且复杂的容器环境。其自我修复与内置监控功能使其更适合复杂场景。
- Docker Swarm 适用于规模较小或不太复杂的场景,因为它不像 Kubernetes 那样提供众多内置特性。但它能轻松与 Docker CLI、Docker Compose 等工具集成。
21. Kubernetes 如何管理大量 Docker 容器?
Docker 擅长创建与运行容器,但要管理大量容器则需要 Kubernetes。Kubernetes 通过以下方式高效编排容器:
- 设置资源限制:为每个容器分配 CPU、内存等资源,防止资源过度消耗。
- 调度容器:决定每个容器在何处运行,优化集群节点间的资源利用率。
- 自动扩缩:根据负载需求对 Pod(一个或多个容器的集合)进行扩容或缩容,以保持性能与效率。
通过自动化以上流程,Kubernetes 即使在管理成千上万个容器时也能确保平稳运行。尽管偶有错误发生,其自我修复能力(如重启失败容器)可将中断降至最低。
22. Kubernetes 中的 Pod 是什么?它与容器有何不同?
Pod 是 Kubernetes 中最小的可部署单元,表示一个或多个共享同一网络命名空间、存储与配置的容器集合。与单个容器不同,Pod 允许多个紧密耦合的容器作为一个整体协同工作(例如 Web 服务器与日志 sidecar 容器)。

Kubernetes 节点概览,突出显示 Pod 与容器。图片来源:Kubernetes。
23. 如何在 Docker 与 Kubernetes 中管理诸如密码之类的敏感数据?
- 在 Docker 中: 我们可以使用 Docker secrets,对敏感数据进行加密,并仅在运行时向授权容器提供。
- 在 Kubernetes 中: 我们使用 Secrets 对象存储密码、令牌与 API 密钥等敏感数据。Secrets 可作为数据卷挂载或以环境变量方式安全地暴露给 Pod。
Kubernetes 示例:
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
password: cGFzc3dvcmQ= # Base64-encoded "password"
基于场景的 Docker 面试题
面试官会通过情景与问题求解类问题,考察您处理真实问题的思路。下面这些问题可供参考:
24. 设想您在为一个基于 Maven 的 API 创建镜像。您已用基础配置搭建了 Dockerfile,但发现镜像体积很大。您会如何减小?
示例答案:
要减小基于 Maven 的 API 的 Docker 镜像体积,我会采取以下步骤:
在项目目录创建 .dockerignore,指定不应包含在 Docker 构建上下文中的文件与文件夹,避免将无关内容加入镜像,从而减小体积。例如,我会在 .dockerignore 中添加:
.git # Version control files
target # Compiled code and build artifacts
.idea # IDE configuration files
使用多阶段构建优化 Dockerfile。在第一阶段构建 Maven 项目,仅将必要的制品(如已编译的 JAR)复制到最终阶段,从而保持镜像精简。多阶段构建示例:
# Stage 1: Build the application
FROM maven:3.8.5-openjdk-11 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package
# Stage 2: Create a lightweight runtime image
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=build /app/target/my-api.jar .
CMD ["java", "-jar", "my-api.jar"]
通过忽略无关文件并采用多阶段构建,可以在保持效率的同时显著减小镜像体积。
25. 设想您需要使用 Jenkins 将 Docker 容器镜像推送到 Docker Hub。您会如何操作?
示例答案:
我会按如下步骤使用 Jenkins 将 Docker 镜像推送到 Docker Hub:
- 配置 Jenkins 流水线:在 Jenkins 中创建多分支流水线任务,并关联包含 Dockerfile 与 Jenkinsfile 的代码库。
- 在 Jenkinsfile 中定义流水线:
Jenkinsfile包含以下步骤: - 构建 Docker 镜像
- 登录 Docker Hub(使用安全存储在 Jenkins 中的凭据)
- 将镜像推送至 Docker Hub
- 运行流水线:触发 Jenkins 任务,自动完成构建、登录与推送。
26. 设想您需要将一个 WordPress 的 Docker 容器迁移到新服务器,并且不能丢失任何数据。您会如何做?
示例答案:
我的迁移步骤如下:
- 备份 WordPress 数据:导出容器的持久化数据(WordPress 文件与数据库)。我会使用
docker cp或数据卷备份工具来备份相应数据卷,通常包括 WordPress 文件的html目录和数据库数据卷。 - 传输备份文件:我会使用
scp将备份文件安全地复制到新服务器。 - 在新服务器上搭建 WordPress:在新服务器上部署新的 WordPress 容器与数据库容器。
- 重启并验证:最后重启容器以应用更改,并验证 WordPress 站点是否正常运行。
通过备份数据卷并在新服务器上恢复,您可以不丢失数据地迁移 WordPress。该方法不依赖特定扩展,且对迁移过程有更强的掌控。
Docker 面试备考建议
既然您在阅读本指南,说明您已经迈出了在面试中脱颖而出的重要一步!但对完全初学者而言,备考可能会让人无所适从。因此,我整理了以下建议:
夯实 Docker 基础
要在 Docker 面试中表现出色,请从扎实掌握其核心概念开始。
- 了解 Docker 镜像如何作为容器的蓝图,并通过实践创建、运行、管理容器,熟悉其轻量且隔离的运行环境。
- 探索 Docker 数据卷以有效管理持久化数据,深入网络配置,体验 bridge、host 与 overlay 网络,掌握容器通信。
- 学习 Dockerfile,理解镜像的构建过程,关注
FROM、RUN、CMD等关键指令。 - 同时动手使用 Docker Compose 管理多容器应用,了解 Docker Hub 等镜像仓库如何存储与分享镜像。
DataCamp 还提供了大量资源,陪伴您的学习之旅:
- Docker 入门概念: Introduction to Docker 课程
- Docker 中级概念: Intermediate Docker 课程
- 学习容器化与虚拟化:Containerization and Virtualization Concepts 课程
积累 Docker 实战经验
当您掌握了 Docker 的核心主题,就该通过实践挑战自己了。这里有适合初学者与进阶者的 10 个优秀 Docker 项目创意。在做项目时,善用 DataCamp 的 Docker 速查表,随时查阅关键命令。
记录您的实践经历
在面试中准备好讲述您的 Docker 实战经验。请准备以下方面的示例:
- 项目:突出您构建或参与的容器化应用。
- 挑战:描述您遇到的问题(如调试容器或优化镜像)以及解决方法。
- 优化:分享您如何通过多阶段构建、Docker 网络工具或 Docker Compose 改善构建时间、减小镜像体积、简化流程。
- 协作:如您在团队中工作,说明如何借助 Docker 提升协作、测试或部署流程。
真实案例能充分展现您的实践能力与问题解决能力!
结语
在备考面试时,请记住这些问题只是起点。记忆答案固然有用,但面试官更看重能展现实践经验与对容器化概念的深入理解的候选人。请务必在真实场景中练习这些概念,并动手搭建项目。
如果您是初学者,可从我们的 Introduction to Docker 课程 开始。最终,面试成功源自理论知识、实操经验与清晰表达问题解决思路的综合能力!
FAQs
使用 Docker 是否需要学习 Kubernetes?
不需要。使用 Docker 并不要求学习 Kubernetes。二者的职责完全不同。Docker 用于在单机上构建、运行与管理容器。
Docker 需要会编程吗?
不需要编程技能即可使用 Docker。掌握命令行基础、YAML 文件以及阅读 Docker 文档,已足以完成大多数任务。但您需要了解 Linux 命令与网络的基本原理。
准备 Docker 面试需要多长时间?
若全身心投入,准备一场 Docker 面试大约需要 3 到 4 周。至少用一周时间打好 Docker 基础,然后学习 Docker Compose 与多容器架构。最后两周聚焦多阶段构建与容器优化。同时,用真实案例构建您的作品集。
我是内容策略专家,热衷于将复杂主题化繁为简。我曾帮助 Splunk、Hackernoon 和 Tiiny Host 等公司为其受众打造兼具吸引力与信息量的内容。

Docker 已成为现代软件开发中最流行的容器化工具,尤其常见于 DevOps 和 CI/CD 工作流。它通过容器简化了应用的部署与管理,使软件能够快速且一致地交付。
凭借其可扩展性与灵活性,Docker 几乎是与数据相关岗位(如 数据工程、MLOps 乃至数据科学)不可或缺的技能。因此,我整理了常见的 Docker 面试问题,涵盖核心概念与真实场景。