Docker面试题笔记整理(问题和答案解析)

Docker 简介:
Docker 是一个非常流行且功能强大的开源容器化平台,用于构建、部署和运行应用程序。Docker 允许你将应用程序/软件与底层基础设施分离。

什么是容器?
容器是与依赖项捆绑在一起的标准软件单元,因此可以在不同的计算平台上快速可靠地部署应用程序。

  • Docker 可以被想象成一艘大船(docker),承载着巨大的产品箱(容器)。
  • Docker 容器不需要安装单独的操作系统。Docker 只是依赖或利用内核的资源及其功能来为 CPU 和内存分配它们,它依赖于内核的功能并使用 CPU 和内存的资源隔离,以及单独的命名空间来隔离应用程序对操作系统(操作系统)的看法)。
为什么要学习 Docker?
应用程序开发不仅仅是编写代码!它们涉及许多幕后的事情,例如在其生命周期的每个阶段使用多个框架和架构,这使得过程更加复杂和具有挑战性。使用容器化的特性可以帮助开发人员简化并有效地加速应用程序工作流程,同时让他们可以自由地使用自己选择的技术和开发环境进行开发。
  • 所有这些方面构成了 DevOps 的核心部分,对于任何开发人员来说,了解这些对于提高生产力、加快开发速度以及牢记应用程序可扩展性和更有效的资源管理等因素变得更加重要。
  • 将容器想象成一个非常轻量级的预安装盒子,其中包含应用程序所需的所有包、依赖项和软件,只需进行最少的配置更改即可部署到生产环境中。
  • 许多公司,如 PayPal、Spotify、Uber 等,都使用 Docker 来简化操作,并使基础设施和安全性更接近,以制作更安全的应用程序。
  • 由于具有可移植性,容器可以根据规模或所需平台的要求部署在多个平台上,如裸实例、虚拟机、Kubernetes 平台等。
基本Docker面试题和答案合集1. 你能介绍一下 docker 容器吗?
  • 简单来说,docker 容器由应用程序及其所有依赖项组成。
  • 它们与其他容器共享内核和系统资源,并在主机操作系统中作为隔离系统运行。
  • docker 容器的主要目的是在部署和运行应用程序时摆脱对基础设施的依赖。这意味着任何容器化应用程序都可以在任何平台上运行,而不管其下使用的基础设施如何。
  • 从技术上讲,它们只是 docker 镜像的运行时实例。
2. Docker常见面试题有哪些:什么是docker镜像?
它们是用于创建容器的可执行包(与应用程序代码和依赖项、软件包等捆绑在一起)。Docker 镜像可以部署到任何 Docker 环境,容器可以在那里启动以运行应用程序。
3. 什么是 DockerFile?
  • 它是一个文本文件,其中包含构建给定图像所需的所有命令。
4. 你能说出管理程序的功能是什么吗?
Docker面试题解析:管理程序是一种实现虚拟化的软件,因此有时称为虚拟机监视器。这将划分主机系统的资源并将它们分配给安装的每个来宾环境。
  • 这意味着可以在单个主机系统上安装多个操作系统。管理程序有两种类型:

    1.本地管理程序:这种类型也称为裸机管理程序,直接在底层主机系统上运行,这也确保直接访问主机硬件,这就是它不需要基本操作系统的原因。
    2.  Hosted Hypervisor:这种类型利用安装了现有操作系统的底层主机操作系统。
5. 关于 Docker Compose,你能说些什么?
它是一个 YAML 文件,包含有关设置基于 Docker 的应用程序所需的各种服务、网络和卷的所有详细信息。因此,docker-compose 用于创建多个容器,托管它们并在它们之间建立通信。为了容器之间的通信,每个容器都暴露端口。
6. 你能谈谈 docker 命名空间吗?
命名空间基本上是一种 Linux 功能,可确保以互斥方式对操作系统资源进行分区。这形成了容器化背后的核心概念,因为命名空间在容器之间引入了一层隔离。在 docker 中,命名空间确保容器是可移植的,并且不会影响底层主机。Docker 当前支持的命名空间类型示例 - PID、Mount、User、Network、IPC。
7、列出所有docker容器状态的docker命令是什么?
为了获取所有容器的状态,我们运行以下命令:  docker ps -a
8. 在什么情况下你会丢失容器中存储的数据?
容器的数据将保留在其中,直到并且除非你删除该容器。
9. 什么是docker镜像注册?
  • Docker 镜像注册表,简单来说就是存储 Docker 镜像的区域。开发人员无需每次都将应用程序转换为容器,而是可以直接使用存储在注册表中的图像。
  • 这个镜像注册表可以是公共的也可以是私有的,Docker hub 是最流行和最著名的公共注册表。
