20+ Docker面试问题和答案
在申请下一份工作时,软件工程师需要准备好回答Docker面试的问题。为什么?Docker的使用近年来呈指数级增长被称为第三个最常用的平台在2019年的一项调查中,Linux和Windows之后。
Docker是一个庞大的生态系统,其中包含许多工具、关键字和需要了解的主题。为了帮助你在招聘经理面前取得好成绩,这里有20多个最常见的docker关系问题和答案,你可以为下次面试做准备。
问:Docker CLI和Docker守护进程有什么区别?
Docker CLI(命令行接口)和Docker守护进程经常混淆。守护进程是完成繁重工作的程序,充当代表服务器的Docker引擎。守护进程构建映像并管理已创建的容器。
CLI是与守护进程交互的Docker客户端。CLI接收命令并将它们提供给守护进程。
问:Docker CLI中最重要的命令是什么?
最重要的命令是你一直在使用的,所以列出那些你每天都在使用的命令。
- ' build ' -用来建立一个新映像的命令
- ' create ' -用于从已构建的映像创建新的容器
- ' ps ' -用于列出每个正在运行的容器的详细信息
- ' exec '—在正在运行的容器中运行命令
问:在容器中运行数据库有哪些注意事项?
请记住,Docker容器本质上是短暂的。当容器被移除时,您将永远丢失其中的数据。
如果要在容器中运行数据库,则需要数据持久性策略。这通常是通过在容器中装入一个卷来实现的。然后,数据库可以将其数据存储在该卷中。如果容器被删除,数据将通过卷持久化。然后,我们可以创建一个新容器,并将相同的卷挂载到其中,以重用该数据。
问:创建Docker映像的最佳方法是什么?
始终使用Dockerfile创建Docker映像。Dockerfiles是一种文本文档,它指定了守护进程创建映像时应该使用的一系列清晰的步骤。它们很容易被其他工程师阅读和修改。
不要通过创建一个容器,手动更改它,然后运行' docker commit '来创建图像。这可能会创建一个图像,但对其他工程师来说,复制该图像将是一个挑战。
问:如何调试正在运行的容器?
有一些方法可以用来调试正在运行的容器:
- 使用' 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”有什么区别?
' stop '命令向主进程发送' SIGTERM '信号。Docker然后等待进程退出。如果进程没有退出,Docker将在十秒后发送' 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 '标志来限制容器可以访问的内存量。
- 使用' -cpus '命令限制容器可以访问的处理能力。
- 使用' - gpu '命令使容器进程可以使用gpu。
问:Docker容器和虚拟机是一回事吗?
不,Docker容器并不等同于虚拟机。Docker容器是一个或一组沙箱化的进程,限制了对主机文件系统的访问。但是,虚拟机是由hypervisor管理的。
问:你用Docker CLI创建的所有图像都会自动发布到一个公共注册中心,比如Docker Hub吗?
不,您构建的图像不会自动推送到公共注册中心。构建的映像仅在构建它们的机器上可用。要使该映像在其他地方可用,必须手动将其推入公共注册中心。
问题:在应用程序开发过程中使用Docker有哪些优点和缺点?bob外围官网
优点
- 工程师可以指定程序运行的确切环境。
- 在Docker上运行的每个程序可以使用不同的依赖项。例如,一个进程可能需要Python 2。而另一个则需要Python 3.X。
- 可以为每个容器提供精确数量的处理能力和内存。然后,您可以确保程序运行在具有相同规格的生产机器上。
- 容器为测试提供了一致的环境。例如,您可能正在编写一个程序,该程序编辑某个目录中的每个文件。要测试这一点,您可以使用一个总是在给定文件夹中以完全相同的文件启动的容器。这节省了为每次测试运行手工创建这些文件的时间。
- 每个容器都可以有自己的一组依赖容器。例如,在不同容器中的两个不同web应用程序可以获得各自的数据库副本。在每个web应用程序和数据库之间不会有竞争。
缺点
- Docker是软件开发生命周期中的另一个依赖项。bob外围官网每个工程师需要在他们的机器上维护一个Docker的副本。工程师必须确保他们拥有与同事相同的Docker版本。
- 工程师必须了解Docker,这不是一件容易的事,因为Docker的生态系统是巨大的。使用Docker为基础应用程序开发引入了新思想和新语法。bob外围官网一个工程师必须了解如何使用Docker在项目中有效地工作。
- “Docker For Mac”和“Docker For Windows”工具不是100%稳定的。这些工具使Docker很容易开始,但有时会崩溃。团队使用这些工具可能会浪费开发bob外围官网时间。
问:在构建新映像时,如何告诉Docker CLI忽略目录中的所有文件?
创建一个”。dockerignore”文件。该文件遵循与'相同的规则。gitignore”文件。在”。dockerignore '文件,你会列出每个Docker应该忽略的文件和文件夹,当构建一个新映像。
问:为什么要Docker在构建映像时忽略目录?
在构建映像时,Docker应该处理安装所有相关依赖项。如果你给Docker一份依赖项的拷贝,它们将在映像构建期间被覆盖。通过忽略依赖关系,它确保了构建时间的快慢。
问:“create”、“start”和“run”命令有什么区别?
- ' 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—该命令指定要用于创建的映像的基本映像。
- RUN -用于在构建容器时执行单个命令或一系列命令。
- COPY -将一个文件或一组文件从主机文件系统复制到容器中。
- CMD -指定容器第一次执行时要运行的默认命令。
- WORKDIR -设置Dockerfile中所有后续命令的工作目录。所有以后的命令都将此工作目录作为当前工作目录执行。
- USER -以下所有命令都以该用户作为上下文执行。