20+ Docker面试问题和答案
在申请下一份工作时,软件工程师需要准备好回答Docker面试的问题。为什么?Docker的使用近年来呈指数级增长被命名为第三个最常用的平台在2019年的一项调查中,Linux和Windows之后。
Docker是一个庞大的生态系统,其中包含许多工具、关键字和需要了解的主题。为了帮助你在招聘经理面前充分利用时间,以下是20多个最常见的Docker关系问题和答案,供你下次面试时参考。
问:Docker CLI和Docker守护进程有什么区别?
Docker CLI(命令行界面)和Docker守护进程经常混淆。守护进程是执行繁重任务的程序,充当代表服务器的Docker引擎。守护进程构建映像并管理创建的容器。
CLI是与守护进程交互的Docker客户端。CLI接收命令并将其馈送到守护进程中。
最后更新日期:2021年10月
使用Kubernetes构建、测试和部署Docker应用程序,同时学习生产风格的开发流程|betwayapp下载安装斯蒂芬·主梁
探索课程问:Docker CLI中最重要的命令是什么?
最重要的命令是您一直使用的命令,因此请列出您每天使用的命令。
- ' build ' -用来建立一个新映像的命令
- ' create ' -用于从已构建的映像创建新的容器
- “ps”-用于列出每个运行容器的详细信息
- ' exec '—在正在运行的容器中运行命令
问:在容器中运行数据库有哪些注意事项?
请记住,Docker容器本质上是短暂的。当容器被移除时,您将永远丢失其中的数据。
如果要在容器中运行数据库,则需要数据持久性策略。这通常是通过在容器中装入一个卷来完成的。然后,数据库可以将其数据存储在此卷中。如果容器被删除,数据将通过卷持久化。然后,我们可以创建一个新容器,并将相同的卷装载到该容器中以重用该数据。
问:创建Docker映像的最佳方法是什么?
始终使用Dockerfile创建Docker图像。DockerFile是文本文档,指定守护进程创建映像时应使用的一系列清晰步骤。其他工程师很容易阅读和更改它们。
不要通过制作容器、手动更改然后运行“docker提交”来创建图像。这可能会产生一个图像,但对其他工程师来说,再现图像将是一个挑战。
问:如何调试正在运行的容器?
有一些方法可以用来调试正在运行的容器:
- 使用' docker exec '命令在容器中启动一个shell。然后,您可以使用这个shell在容器的上下文中运行更多的命令,并检查其状态。
- 使用“docker inspect”命令查看正在运行的容器的配置。然后,检查给定给容器的命令和环境变量。
- 执行命令' docker logs '。这将从StdOut和StdErr打印日志。
问:Dockerfiles是用JSON还是YAML语法编写的?
技巧的问题!Dockerfile的容器既不是JSON也不是YAML。该语法只在docker-compose文件中使用。
Dockerfile中使用的语法没有设置名称。你应该说Dockerfiles包含一系列Docker命令。
问题:容器是否可以完全访问其主机操作系统?
Docker容器默认与主机操作系统隔离。容器可以通过设置“特权”标志来访问主机操作系统。当你创建一个带有“特权”标志的容器时,它将拥有对主机操作系统的完全访问权。
问题:为什么要运行带有“特权”标志的容器?
运行带有“特权”标志的Docker容器有几个理由。最常见的原因是,您希望容器能够自己创建容器。
问:CLI命令“stop”和“kill”有什么区别?
“停止”命令向主进程发送“SIGTERM”信号。Docker然后等待进程退出。如果进程未退出,Docker将在10秒后发送“SIGKILL”信号。
“kill”命令立即向主进程发送一个“SIGKILL”信号。
问:“attach”和“exec”命令有什么区别?
使用' exec '命令在容器内部运行命令。您运行的命令可以在容器中启动一个新进程。
' attach '命令与主进程的流进行交互。特别是,它将与STDOUT、STDERR和STDIN流交互。
总之:当您想在容器中运行新命令时,请使用“exec”。使用“attach”命令与主进程交互。
问:' diff '命令用于什么?
' diff '命令列出容器内所有更改过的文件。这将只列出自创建容器以来所做的更改。
问:所有项目都需要使用Docker Hub吗?
不,并不是所有项目都需要Docker Hub。我们只使用Docker Hub,如果我们需要使用托管在那里的图像。
如果我们想避免使用Docker Hub,我们可以从头开始构建每个映像。
问:如何约束容器可以使用的资源?
你可以通过在' docker run '命令中添加一些选项来限制容器使用的资源。
- 使用“-m”标志限制容器可以访问的内存量。
- 使用“-cpu”命令限制容器可以访问的处理能力。
- 使用“-gpus”命令使GPU可用于容器进程。
问:Docker容器和虚拟机是一回事吗?
不,Docker容器并不等同于虚拟机。Docker容器是一个或一组沙箱化的进程,限制了对主机文件系统的访问。但是,虚拟机是由hypervisor管理的。
问:你用Docker CLI创建的所有图像都会自动发布到一个公共注册中心,比如Docker Hub吗?
不,您构建的图像不会自动推送到公共注册中心。构建的映像仅在构建它们的机器上可用。要使该映像在其他地方可用,必须手动将其推入公共注册中心。
问题:在应用程序开发过程中使用Docker有哪些优点和缺点?betwayapp下载安装
优点
- 工程师可以指定我们的程序运行的确切环境。
- 在Docker上运行的每个程序都可以使用不同的依赖项。例如,一个进程可能需要Python2.X,而另一个进程需要Python3.X。
- 可以为每个容器提供精确数量的处理能力和内存。然后,您可以确保程序运行在具有相同规格的生产机器上。
- 容器为测试提供了一致的环境。例如,您可能正在编写一个程序,该程序编辑某个目录中的每个文件。要测试这一点,您可以使用一个总是在给定文件夹中以完全相同的文件启动的容器。这节省了为每次测试运行手工创建这些文件的时间。
- 每个容器都可以有自己的一组依赖容器。例如,在不同容器中的两个不同web应用程序可以获得各自的数据库副本。在每个web应用程序和数据库之间不会有竞争。
缺点
- Docker是软件开发生命周期中的另一个依赖项。betwayapp下载安装每个工程师需要在他们的机器上维护一个Docker的副本。工程师必须确保他们拥有与同事相同的Docker版本。
- 工程师必须了解Docker,这不是一件容易的事,因为Docker的生态系统是巨大的。使用Docker为基础应用程序开发引入了新思想和新语法。betwayapp下载安装一个工程师必须了解如何使用Docker在项目中有效地工作。
- “Docker For Mac”和“Docker For Windows”工具不是100%稳定的。这些工具使Docker很容易开始,但有时会崩溃。团队使用这些工具可能会浪费开发betwayapp下载安装时间。
问题:在构建新映像时,如何让Docker CLI忽略目录中的所有文件?
创建一个”。dockerignore”文件。该文件遵循与'相同的规则。gitignore”文件。在”。dockerignore '文件,你会列出每个Docker应该忽略的文件和文件夹,当构建一个新映像。
问:为什么要Docker在构建映像时忽略目录?
Docker在构建映像时应负责安装所有相关依赖项。如果您给Docker一份依赖项的副本,它们将在映像构建期间被覆盖。通过忽略依赖关系,它确保了构建时间的加快。
问题:“创建”、“开始”和“运行”命令之间有什么区别?
- ' create '命令将从映像创建一个新的容器,但不启动它。
- ' start '命令将运行当前未运行的容器中的主进程。
- ' run '命令与连续运行' create '然后' start '命令相同。它将从映像创建一个容器,然后运行其中的主进程。
问:当容器的主要进程崩溃时会发生什么?
它取决于生成容器时分配给容器的重新启动策略。
- “不”策略意味着容器在崩溃后将停止运行。这是默认策略。
- 当主进程因错误而停止时,“on-failure”策略将重新启动主进程。
- “总是”策略将导致主进程总是重新启动。如果手动停止容器,则会覆盖此选项。当Docker守护进程重新启动时,容器也将重新启动。
- “除非停止”的策略与“始终”相同。但是,当Docker守护进程重新启动时,它不会重新启动。
问:Docker映像是如何创建的?
有两种方法可以创建Docker映像。
1.你可以使用Dockerfile命令' docker build '来创建镜像
2.镜像也可以通过在容器上运行' docker commit '命令来创建
问:什么是图像中的“图层”?
Docker映像由许多层构建而成。每一层表示一组对文件系统的更改。
创建Docker映像时,它以一个空文件系统开始。当Dockerfile的每个步骤运行时,另一层会添加到图像中。
问:两个正在运行的容器可以共享同一个映像层吗?
是的!当你创建一个容器时,Docker会向底层图像添加一个新层。对容器文件系统所做的任何更改都将写入这一层。
属于底层图像的层永远不会改变。Docker将在基于该映像运行的每个容器之间共享它们。
这些原始层中的文件只能通过读操作访问。您不能通过容器对它们进行写入。
问:使用Docker CLI运行单个容器很容易。管理多个集装箱更具挑战性。什么术语指的是管理多个集装箱的过程?另外,有什么工具可以管理许多容器?
管理多个容器称为“编排”。
有两种常用的容器“编排”工具:
- Docker Swarm, Docker官方解决方案。
- Kubernetes,一个流行的开源解决方案,首先由谷歌推出。
这些工具中的每一个都创建容器并管理它们的生命周期。它们还用于处理不同容器之间的网络连接。
问:假设您创建了一个1GB大小的映像。然后从这个映像创建五个独立的容器。在每个映像中,创建一个大小为200MB的文件。整个操作使用了多少磁盘空间?
从映像创建的每个容器使用的磁盘空间可以忽略不计。制作一组五个容器并不会消耗大量的空间。但是,每个容器中生成的每个200MB文件消耗的都是200MB。
整个操作使用1GB的原始图像,然后每个容器使用5 * 200MB,最终总共使用2GB。
从图像创建容器不会复制基础图像的层。
问:监视运行中的容器最简单的方法是什么?
监视容器最简单的方法是使用' docker ps '命令。这将打印出所有正在运行的容器的状态。
使用' docker attach '命令也很容易监视容器。这将打印容器中的日志,显示主进程的STDOUT和STDERR流。
通过STDOUT和STDERR发出的所有过去的日志都可以使用' docker logs '命令打印出来。这对于查看容器过去做了什么很有用。
问:列出Dockerfile中出现的一些不同命令。每条命令的目的是什么?
Dockerfiles包含许多不同的命令。
- FROM–此命令指定要用于创建的图像的基础图像。
- 运行–用于在容器构建时在容器中执行单个命令或一系列命令。
- COPY -将一个文件或一组文件从主机文件系统复制到容器中。
- CMD -指定容器第一次执行时要运行的默认命令。
- WORKDIR -设置Dockerfile中所有后续命令的工作目录。所有以后的命令都将此工作目录作为当前工作目录执行。
- USER -以下所有命令都以该用户作为上下文执行。