10. Docker面试题和答案合集:Docker 有多少个组件?
有三个 docker 组件,它们是 - Docker Client、Docker Host 和 Docker Registry。
  • Docker Client:该组件执行“构建”和“运行”操作,目的是打开与 docker 主机的通信。
  • Docker Host:该组件具有主要的 docker 守护进程和主机容器及其相关图像。守护进程与 docker 注册表建立连接。
  • Docker Registry:该组件存储Docker镜像。可以有公共注册表或私有注册表。最著名的公共注册中心是 Docker Hub 和 Docker Cloud。
11.什么是Docker Hub?
  • 它是 Docker 提供的基于公共云的注册表,用于存储容器的公共映像以及提供查找和共享它们。
  • 可以通过docker push命令将镜像推送到 Docker Hub  。
12. 可以运行什么命令将 docker 镜像导出为存档?
这可以使用 docker save 命令完成,语法为:  docker save -o < exported_name> .tar < container-name>
13. 可以运行什么命令将预先导出的Docker镜像导入另一个Docker主机?
这可以使用 docker load 命令来完成,语法是  docker load -i < export_image_name> .tar
14. 暂停的容器可以从 Docker 中删除吗?
不,这不可能!容器必须处于停止状态才能移除它。
15、用什么命令查看docker客户端和服务端的版本?
  • 用于获取客户端和服务器所有版本信息的命令是  docker version.
  • 要仅获取服务器版本详细信息,我们可以运行  docker version --format '{{.Server.Version}}'
中级Docker面试题和答案合集16. 区分虚拟化和容器化。
这个问题间接转化为解释虚拟机和 Docker 容器之间的区别。
虚拟化  容器化
这有助于开发人员在单个物理服务器的硬件上运行和托管多个操作系统。这有助于开发人员在单个虚拟机或服务器上使用相同的操作系统部署多个应用程序。
管理程序为客户操作系统提供整体虚拟机。  容器确保为运行应用程序提供隔离的环境/用户空间。在容器内进行的任何更改都不会反映在主机或同一主机的其他容器上。
这些虚拟机形成了系统硬件  层的抽象,这意味着主机上的每个虚拟机都像一台物理机。容器形成应用  层的抽象,这意味着每个容器构成不同的应用。
17. Dockerfile 中使用的 COPY 和 ADD 命令的区别?
Docker面试题解析:这两个命令具有相似的功能,但COPY由于其透明度比ADD.
COPY仅提供将本地文件复制到容器中的基本支持,同时ADD提供远程 URL 和 tar 提取支持等附加功能。
18.容器可以自己重启吗?
  • 是的,只有在使用 docker run 命令时使用某些 docker 定义的策略才有可能。以下是可用的策略:

    1.Off:在这种情况下,容器在停止或失败时不会重新启动。
    2.  On-failure:这里,容器仅在遇到与用户无关的故障时才自行重启。
    3.Unless-stopped:使用此策略,确保容器只有在用户执行命令停止时才能重??新启动。
    4.  Always:无论失败或停止,容器总是在这种类型的策略中重新启动。

    这些政策可用作:
    docker run -dit — restart [restart-policy-value] [container_name]
19. Docker常见面试题有哪些:你能说出 docker Image 和 Layer 之间的区别吗?
Image:这是由一系列只读指令层构成的。一个镜像对应于docker容器,由于每一步的缓存机制,用于快速操作。

Layer:每一层对应镜像的Dockerfile的一条指令。简单来说,图层也是一个图像,但它是指令运行的图像。

考虑下面的示例 Dockerfile。
FROM ubuntu:18.04 COPY . /myapp RUN make /myapp CMD python /myapp/app.py Importantly, each layer is only a set of differences from the layer before it.

