当前位置:   article > 正文

Docker面试题(二十七道)_dockerfile面试题

dockerfile面试题

21、谈谈你对镜像的理解
相当于容器的源代码,是一个只读层,镜像由dockerfile 编写生成,用于构建容器。镜像运行起来之后就是 容器。

镜像相当于类,容器相当于对象。

22、dockerfile 中 add 和 copy 的区别
ADD和COPY相同点:只复制目录中得内容而不包含目录自身
ADD和COPY不同点:当要读取URL远程资源的时候,并不推荐使用ADD指令,而是建议使用RUN指令,在RUN指令中执行wget或curl命令(原因:减小镜像层数,避免镜像包过大)
build 上下文:docker build 创建镜像时就会产生一个上下文,就是docker patch或者URL中指定的文件合集,在build 过程中可以引用上下文中得任何文件。docker build -t test可以指定上下文得路径
copy和add 这俩命令就是引用上下文得文件,不能引用之外得邮件。

23、容器网络 能说下吗
本质上是利用了linux 上的 网络命名空间和虚拟网络设备 。 docker 用的是虚拟接口(虚拟网络)。转发效率极高,即可之间的数据转发通过数据复制来实现

24、如何在生产中监控Docker?
答:Docker提供docker stats和docker事件等工具来监控生产中的Docker。我们可以使用这些命令获取重要统计数据的报告。
Docker统计数据:当我们使用容器ID调用docker stats时,我们获得容器的CPU,内存使用情况等。它类似于Linux中的top命令。
Docker事件:Docker事件是一个命令,用于查看Docker守护程序中正在进行的活动流。一些常见的Docker事件是:attach,commit,die,detach,rename,destroy等。

25、什么类型的应用程序无状态或有状态更适合Docker容器?
答:最好为Docker Container创建无状态应用程序。我们可以从应用程序中创建一个容器,并从应用程序中取出可配置的状态参数。现在我们可以在生产环境和具有不同参数的QA环境中运行相同的容器。这有助于在不同场景中重用相同的镜像。另外,无状态应用程序比有状态应用程序更容易使用Docker容器进行扩展。

26、Docker 有哪些优缺点?
docker优点

1、部署方便

你一定还有印象,在我们最开始学习编程的时候,搭建环境这一步往往会耗费我们好几个小时的时间,而且其中一个小问题可能需要找很久才能够解决。你还会得到关于环境搭建方面的团队其他成员的求助。而有了容器之后,这些都变得非常容易,你的开发环境就只是一个或者几个容器镜像的地址,最多再需要一个控制部署流程的执行脚本。或者进一步将你的环境镜像以及镜像脚本放入一个git项目,发布到云端,需要的时候将它拉到本地就可以了。

2、部署安全

当我们收到一个bug反馈的时候,很多时候心里面的第一反应一定是“我本地是好的啊”!这种情况的发生就在于环境的不一致,我们在开发过程中的调试往往不能保证其他环境的问题,但是我们却要为此买单,这真是一件令人苦恼的事情。有了容器之后,这将很少发生。我们可以通过容器技术将开发环境和测试环境以及生产环境保持版本和依赖上的统一,保证代码在一个高度统一的环境上执行。而测试环境的统一,也同样能解决CI流程对环境的要求。

3、隔离性好

不管是开发还是生产,往往我们一台机器上可能需要跑多个服务,而服务各自需要的依赖配置不尽相同,假如说两个应用需要使用同一个依赖,或者两个应用需要的依赖之间会有一些冲突,这个时候就很容易出现问题了。所以同一台服务器上不同应用提供的不同服务,最好还是将其隔离起来。而容器在这方面有天生的优势,每一个容器就是一个隔离的环境,你对容器内部提供服务的要求,容器可以自依赖的全部提供。

4、快速回滚

容器之前的回滚机制,一般需要基于上个版本的应用重新部署,且替换掉目前的问题版本。在最初的时代,可能是一套完整的开发到部署的流程,而执行这一套流程往往需要很长的时间。在基于git的环境中,可能是回退某个历史提交,然后重新部署。这些跟容器技术相比都不够快,而且可能会引起新的问题(因为是基于新版本的修改)。而容器技术天生带有回滚属性,因为每个历史容器或者镜像都会有保存,而替换一个容器或者某个历史镜像是非常快速和简单的。

