Docker 面试题汇总(附答案)

本文首发在个人博客上(Docker 面试题汇总(附答案)),欢迎来踩!

建议和这篇一起观看,更加全面一些:万字总结!Docker简介及底层关键技术剖析

Docker 底层原理、概念类问题

1. Docker 和 LXC 有什么区别?

LXC是在Linux上相关技术实现的容器,docker则在如下的几个方面进行了改进:

1、移植性:通过抽象容器配置,容器可以实现一个平台移植到另一个平台。

2、镜像系统:基于AUFS的镜像系统为容器的分发带来了很多的便利,通是共同的镜像层只需要存储一份,实现高效率的存储。

3、版本管理:类似于GIT的版本管理理念,用户可以更方便的创建、管理镜像文件。

4、仓库系统:仓库系统大大降低了镜像的分发和管理的成本。

5、周边工具:各种现有的工具(配置管理、云平台)对docker的支持,以及基于docker的pass、Cl等系统,让docker的应用更加方便和多样。

2. Docker 容器有几种状态?

四种状态:运行、已停止、重新启动、已退出。

3. Docker 有哪些优缺点?

docker优点

1、部署方便

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

2、部署安全

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

3、隔离性好

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

4、快速回滚

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

5、成本低

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

6、管理成本更低

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

docker缺点

1、隔离性

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

2、性能

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

4. 什么是Docker容器?

Docker容器在应用层创建了一个抽象,并将应用与所有的依赖关系打包在一起。这使我们能够快速、可靠地部署应用程序。容器不要求我们安装一个不同的操作系统。相反,它们使用底层系统的CPU和内存来执行任务。这意味着,任何容器化的应用程序都可以在任何平台上运行,而不受底层操作系统的影响。我们也可以把容器看作是Docker镜像的运行时实例。

5. 解释一下Docker组件。

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

Docker客户端。这个组件执行构建和运行操作,与Docker主机通信。
Docker主机。这个组件持有Docker守护程序、Docker镜像和Docker容器。该守护程序设置了与Docker注册中心的连接。
Docker Registry。这个组件存储Docker镜像。它可以是一个公共注册表,如Docker Hub或Docker Cloud,或一个私人注册表。

6. 虚拟化和容器化之间有什么区别?

虚拟化
虚拟化帮助我们在一台物理服务器上运行和托管多个操作系统。在虚拟化中,管理程序给客人操作系统一个虚拟机。虚拟机形成了硬件层的抽象,所以主机上的每个虚拟机都可以作为一个物理机。
容器化
容器化为我们提供了一个隔离的环境来运行我们的应用程序。我们可以在一台服务器或虚拟机上使用同一操作系统部署多个应用程序。容器形成了应用层的抽象,所以每个容器代表了不同的应用。

7. 描述一下Docker容器的生命周期。

Docker容器会经历以下几个阶段。

创建一个容器
运行该容器
暂停容器(可选)
解除容器的暂停(可选
启动容器
停止容器
重新启动容器
杀死容器
销毁容器

8. Docker 容器有几种在状态?

starting 运行状态
Exited 退出状态
Paused 暂停状态
healthy 健康状态
unhealthy 非健康状态

9. 平时安装进虚拟机的 CentOS 镜像都是 4.4 GB ,为什么 Docker 的镜像才只有 200 MB ?

Docker 镜像仅包含运行所需的最小 runtime 环境,即仅需要 rootfs 即可。对于一个精简的 OS ,rootfs 可以很小,只需要包括最基本的命令、工具和程序库即可,因为底层直接共用 Host 主机的 kernel ,自己只需要提供 rootfs 即可。由此可见对于不同的 Linux 发行版,bootfs 基本是一致的,只有 rootfs 会有差别,因此不同的发行版可以共用 bootfs 。

Docker 基本操作类问题

2. 容器退出后, 通过 docker ps 命令查看不到,数据会丢失么?

容器退出后会处于终止(exited)状态, 此时可以通过docker ps -a查看。

其中的数据也不会丢失,还可以通过docker [container] start命令来启动它。只有删除掉容器才会清除所有数据。

2. 什么是Docker Hub?

Docker hub是一个基于云的注册表服务,允许您链接到代码存储库,构建镜像并测试它们,存储手动推送的镜像以及指向Docker云的链接,以便可以将镜像部署到主机。它为整个开发流程中的容器镜像发现,分发和变更管理,用户和团队协作以及工作流自动化提供了集中资源。

3. 如何临时退出一个正在交互的容器的终端,而不终止它?

按Ctrl+p,后按Ctrl+q,如果按Ctrl+c会使容器内的应用进程终止,进而会使容器终止。

4. 很多应用容器都是默认后台运行的,怎么查看它们的输出和日志信息?

使用docker logs,后面跟容器的名称或者ID信息

5. 可以在一个容器中同时运行多个应用进程吗?

一般不推荐在同一个容器内运行多个应用进程,如果有类似需求,可以通过额外的进程管理机制,比如supervisord来管理所运行的进程

6. 如何从Docker镜像中创建一个Docker容器?

为了从镜像中创建一个容器,我们从Docker资源库中拉出我们想要的镜像并创建一个容器。我们可以使用以下命令。

docker run -it -d <image_name>

-it: 这两个选项结合起来表示在交互模式下运行容器*,并且分配一个伪终端(pseudo-TTY)。
-d: 这个选项表示在后台(detached)模式下运行容器,即使你退出终端或会话,容器也会继续运行。
: 这里应该替换成你要运行的容器的镜像名称。

7. 有什么常用的 Docker 命令?

  • docker pull 拉取镜像
  • docker create 创建容器
  • docker rm 删除容器
  • docker ps 列出正在运行的容器列表
  • docker run 创建容器并运行指定命令
  • docker start 启动容器
  • docker stop 停止运行容器
  • docker restart 重启容器
  • docker rm 删除容器
  • docker exec 容器执行指定命令
  • docker rmi 删除镜像

8. 如何把主机的东西拷贝到容器内部?

  • 通过 docker cp 命令即可,还能把容器内部内容拷贝到主机

9. 如何让容器随着 Docker 服务启动而自动启动?

  • 创建容器时,加上 --restart=always 参数
  • 创建容器后,通过修改容器配置文件的 RestartPolicy 参数值
  • 创建容器后,使用 docker update 命令更新容器的 --restart 参数值

10. 如何查看官方镜像服务的默认端口是什么?

  • 可以通过 docker inspect 查看镜像信息,然后找到端口映射一栏
  • 也可以先用该镜像创建一个容器并运行,通过 docker ps 查看运行端口是什么

11. 如何修改容器的端口映射?

  • 删除容器,重新创建容器,并指定端口映射
  • 通过容器配置文件修改端口映射
  • 通过 docker commit 将容器构建为一个全新的镜像,然后再通过该镜像创建新的容器,并指定端口映射

参考资料

  1. 2022年最全Docker面试题附答案解析大汇总
  2. 排名前20的Docker面试问题(附答案)
  3. Docker面试题总结(配答案)

你可能感兴趣的:(docker,容器,运维)