- 构建这个 docker 文件的结果是一个图像。而此文件中的说明将图层添加到图像中。这些层可以被认为是中间图像。在上面的示例中,有 4 条指令,因此结果图像中添加了 4 个图层。
20、docker run命令中volume参数的作用是什么?
  • 使用卷时 docker run 的语法是:  docker run -v host_path:docker_path < container_name>
  • volume 参数用于将容器的目录与任何主机目录同步。以下面的命令为例:docker run -v /data/app:usr/src/app myapp
    上面的命令/data/app将主机中的usr/src/app目录挂载到目录   中。我们可以将容器与来自主机的数据文件同步,而无需重新启动它。
  • 这也确保了容器删除情况下的数据安全。这确保即使容器被删除,容器的数据仍存在于卷映射主机位置,使其成为存储容器数据的最简单方法。
21. docker 中的 docker 卷存储在哪里?
【Docker面试题笔记整理(问题和答案解析)】卷由 Docker 创建和管理,非 Docker 实体无法访问。它们存储在 Docker 主机文件系统中/var/lib/docker/volumes/
22. docker info 命令有什么作用?
该命令获取有关安装在主机系统上的 Docker 的详细信息。这些信息可以是容器或镜像的数量是多少,它们在什么状态下运行,以及硬件规格,如分配的总内存、处理器速度、内核版本等。
23. 能说说docker compose的up、run、start命令的作用是什么吗?
  • 使用 up 命令保持 docker-compose up(理想情况下始终),我们可以启动或重新启动与 docker-compose.yml 文件中指定的应用程序关联的所有网络、服务和驱动程序。现在,如果我们在“附加”模式下运行 docker-compose up,那么我们可以访问来自容器的所有日志。如果 docker-compose 在“分离”模式下运行,那么一旦容器启动,它就会退出并且不显示任何日志。
  • 使用 run 命令,docker-compose 可以根据业务需求运行一次性或临时任务。在这里,必须提供服务名称,并且 docker 仅启动该特定服务以及目标服务所依赖的其他服务(如果有)。
    - 此命令有助于测试容器以及执行诸如向容器卷添加或删除数据等任务。
  • 使用 start 命令,只能重新启动那些已经创建然后停止的容器。这对于单独创建新容器没有用。
24、docker在任何系统上运行的基本要求是什么?
Docker 可以在 Windows 和 Linux 平台上运行。
  • 对于 Windows 平台,docker 至少需要 Windows 10 64bit 和 2GB RAM 空间。低版本可以借助工具箱安装docker。Docker 可以从https://docs.docker.com/docker-for-windows/网站下载。
  • 对于 Linux 平台,Docker 可以运行在各种 Linux 版本上,例如 Ubuntu > =12.04、Fedora > =19、RHEL > =6.5、CentOS > =6 等。
25. 能说说登录docker registry的方法吗?
可以使用docker login命令凭据登录自己的云存储库并进行访问。
26. 列出Dockerfile中最常用的指令?
  • FROM:这用于为即将到来的指令设置基本图像。如果 docker 文件以 FROM 指令开头,则认为它是有效的。
  • LABEL:用于基于项目、模块或许可的图像组织。它还有助于自动化,因为我们指定了一个键值对,同时定义了一个可以在以后以编程方式访问和处理的标签。
  • RUN:该命令用于在新图层的当前图像的顶部执行其后面的指令。请注意,每次执行 RUN 命令时,我们都会在图像顶部添加图层,然后在后续步骤中使用它。
  • CMD:该命令用于提供正在执行的容器的默认值。在多个 CMD 命令的情况下,将考虑最后一条指令。
27. 你能区分守护进程日志和容器日志吗?
  • 在 docker 中,支持 2 个级别的日志记录,它们是在守护进程级别进行日志记录,或者在容器级别进行日志记录。
  • 守护进程级别:这种日志记录有四个级别 - 调试、信息、错误和致命。
    - 调试拥有守护进程执行期间发生的所有数据。
    - Info 携带守护进程执行过程中的所有信息以及错误信息。
    - 错误是在守护进程执行过程中发生的那些错误。
    - Fatal 有在执行过程中发生的致命错误。
  • 容器级别:
    - 可以使用以下命令完成容器级别日志记录:sudo docker run –it < container_name> /bin/bash
    - 为了检查容器级别日志,我们可以运行以下命令:sudo docker logs < container_id>
