docker选择题答案_Docker⾯试问题与解答
如今,公司不再⼀次性发布⼤量功能,⽽是试图通过⼀系列发布列车将⼩功能传输给客户。这具有许多优点,例如来⾃客户的快速反馈,更好的软件质量等,这反过来导致⾼的客户满意度。为实现这⼀⽬标,公司必须:
增加部署频率
降低新版本的故障率
修复之间缩短了提前期
新版本崩溃时平均恢复时间更快
DevOps满⾜所有这些要求,有助于实现⽆缝的软件交付。
DevOps有哪些优势?
技术优势:
持续的软件交付
修复不太复杂的问题
更快地解决问题
商业利益:
更快速地传递功能
更稳定的操作环境
有更多时间可以增加价值(⽽不是修复/维护)
CI(持续集成)服务器的功能是什么?
CI服务器功能是不断地集成所有正在进⾏的更改并由不同的开发⼈员提交到存储库,并检查编译错误。它需要每天多次构建代码,最好是在每次提交之后,以便它可以检测在问题发⽣时是哪个提交Bug了。
什么是虚拟化?
虚拟化允许您在相同的硬件上运⾏两个完全不同的操作系统。每个客户操作系统都经历了引导,加载
内核等所有过程。您可以拥有⾮常严格的安全性,例如,客户操作系统⽆法完全访问主机操作系统或其他客户端并搞砸了。
可以基于虚拟化⽅法如何模仿客户操作系统的硬件并模拟客户操作环境来对虚拟化⽅法进⾏分类。主要有三种类型的虚拟化:
仿真
半虚拟化
基于容器的虚拟化
Docker与虚拟机有何不同?
Docker不是虚拟化⽅法。它依赖于实际实现基于容器的虚拟化或操作系统级虚拟化的其他⼯具。为此,Docker最初使⽤LXC驱动程序,然后移动到libcontainer现在重命名为runc。Docker主要专注于在应⽤程序容器内⾃动部署应⽤程序。应⽤程序容器旨在打包和运⾏单个服务,⽽系统容器则设计为运⾏多个进程,如虚拟机。因此,Docker被视为容器化系统上的容器管理或应⽤程序部署⼯具。
与虚拟机不同,容器不需要引导操作系统内核,因此可以在不到⼀秒的时间内创建容器。此功能使基于容器的虚拟化⽐其他虚拟化⽅法更加独特和可取。
由于基于容器的虚拟化为主机增加了很少或没有开销,因此基于容器的虚拟化具有接近本机的性能
对于基于容器的虚拟化,与其他虚拟化不同,不需要其他软件。
主机上的所有容器共享主机的调度程序,从⽽节省了额外资源的需求。
与虚拟机映像相⽐,容器状态(Docker或LXC映像)的⼤⼩很⼩,因此容器映像很容易分发。
容器中的资源管理是通过cgroup实现的。Cgroups不允许容器消耗⽐分配给它们更多的资源。虽然主机的所有资源都在虚拟机中可见,但⽆法使⽤。这可以通过在容器和主机上同时运⾏top或htop来实现。所有环境的输出看起来都很相似。
容器内部机制?
⼤约在2006年,包括Google的⼀些员⼯在内的⼈们实现了名为命名空间的新的Linux内核级功能(不过这个想法早在FreeBSD中就已存在)。操作系统的⼀个功能是允许将全局资源(如⽹络和磁盘)共享到进程。如果将这些全局资源包装在命名空间中,以使它们仅对在同⼀命名空间中运⾏的那些进程可见,该怎么办?⽐如说,你可以获得⼀⼤块磁盘并将其放在命名空间X中,然后在命名空间Y中运⾏的进程⽆法查看或访问它。类似地,名称空间X中的进程⽆法访问分配给名称空间Y的内存中的任何内容。当然,X中的进程⽆法查看或与名称空间Y中的进程通信。这为全局资源提供了⼀种虚拟化和隔离。
这就是Docker的⼯作原理:每个容器都在⾃⼰的命名空间中运⾏,但使⽤与所有其他容器完全相同的内核。发⽣隔离是因为内核知道分配给进程的命名空间,并且在API调⽤期间确保进程只能访问其⾃⼰的命名空间中的资源。
什么是Docker?
Docker是⼀个容器化平台,它以容器的形式将您的应⽤程序及其所有依赖项打包在⼀起,以确保您的应⽤程序在开发,测试或⽣产的任何环境中⽆缝运⾏。
Docker容器,将⼀个软件包装在⼀个完整的⽂件系统中,该⽂件系统包含运⾏所需的⼀切:代码,运⾏时,系统⼯具,系统库等可以安装在服务器上的任何东西。
这可以保证软件始终运⾏相同,⽆论其环境如何。
如何使⽤Docker构建与环境⽆关的系统?
有三个主要功能有助于实现这⼀⽬标:
Volumes
环境变量注⼊
只读⽂件系统
什么是Docker镜像?
Docker镜像是Docker容器的源代码。换句话说,Docker镜像⽤于创建容器。使⽤build命令创建映像,并且在使⽤run启动时它们将⽣成容器。镜像存储在Docker注册表registry.hub.docker中,因为它们可能变得⾮常⼤,镜像被设计为由其他镜像层组成,允许在通过⽹络传输镜像时发送最少量的数据。
什么是Docker容器?
Docker容器包括应⽤程序及其所有依赖项,但与其他容器共享内核,作为主机操作系统上⽤户空间中的独⽴进程运⾏。Docker容器不依赖于任何特定的基础架构:它们可以在任何计算机,任何基础架构和任何云中运⾏。
什么是Docker Hub?
Docker hub是⼀个基于云的注册表服务,允许您链接到代码存储库,构建镜像并测试它们,存储⼿动推送的镜像以及指向Docker云的链接,以便您可以将镜像部署到主机。它为整个开发流程中的容器镜像发现,分发和变更管理,⽤户和团队协作以及⼯作流⾃动化提供了集中资源。
Docker容器有⼏种状态?
Docker容器可以有四种状态:
运⾏
已暂停
重新启动
已退出
我们可以通过运⾏命令来识别Docker容器的状态:
docker ps –a
这将依次列出所有可⽤的docker容器及其在主机上的相应状态。从那⾥我们可以很容易地识别感兴趣的容器,以相应地检查其状态。
什么类型的应⽤程序 - ⽆状态或有状态更适合Docker容器?
最好为Docker Container创建⽆状态应⽤程序。我们可以从应⽤程序中创建⼀个容器,并从应⽤程序中取出可配置的状态参数。现在我们可以在⽣产和具有不同参数的QA环境中运⾏相同的容器。这有助于在不同场景中重⽤相同的图像。使⽤Docker Containers⽐使⽤有状态应⽤程序更容易扩展⽆状态应⽤程序。
解释基本的Docker使⽤流程docker重启容器命令
⼀切都从Dockerfile开始。Dockerfile是镜像的源代码。
创建Dockerfile后,您可以构建它以创建容器的镜像。镜像只是“源代码”的“编译版本”,即Dockerfile。
获得容器的镜像后,应使⽤注册表重新分发容器。注册表就像⼀个git存储库 - 你可以推送和拉取镜像。
接下来,您可以使⽤该镜像来运⾏容器。在许多⽅⾯,正在运⾏的容器与虚拟机(但没有管理程序)⾮常相似。
Dockerfile中最常见的指令是什么?
Dockerfile中的⼀些常⽤指令如下:
FROM:我们使⽤FROM为后续指令设置基本镜像。在每个有效的Dockerfile中,FROM是第⼀条指令。
LABEL:我们使⽤LABEL按照项⽬,模块,许可等组织我们的镜像。我们也可以使⽤LABEL来帮助实现⾃动化。在LABEL中,我们指定⼀个键值对,以后可⽤于以编程⽅式处理Dockerfile。
RUN:我们使⽤RUN命令在当前镜像之上的新图层中执⾏任何指令。使⽤每个RUN命令,我们在镜像顶部添加⼀些内容,并在Dockerfile 的后续步骤中使⽤它。
CMD:我们使⽤CMD命令提供执⾏容器的默认值。在Dockerfile中,如果我们包含多个CMD命令,则只使⽤最后⼀条指令。
Dockerfile中的命令COPY和ADD命令有什么区别?
⼀般⽽⾔,虽然ADD并且COPY在功能上类似,但是COPY是优选的。
那是因为它⽐ADD更透明。COPY仅⽀持将本地⽂件基本复制到容器中,⽽ADD具有⼀些功能(如仅限本地的tar提取和远程URL⽀持),这些功能并不是很明显。因此,ADD的最佳⽤途是将本地tar⽂件⾃动提取到镜像中,如ADD /中所⽰。
解释⼀下dockerfile的ONBUILD指令?
当镜像⽤作另⼀个镜像构建的基础时,ONBUILD指令向镜像添加将在稍后执⾏的触发指令。如果要构建将⽤作构建其他镜像的基础的镜像(例如,可以使⽤特定于⽤户的配置⾃定义的应⽤程序构建环境或守护程序),这将⾮常有⽤。
Docker镜像和层有什么区别?
镜像:Docker镜像是由⼀系列只读层构建的
层:每个层代表镜像Dockerfile中的⼀条指令。
下⾯的Dockerfile包含四个命令,每个命令都创建⼀个层。
FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py
重要的是,每个层只是与之前⼀层的⼀组差异层(相同的就不再放到新层中)。
什么是Docker Swarm?
Docker Swarm是Docker的本机集。它将Docker主机池转变为单个虚拟Docker主机。Docker Swarm提供标准的Docker API,任何已经与Docker守护进程通信的⼯具都可以使⽤Swarm透明地扩展到多个主机。
如何在⽣产中监控Docker?
Docker提供docker stats和docker事件等⼯具来监控⽣产中的Docker。我们可以使⽤这些命令获取重要统计数据的报告。
Docker统计数据:当我们使⽤容器ID调⽤docker stats时,我们获得容器的CPU,内存使⽤情况等。它类似于Linux中的top命令。
Docker事件:Docker事件是⼀个命令,⽤于查看Docker守护程序中正在进⾏的活动流。
⼀些常见的Docker事件是:attach,commit,die,detach,rename,destroy等。我们还可以使⽤各种选项来限制或过滤我们感兴趣的事件。
Docker如何在⾮Linux系统中运⾏容器?
通过添加到Linux内核版本2.6.24的名称空间功能,可以实现容器的概念。容器将其ID添加到每个进程,并向每个系统调⽤添加新的访问控制检查。它由clone()系统调⽤访问,该调⽤允许创建先前全局命名空间的单独实例。
如果由于Linux内核中可⽤的功能⽽可以使⽤容器,那么显⽽易见的问题是⾮Linux系统如何运⾏容器。Docker for Mac和Windows都使⽤Linux VM来运⾏容器。Docker Toolbox⽤于在Virtual Box VM中运⾏容器。但是,最新的Docker在Windows中使⽤Hyper-V,在Mac中使⽤Hypervisor.framework。
如何在多个环境中使⽤Docker?
可以进⾏以下更改:
删除应⽤程序代码的任何卷绑定,以便代码保留在容器内,不能从外部更改
绑定到主机上的不同端⼝
以不同⽅式设置环境变量(例如,减少⽇志记录的详细程度,或启⽤电⼦邮件发送)
指定重启策略(例如,重启:始终)以避免停机
添加额外服务(例如,⽇志聚合器)
因此,您可能希望定义⼀个额外的Compose⽂件,例如l,它指定适合⽣产的配置。此配置⽂件只需要包含您要从原始Compose⽂件中进⾏的更改。
docker-compose -f docker-com
为什么Docker Compose不会等待容器准备就绪,然后继续以依赖顺序启动下⼀个服务?
Compose按照依赖顺服启动和停⽌容器,决定依赖关系语句有 depends_on, links, volumes_from, 和network_mode: "service:...".
但是,对于启动,Compose不会等到容器“准备好它运⾏“。这⾥有⼀个很好的理由:
等待数据库(例如)准备就绪的问题实际上只是分布式系统更⼤问题的⼀个⼦集。在⽣产中,您的数据库可能随时变得不可⽤或移动主机。您的应⽤程序需要能够适应这些类型的故障。
要处理此问题,请将应⽤程序设计为在发⽣故障后尝试重新建⽴与数据库的连接。如果应⽤程序重试连接,它最终可以连接到数据库。
最佳解决⽅案是在启动时以及出于任何原因丢失连接时,在应⽤程序代码中执⾏此检查。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论