5、成本低

这可能是一个最明显和有用的优点了,在容器出现之前,我们往往构筑一个应用就需要一台新的服务器或者一台虚机。服务器的购置成本和运维成本都很高,而虚机需要占用很多不必要的资源。相比之下,容器技术就小巧轻便的多,只需要给一个容器内部构建应用需要的依赖就可以了,这也是容器技术发展迅速的最主要原因。

6、管理成本更低

随着大环境的发展,docker等容器的使用和学习的成本也是愈发降低,成为更多开发者和企业的选择。

docker缺点

1、隔离性

基于hypervisor的虚机技术,在隔离性上比容器技术要更好,它们的系统硬件资源完全是虚拟化的,当一台虚机出现系统级别的问题,往往不会蔓延到同一宿主机上的其他虚机。但是容器就不一样了,容器之间共享同一个操作系统内核以及其他组件,所以在收到攻击之类的情况发生时,更容易通过底层操作系统影响到其他容器。当然,这个问题可以通过在虚机中部署容器来解决,可是这样又会引出新的问题,比如成本的增加以及下面要提到的问题:性能。

2、性能

不管是虚机还是容器,都是运用不同的技术,对应用本身进行了一定程度的封装和隔离,在降低应用和应用之间以及应用和环境之间的耦合性上做了很多努力,但是随机而来的,就会产生更多的网络连接转发以及数据交互,这在低并发系统上表现不会太明显,而且往往不会成为一个应用的瓶颈(可能会分散于不同的虚机或者服务器上),但是当同一虚机或者服务器下面的容器需要更高并发量支撑的时候,也就是并发问题成为应用瓶颈的时候,容器会将这个问题放大,所以,并不是所有的应用场景都是适用于容器技术的。

27、Docker 能干什么
Web 应用的自动打包和发布;
自动化测试和持续集成、发布;
在服务型环境中部署和调整数据库或其他的后台应用;
从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

1、什么是 Docker 容器?
Docker 容器 在应用程序层创建抽象并将应用程序及其所有依赖项打包在一起。这使我们能够快速可靠地部署应用程序。容器不需要我们安装不同的操作系统。相反,它们使用底层系统的 CPU 和内存来执行任务。这意味着任何容器化应用程序都可以在任何平台上运行,而不管底层操作系统如何。我们也可以将容器视为 Docker 镜像的运行时实例。

  1. 什么是 DockerFile?
    Dockerfile 是一个文本文件,其中包含我们需要运行以构建 Docker 映像的所有命令。Docker 使用 Dockerfile 中的指令自动构建镜像。我们可以docker build用来创建按顺序执行多个命令行指令的自动构建。

  2. 如何从 Docker 镜像创建 Docker 容器?
    为了从镜像创建容器,我们从 Docker 存储库中提取我们想要的镜像并创建一个容器。我们可以使用以下命令:

$ docker run -it -d <image_name>

  1. Docker Compose 可以使用 JSON 代替 YAML 吗?
    是的,我们可以对Docker Compose文件使用 JSON 文件而不是YAML

$ docker-compose -f docker-compose.json up

  1. 什么是Docker Swarm?
    Docker Swarm 是一个容器编排工具,它允许我们跨不同主机管理多个容器。使用 Swarm,我们可以将多个 Docker 主机变成单个主机,以便于监控和管理。

  2. 如果你想使用一个基础镜像并对其进行修改,你怎么做?
    我们可以使用以下 Docker 命令将图像从 Docker Hub 拉到我们的本地系统上:

$ docker pull <image_name>

  1. 如何启动、停止和终止容器?
    要启动 Docker 容器,请使用以下命令:

$ docker start <container_id>

要停止 Docker 容器,请使用以下命令:

$ docker stop <container_id>

要终止 Docker 容器,请使用以下命令:

$ docker kill <container_id>

  1. Docker 运行在哪些平台上?
    Docker 在以下 Linux 发行版上运行:

