30 个 Docker 面试问题助您在 DevOps 面试中脱颖而出
随着应用容器市场预计将大幅增长(据 451 Research 预测,该市场规模将从 2016 年的 7.62 亿美元增长至 2020 年的 27 亿美元),对容器技能的需求也随之高涨。软件工程师、信息架构师和 DevOps 工程师(使用 Docker)的需求量非常大。
Q1:为什么需要 DevOps?
主题:DevOps
难度:⭐
如今,公司不再发布大量的功能,而是尝试通过一系列发布流程,将一些小功能交付给客户。这样做有很多好处,例如能够快速获得客户反馈、提高软件质量等等,从而提高客户满意度。为了实现这一点,公司需要做到:
- 增加部署频率
- 新产品的失败率较低
- 缩短修复之间的准备时间
- 新版本崩溃时平均恢复时间更快
DevOps 满足了所有这些要求并有助于实现无缝软件交付。
🔗资料来源: edureka.co
问题2:什么是Docker?
主题:Docker
难度:⭐
- Docker 是一个容器化平台,它将您的应用程序及其所有依赖项以容器的形式打包在一起,以确保您的应用程序在任何环境中(无论是开发、测试还是生产)都能无缝运行。
- Docker 容器将软件包装在一个完整的文件系统中,其中包含运行所需的一切:代码、运行时、系统工具、系统库等可以在服务器上安装的任何东西。
- 这保证了软件无论在何种环境下都能始终以相同的方式运行。
🔗资料来源: edureka.co
Q3:DevOps 有哪些优势?
主题:DevOps
难度:⭐⭐
技术优势:
- 持续软件交付
- 需要解决的问题不太复杂
- 更快地解决问题
商业利益:
- 更快地交付功能
- 更稳定的操作环境
- 有更多时间可用于增加价值(而不是修复/维护)
🔗资料来源: edureka.co
Q4:CI(持续集成)服务器的作用是什么?
主题:DevOps
难度:⭐⭐
CI 服务器的功能是持续集成不同开发人员提交到代码库的所有更改,并检查编译错误。它需要每天构建代码多次,最好是在每次提交后构建,以便在发生问题时能够检测到是哪个提交导致了问题。
🔗来源: linoxide.com
Q5:如何使用 Docker 构建与环境无关的系统?
主题:Docker
难度:⭐⭐
有三个主要特点有助于实现这一目标:
- 卷
- 环境变量注入
- 只读文件系统
🔗资料来源: rafalgolarz.com
Q6: Dockerfile 中的COPY
和命令有什么区别?ADD
主题:Docker
难度:⭐⭐
虽然ADD
和COPY
功能相似,但一般来说,COPY
更受欢迎。
这是因为它比 ADD 更透明。COPY 仅支持将本地文件复制到容器的基本操作,而 ADD 有一些不太明显的功能(例如仅限本地的 tar 提取和远程 URL 支持)。因此,ADD 的最佳用途是将本地 tar 文件自动提取到镜像中,例如 ADD rootfs.tar.xz /。
🔗来源: stackoverflow.com
Q7:什么是Docker镜像?
主题:Docker
难度:⭐⭐
Docker 镜像是 Docker 容器的来源。换句话说,Docker 镜像用于创建容器。镜像使用 build 命令创建,并使用 run 命令启动时生成一个容器。镜像存储在 Docker 镜像仓库中,由于registry.hub.docker.com
镜像可能变得非常大,因此镜像被设计为由多层镜像组成,以便在通过网络传输镜像时最大程度地减少数据发送量。
🔗资料来源: edureka.co
Q8:什么是Docker容器?
主题:Docker
难度:⭐⭐
Docker 容器包含应用程序及其所有依赖项,但与其他容器共享内核,在主机操作系统的用户空间中作为独立进程运行。Docker 容器不依赖于任何特定的基础架构:它们可以在任何计算机、任何基础架构和任何云环境中运行。
🔗资料来源: edureka.co
Q9:什么是Docker hub?
主题:Docker
难度:⭐⭐
Docker Hub是一项基于云的镜像注册服务,它允许您链接到代码仓库、构建并测试镜像、存储手动推送的镜像以及链接到 Docker 云,以便您可以将镜像部署到主机。它为整个开发流程中的容器镜像发现、分发和变更管理、用户和团队协作以及工作流自动化提供了一个集中式资源。
🔗资料来源: edureka.co
Q10:在任何给定时间点,Docker 容器可以处于哪些不同状态?
主题:Docker
难度:⭐⭐
在任何给定时间点,Docker 容器可以处于四种状态。这些状态如下:
- 跑步
- 已暂停
- 重启
- 已退出
🔗资料来源: mindmajix.com
Q11:有没有办法识别Docker容器的状态?
主题:Docker
难度:⭐⭐
我们可以通过运行以下命令来识别 Docker 容器的状态
docker ps –a
它会列出主机上所有可用的 Docker 容器及其对应的状态。这样我们就可以轻松找到所需的容器,并检查其相应的状态。
🔗资料来源: mindmajix.com
Q12:Dockerfile中最常用的指令有哪些?
主题:Docker
难度:⭐⭐
Dockerfile中一些常用的指令如下:
- FROM:我们使用 FROM 来设置后续指令所需的基础镜像。在每个有效的 Dockerfile 中,FROM 都是第一条指令。
- LABEL:我们使用 LABEL 来按项目、模块、许可等来组织镜像。我们也可以使用 LABEL 来实现自动化。在 LABEL 中,我们指定一个键值对,以便以后以编程方式处理 Dockerfile。
- RUN:我们使用 RUN 命令在当前镜像之上的新层中执行任何指令。每次使用 RUN 命令时,我们都会在镜像之上添加一些内容,并在 Dockerfile 的后续步骤中使用它。
- CMD:我们使用 CMD 命令来提供正在执行的容器的默认值。在 Dockerfile 中,如果我们包含多个 CMD 命令,则仅使用最后一条指令。
🔗资料来源: knowledgepowerhouse.com
Q13:什么类型的应用程序 - 无状态或有状态更适合 Docker 容器?
主题:Docker
难度:⭐⭐
为 Docker 容器创建无状态应用程序是更好的选择。我们可以从应用程序中创建一个容器,并从应用程序中取出可配置的状态参数。这样,我们就可以在生产环境和 QA 环境中以不同的参数运行同一个容器。这有助于在不同场景中重用同一个镜像。此外,与有状态应用程序相比,无状态应用程序更容易通过 Docker 容器进行扩展。
🔗资料来源: mindmajix.com
Q14:解释基本的 Docker 使用工作流程
主题:Docker
难度:⭐⭐⭐
- 一切从Dockerfile开始。Dockerfile 是镜像的源代码。
- Dockerfile 创建完成后,即可构建它来创建容器的镜像。镜像只是 Dockerfile 的“源代码”的“编译版本”。
- 获得容器镜像后,您应该使用registry重新分发它。registry 就像一个 git 仓库——您可以推送和拉取镜像。
- 接下来,您可以使用该镜像来运行容器。正在运行的容器在很多方面与虚拟机非常相似(但没有虚拟机管理程序)。
+------------+ docker build +--------------+ docker run -dt +-----------+ docker exec -it +------+
| Dockerfile | --------------> | Image | ---------------> | Container | -----------------> | Bash |
+------------+ +--------------+ +-----------+ +------+
^
| docker pull
|
+--------------+
| Registry |
+--------------+
🔗来源: stackoverflow.com
Q15:Docker Image 和 Layer 有什么区别?
主题:Docker
难度:⭐⭐⭐
- 镜像:Docker 镜像由一系列只读层构建而成
- 层:每一层代表镜像的 Dockerfile 中的一条指令。
下面的 Dockerfile 包含四个命令,每个命令创建一个层。
FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py
重要的是,每一层都与前一层只有一组差异。
🔗来源: stackoverflow.com
Q16:什么是虚拟化?
主题:Docker
难度:⭐⭐⭐
虚拟化最初被认为是一种逻辑划分大型机以允许多个应用程序同时运行的方法。然而,当企业和开源社区能够以某种方式提供处理特权指令的方法,并允许在单个 x86 系统上同时运行多个操作系统时,情况发生了巨大的变化。
虚拟化的最终效果是,它允许你在同一硬件上运行两个完全不同的操作系统。每个客户操作系统都要经历引导、加载内核等所有过程。这样可以实现非常严格的安全性,例如,客户操作系统无法完全访问主机操作系统或其他客户操作系统,从而造成混乱。
虚拟化方法可以根据其如何将硬件模拟到客户操作系统以及模拟客户操作环境进行分类。虚拟化主要有三种类型:
- 仿真
- 半虚拟化
- 基于容器的虚拟化
🔗来源: stackoverflow.com
Q17:什么是 Hypervisor?
主题:Docker
难度:⭐⭐⭐
虚拟机管理程序负责创建客户虚拟机在其上运行的虚拟环境。它负责监控客户系统,并确保根据需要为客户系统分配资源。虚拟机管理程序位于物理机和虚拟机之间,并为虚拟机提供虚拟化服务。为了实现这一点,它会拦截虚拟机上的客户操作系统操作,并在主机操作系统上模拟这些操作。
虚拟化技术(主要在云计算领域)的快速发展进一步推动了虚拟化的使用,允许在虚拟机管理程序(例如 Xen、VMware Player、KVM 等)的帮助下在单个物理服务器上创建多个虚拟服务器,并在商用处理器(例如 Intel VT 和 AMD-V)中加入硬件支持。
🔗来源: stackoverflow.com
Q18:什么是 Docker Swarm?
主题:Docker
难度:⭐⭐⭐
Docker Swarm是 Docker 的原生集群工具。它将 Docker 主机池转换为单个虚拟 Docker 主机。Docker Swarm 提供标准 Docker API,任何已与 Docker 守护进程通信的工具都可以使用 Swarm 透明地扩展到多个主机。
🔗资料来源: edureka.co
Q19:您将如何在生产中监控 Docker?
主题:Docker
难度:⭐⭐⭐
Docker 提供了 docker stats 和 docker events 等工具来监控生产环境中的 Docker。我们可以使用这些命令获取重要统计信息的报告。
- Docker stats:当我们使用容器 ID 调用 docker stats 时,我们会获取容器的 CPU、内存使用情况等。它类似于 Linux 中的 top 命令。
- Docker 事件:Docker 事件是一个命令,用于查看 Docker 守护进程中正在进行的活动流。
一些常见的 Docker 事件有:attach、commit、die、detach、rename、destroy 等。我们还可以使用各种选项来限制或过滤我们感兴趣的事件。
🔗资料来源: knowledgepowerhouse.com
问题 20:什么是孤立卷以及如何删除它?
主题:Docker
难度:⭐⭐⭐⭐
孤立卷是指未附加任何容器的卷。在 Docker 1.9 之前的版本中,删除孤立卷非常麻烦。
🔗资料来源: rafalgolarz.com
Q21:什么是半虚拟化?
主题:Docker
难度:⭐⭐⭐⭐
半虚拟化(也称为 1 型虚拟机管理程序)直接在硬件或“裸机”上运行,并直接向其上运行的虚拟机提供虚拟化服务。它帮助操作系统、虚拟化硬件和真实硬件协作以实现最佳性能。这些虚拟机管理程序通常占用空间较小,并且本身不需要大量资源。
此类别的示例包括 Xen、KVM 等。
🔗来源: stackoverflow.com
Q22:Docker与虚拟机有何不同?
主题:Docker
难度:⭐⭐⭐⭐
Docker 并非一种虚拟化方法。它依赖于其他工具来实现基于容器的虚拟化或操作系统级虚拟化。为此,Docker 最初使用 LXC 驱动程序,后来迁移到libcontainer
现在更名为 的版本runc
。Docker 主要专注于在应用程序容器内自动部署应用程序。应用程序容器旨在打包和运行单个服务,而系统容器则旨在运行多个进程,就像虚拟机一样。因此,Docker 被视为容器化系统上的容器管理或应用程序部署工具。
- 与虚拟机不同,容器无需启动操作系统内核,因此可以在不到一秒的时间内创建容器。这一特性使得基于容器的虚拟化相较于其他虚拟化方法而言独一无二,且更具吸引力。
- 由于基于容器的虚拟化几乎不会给主机增加任何开销,因此基于容器的虚拟化具有接近原生的性能
- 对于基于容器的虚拟化,与其他虚拟化不同,不需要额外的软件。
- 主机上的所有容器共享主机的调度程序,从而节省了额外资源的需求。
- 容器状态(Docker 或 LXC 镜像)与虚拟机镜像相比体积较小,因此容器镜像易于分发。
- 容器中的资源管理是通过 cgroup 实现的。cgroup 不允许容器消耗超过分配给它们的资源。然而,目前为止,所有主机资源在虚拟机中都是可见的,但无法使用。这可以通过同时在容器和主机上运行 top 或 htop 来实现。所有环境中的输出看起来都类似。
🔗来源: stackoverflow.com
Q23:您能解释一下 dockerfile ONBUILD 指令吗?
主题:Docker
难度:⭐⭐⭐⭐
该ONBUILD
指令会向镜像添加一个触发指令,该指令稍后在镜像用作其他构建的基础时执行。如果您要构建一个镜像,并将其用作构建其他镜像的基础,例如应用程序构建环境或可使用用户特定配置自定义的守护进程,则此功能非常有用。
🔗来源: stackoverflow.com
问题 24:在 Docker 上运行有状态应用程序是一种好习惯吗?Docker 最适合哪些场景?
主题:Docker
难度:⭐⭐⭐⭐
有状态 Docker 应用程序的问题在于,它们默认将状态(数据)存储在容器文件系统中。一旦更新软件版本或想要迁移到另一台机器,就很难从那里检索数据。
您需要做的是将卷绑定到容器并将任何数据存储在卷中。
如果您使用以下命令运行容器:docker run -v hostFolder:/containerfolder
对 的任何更改/containerfolder
都将持久保存在 上hostfolder
。使用 NFS 驱动器也可以实现类似的操作。这样,您就可以在任何主机上运行应用程序,状态将保存在 NFS 驱动器中。
🔗来源: stackoverflow.com
Q25:您可以在 Windows 上原生运行 Docker 容器吗?
主题:Docker
难度:⭐⭐⭐⭐
使用 Windows Server 2016,您可以在 Windows 上原生运行 Docker 容器,而使用 Windows Nano Server,您将拥有一个在容器内运行的轻量级操作系统,因此您可以在其原生平台上运行 .NET 应用程序。
🔗资料来源: rafalgolarz.com
Q26:Docker 如何在非 Linux 系统上运行容器?
主题:Docker
难度:⭐⭐⭐⭐⭐
Linux 内核 2.6.24 版新增的命名空间功能使容器的概念得以实现。容器为每个进程添加其 ID,并为每个系统调用添加新的访问控制检查。容器可以通过 clone() 系统调用访问,该调用允许创建先前全局命名空间的独立实例。
如果容器的实现是因为 Linux 内核的功能,那么显而易见的问题是非 Linux 系统如何运行容器。Mac 和 Windows 版 Docker 都使用Linux 虚拟机来运行容器。Docker Toolbox 过去通常在 Virtual Box 虚拟机中运行容器。但最新的 Docker 在 Windows 中使用 Hyper-V,在 Mac 中使用 Hypervisor.framework。
🔗来源: stackoverflow.com
Q27:容器在低层如何工作?
主题:Docker
难度:⭐⭐⭐⭐⭐
大约在 2006 年,包括部分 Google 员工在内的一些人实现了 Linux 内核级新功能,称为命名空间(然而这个想法早在 FreeBSD 中就已存在)。该操作系统的一项功能是允许进程共享网络和磁盘等全局资源。如果将这些全局资源封装在命名空间中,使其仅对在同一命名空间中运行的进程可见,会怎么样?假设您可以获取一块磁盘空间并将其放在命名空间 X 中,那么在命名空间 Y 中运行的进程将无法查看或访问它。同样,命名空间 X 中的进程也无法访问分配给命名空间 Y 的内存中的任何内容。当然,X 中的进程也无法查看或与命名空间 Y 中的进程通信。这为全局资源提供了某种虚拟化和隔离。
Docker 的工作原理如下:每个容器在自己的命名空间中运行,但使用与所有其他容器完全相同的内核。之所以能实现隔离,是因为内核知道分配给进程的命名空间,并且在 API 调用期间,它确保进程只能访问其自身命名空间中的资源。
🔗来源: stackoverflow.com
Q28:列举一些容器与虚拟机的局限性
主题:Docker
难度:⭐⭐⭐⭐⭐
仅举几个例子:
- 您无法像在虚拟机中那样在容器中运行完全不同的操作系统。但是,您可以运行不同的 Linux 发行版,因为它们共享相同的内核。隔离级别不如虚拟机那么强。事实上,在早期实现中,有一种让“客户”容器接管主机的方法。
- 您还可以看到,当您加载新容器时,整个新操作系统副本不会像在虚拟机中那样启动。
- 所有容器共享同一个内核。这就是容器轻量级的原因。
- 另外,与虚拟机不同的是,由于我们运行的不是新的操作系统副本,因此无需为容器预先分配大量内存。这使得我们能够在一个操作系统上运行数千个容器,同时对它们进行沙盒化处理。如果我们在单独的虚拟机中运行单独的操作系统副本,则可能无法做到这一点。
🔗来源: stackoverflow.com
Q29:如何在多种环境下使用 Docker?
主题:Docker
难度:⭐⭐⭐⭐⭐
您几乎肯定会希望对应用配置进行一些更适合实际环境的更改。这些更改可能包括:
- 删除应用程序代码的所有卷绑定,以便代码保留在容器内,并且不能从外部更改
- 绑定到主机上的不同端口
- 以不同的方式设置环境变量(例如,减少日志记录的详细程度,或启用电子邮件发送)
- 指定重启策略(例如,restart: always)以避免停机
- 添加额外服务(例如日志聚合器)
因此,您可能需要定义一个额外的 Compose 文件,例如production.yml
,用于指定适合生产的配置。此配置文件只需包含您希望对原始 Compose 文件进行的更改。
docker-compose -f docker-com
🔗来源: stackoverflow.com
Q30:为什么 Docker Compose 不等待容器准备好就按照依赖顺序启动下一个服务?
主题:Docker
难度:⭐⭐⭐⭐⭐
depends_on
Compose 始终按照依赖顺序启动和停止容器,其中依赖关系由、、和:“service:...”links
确定。volumes_from
network_mode
但是,Compose 的启动并不会等到容器“就绪”(无论这对于你的特定应用意味着什么),而是会等到它运行起来。这样做有一个很好的理由:
- 例如,等待数据库准备就绪的问题实际上只是分布式系统更大问题的一个子集。在生产环境中,数据库可能随时不可用或迁移到其他主机。您的应用程序需要具备应对此类故障的弹性。
- 为了解决这个问题,请将应用程序设计为在发生故障后尝试重新建立与数据库的连接。如果应用程序重试连接,它最终可以连接到数据库。
- 最好的解决方案是在应用程序代码中执行此检查,无论是在启动时还是由于任何原因丢失连接时。
🔗来源: docs.docker.com
文章来源:https://dev.to/fullstackcafe/30-docker-interview-questions-to-ace-devops-engineer-interview-2277感谢🙌的阅读,祝你面试顺利!
如果喜欢,请分享给你的开发者同事!
更多 FullStack 面试问答,请访问👉 www.fullstack.cafe