28、docker主机和Linux主机建立通信的方式是什么?
这可以通过识别 docker 主机上的“ipconfig”使用网络来完成。只要 docker 存在于主机中,此命令可确保创建以太网适配器。
29. 删除容器的最佳方法是什么?
删除容器需要遵循以下两个步骤:
- docker stop < container_id>
- docker rm < container_id>
30.你能说出CMD和ENTRYPOINT的区别吗?
  • CMD 命令为正在执行的容器提供可执行默认值。如果必须省略可执行文件,则必须结合使用 ENTRYPOINT 指令和 JSON 数组格式。
  • ENTRYPOINT 指定其中的指令将始终在容器启动时运行。 
    此命令提供了配置参数和可执行文件的选项。如果 DockerFile 没有这个命令,那么它仍然会从 FROM 指令中提到的基础镜像继承。
    - 最常用的 ENTRYPOINT 是/bin/sh  /bin/bash用于大多数基本图像。
  • 作为良好实践的一部分,每个 DockerFile 都应该至少有这两个命令之一。
高级Docker面试题和答案合集31.在Docker中开发docker-compose文件可以用JSON代替YAML吗?
是的!它可以使用。为了使用 JSON 运行 docker-compose,docker-compose -f docker-compose.json up可以使用。
32、docker可以运行多少个容器,影响这个限制的因素有哪些?
Docker面试题解析:对于可以在 docker 中运行的容器数量没有明确定义的限制。但这一切都取决于限制 - 更具体地说是硬件限制。应用程序的大小和可用的 CPU 资源是影响此限制的两个重要因素。如果你的应用程序不是很大,并且你有丰富的 CPU 资源,那么我们可以运行大量容器。
33.Docker常见面试题有哪些:描述Docker Container的生命周期?
Docker 容器从创建开始到结束的不同阶段称为 Docker 容器生命周期。 
最重要的阶段是:
  • Created:这是容器刚刚创建新但尚未启动的状态。
  • 正在运行:在这种状态下,容器将与其所有关联的进程一起运行。
  • 暂停:当正在运行的容器已暂停时会发生此状态。
  • 已停止:当正在运行的容器停止时会发生这种状态。
  • Deleted:在这种情况下,容器处于死状态。
34、多应用环境如何使用docker?
  • docker 的 Docker-compose 功能将在这里提供帮助。在 docker-compose 文件中,我们可以清晰地定义多个服务、网络和容器以及卷映射,然后我们只需调用命令“docker-compose up”即可。
  • 当涉及多个环境时——它可以是开发、登台、uat 或生产服务器,我们希望定义特定于服务器的依赖项和运行应用程序的进程。在这种情况下,我们可以继续创建名称为“docker-compose.{environment}.yml”的特定于环境的 docker-compose 文件,然后根据环境,我们可以设置和运行应用程序。
35. 使用 docker compose 时,如何确保容器 1 在容器 2 之前运行?
Docker-compose 在继续下一个容器之前不会等待任何容器“准备好”。为了实现执行顺序,我们可以使用:
  • 可以使用在 docker-compose 版本 2 中添加的“depends_on”,如下面的示例 docker-compose.yml 文件所示:
version: "2.4" services: backend: build: . depends_on: - db db: image: postgres

引入服务依赖有多种原因和影响:
  • docker-compose up命令以指定的依赖关系顺序启动和运行服务。对于上面的示例,DB 容器在后端之前启动。
  • docker-compose up SERVICE_NAME默认情况下包括与服务关联的依赖项。在给定的示例中,运行docker-compose up backend会创建并启动 DB(后端的依赖关系)。
  • 最后,该命令docker-compose stop还按照指定的依赖关系的顺序停止服务。对于给定的示例,后端服务在 DB 服务之前停止。
Docker面试题和答案合集结论36. 结论
DevOps 技术正以指数级的速度增长。随着系统越来越分布式,开发人员已经转向容器化,因为需要更快地开发软件并更好地维护它们。它们还有助于更轻松、更快速地持续集成和部署过程,这就是这些技术经历了巨大增长的原因。
Docker 是最著名和最受欢迎的工具,用于实现容器化和持续集成/开发以及持续部署的目的,因为它对管道的大力支持。随着生态系统的不断发展,docker 已经证明自己可以在多个用例上运行,从而使学习它变得更加令人兴奋!

构建一个好的 DockerFile:https://docs.docker.com/engine/reference/builder/

    推荐阅读