CentOS 6+
Gentoo
ArchLinux
CRUX 3.0+
openSUSE 12.3+
RHEL 6.5+
Fedora 19/20+
Ubuntu 12.04、13.04
Docker 还可以通过以下云服务在生产中使用:

微软Azure
谷歌计算引擎
亚马逊 AWS EC2
亚马逊 AWS ECS
机架空间
提示:我们始终建议您在面试之前进行一些公司研究,要为这个特定问题做准备,请了解公司如何使用 Docker 并在您的答案中包含他们使用的平台。

  1. 解释 Docker 组件。
    三个架构组件包括 Docker 客户端、主机和注册表。

Docker 客户端:该组件执行构建和运行操作以与 Docker 主机通信。

Docker 主机:该组件包含 Docker 守护程序、Docker 镜像和 Docker 容器。守护进程建立到 Docker Registry 的连接。

Docker Registry:该组件存储 Docker 镜像。它可以是公共注册表,例如 Docker Hub 或 Docker Cloud,也可以是私有注册表。

  1. 虚拟化和容器化有什么区别?
    虚拟化

虚拟化帮助我们在单个物理服务器上运行和托管多个操作系统。在虚拟化中,管理程序为客户操作系统提供了一个虚拟机。VM 形成了硬件层的抽象,因此主机上的每个 VM 都可以充当物理机。

容器化

容器化为我们提供了一个独立的环境来运行我们的应用程序。我们可以在单个服务器或 VM 上使用相同的操作系统部署多个应用程序。容器构成了应用层的抽象,所以每个容器代表一个不同的应用。

  1. 管理程序的功能是什么?
    管理程序或虚拟机监视器是帮助我们创建和运行虚拟机的软件。它使我们能够使用单个主机来支持多个来宾虚拟机。它通过划分主机的系统资源并将它们分配给已安装的来宾环境来实现这一点。可以在单个主机操作系统上安装多个操作系统。有两种类型的管理程序:

Native:本机管理程序或裸机管理程序,直接在底层主机系统上运行。它使我们可以直接访问主机系统的硬件,并且不需要基本服务器操作系统。

托管:托管管理程序使用底层主机操作系统。

  1. 如何构建Dockerfile?
    为了使用我们概述的规范创建映像,我们需要构建一个 Dockerfile。要构建 Dockerfile,我们可以使用以下docker build命令:

$ docker build

  1. 使用什么命令将新镜像推送到 Docker Registry?
    要将新镜像推送到 Docker Registry,我们可以使用以下docker push命令:

$ docker push myorg/img

14.什么是Docker引擎?
Docker Engine 是一种开源容器化技术,我们可以使用它来构建和容器化我们的应用程序。Docker Engine 由以下组件支持:

Docker 引擎 REST API
Docker 命令行界面 (CLI)
Docker 守护进程
15. 如何访问正在运行的容器?
要访问正在运行的容器,我们可以使用以下命令:

$ docker exec -it <container_id> bash

16.如何列出所有正在运行的容器?
要列出所有正在运行的容器,我们可以使用以下命令:

$ docker ps

  1. 描述 Docker 容器的生命周期。
    Docker 容器经历以下阶段:

创建容器
运行容器
暂停容器(可选)
取消暂停容器(可选)
启动容器
停止容器
重启容器
杀死容器
销毁容器
18. 什么是Docker对象标签?
Docker 对象标签是存储为字符串的键值对。它们使我们能够将元数据添加到 Docker 对象,例如容器、网络、本地守护进程、图像、Swarm 节点和服务。

  1. 使用Docker Compose时如何保证容器1先于容器2运行?
    Docker Compose 在继续下一个容器之前不会等待容器准备就绪。为了控制我们的执行顺序,我们可以使用“取决于”条件,depends_on。这是在 docker-compose.yml 文件中使用的示例:
version: "2.4"
services:
 backend:
   build: .
   depends_on:
     - db
 db:
   image: postgres
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

该docker-compose up命令将按照我们指定的依赖顺序启动和运行服务。

20.docker create命令有什么作用?
该docker create命令在指定映像上创建可写容器层,并准备该映像以运行指定命令。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/思考机器6/article/detail/61178
推荐阅读
相关标签
  

闽ICP备14008679号