10 道不得不会的 Docker 面试题
以下是 Docker 面试题,相信大家都会有种及眼熟又陌生的感觉、看过可能在短暂的面试后又马上忘记了。JavaPub 在这里整理这些容易忘记的重点知识及解答,建议收藏,经常温习查阅
。
评论区见
@[toc]
Docker
以下是一些 docker 的基础面试题,下一篇 docker 进阶面试题。本系列《最少必要面试题》
1. 什么是 Docker 容器?
Docker 是一种流行的开源软件平台,可简化创建、管理、运行和分发应用程序的过程。它使用容器来打包应用程序及其依赖项。我们也可以将容器视为 Docker 镜像的运行时实例。
2. Docker 和虚拟机有什么不同?
Docker 是轻量级的沙盒,在其中运行的只是应用,虚拟机里面还有额外的系统。
3. 什么是 DockerFile?
Dockerfile 是一个文本文件,其中包含我们需要运行以构建 Docker 镜像的所有命令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。Docker 使用 Dockerfile 中的指令自动构建镜像。我们可以 docker build
用来创建按顺序执行多个命令行指令的自动构建。
一些最常用的指令如下:
4. 使用 Docker Compose 时如何保证容器 A 先于容器 B 运行?
Docker Compose 是一个用来定义和运行复杂应用的 Docker 工具。一个使用 Docker 容器的应用,通常由多个容器组成。使用 Docker Compose 不再需要使用 shell 脚本来启动容器。Compose 通过一个配置文件来管理多个 Docker 容器。简单理解:Docker Compose 是 docker 的管理工具。
Docker Compose 在继续下一个容器之前不会等待容器准备就绪。为了控制我们的执行顺序,我们可以使用“取决于”条件,depends_on
。这是在 docker-compose.yml 文件中使用的示例
用 docker-compose up
命令将按照我们指定的依赖顺序启动和运行服务。
5. 一个完整的 Docker 由哪些部分组成?
DockerClient 客户端
Docker Daemon 守护进程
Docker Image 镜像
DockerContainer 容器
6. docker 常用命令
命令建议在本地安装做一个实操,记忆会更深刻。也可以克隆基于 docker 的俩万(springboot+vue)项目练手,提供视频+完善文档。地址:https://gitee.com/rodert/liawan-vue
查看本地主机的所用镜像:`docker images``
搜索镜像:`docker search mysql``
下载镜像:
docker pull mysql
,没写 tag 就默认下载最新的 lastest下载指定版本的镜像:`docker pull mysql:5.7``
删除镜像:`docker rmi -f 镜像 id 镜像 id 镜像 id``
7. 描述 Docker 容器的生命周期。
Docker 容器经历以下阶段:
创建容器
运行容器
暂停容器(可选)
取消暂停容器(可选)
启动容器
停止容器
重启容器
杀死容器
销毁容器
8. docker 容器之间怎么隔离?
这是一道涉猎很广泛的题目,理解性阅读。
Linux 中的 PID、IPC、网络等资源是全局的,而 Linux 的 NameSpace 机制是一种资源隔离方案,在该机制下这些资源就不再是全局的了,而是属于某个特定的 NameSpace,各个 NameSpace 下的资源互不干扰。
**Namespace 实际上修改了应用进程看待整个计算机“视图”,即它的“视线”被操作系统做了限制,只能“看到”某些指定的内容。**对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有区别。
虽然有了 NameSpace 技术可以实现资源隔离,但进程还是可以不受控的访问系统资源,比如 CPU、内存、磁盘、网络等,为了控制容器中进程对资源的访问,Docker 采用 control groups 技术(也就是 cgroup),有了 cgroup 就可以控制容器中进程对系统资源的消耗了,比如你可以限制某个容器使用内存的上限、可以在哪些 CPU 上运行等等。
有了这两项技术,容器看起来就真的像是独立的操作系统了。
强烈建议大家实操,才能更好的理解 docker。
1. Redis 是什么?
一般问这个问题你最少要答出以下几点
Redis 是一个基于内存的 key-value 存储系统,数据结构包括字符串、list、set、zset(sorted set --有序集合)和 hash,bitmap,GeoHash(坐标),HyperLogLog,Streams(5.x 版本以后)
2. 你在哪些场景使用 redis
你有实战经验,那就直接表演。如果没有,选几个下面的经典场景
作为队列使用,(因为是基于内存、一般不会作为消费队列、作为循环队列必要适用);
模拟类似于 token 这种需要设置过期时间的场景,登录失效;
分布式缓存,避免大量请求底层关系型数据库,大大降低数据库压力;
分布式锁;
基于 bitmap 实现布隆过滤器;
排行榜-基于 zset(有序集合数据类型);
计数器-对于浏览量、播放量等并发较高,使用 redis incr 实现计数器功能;
分布式会话;
消息系统;
3. 为什么 Redis 是单线程的?
这个问题给一个官方答案
因为 Redis 是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了。
4. Redis 持久化有几种方式?
redis 提供了两种持久化的方式,分别是快照方式(RDB Redis DataBase)和文件追加(AOF Append Only File)。
显而易见,快照方式重启恢复快、但是数据更容易丢失,文件追加数据更完整、重启恢复慢。
混合持久化方式,Redis 4.0 之后新增的方式,混合持久化是结合 RDB 和 AOF 的优点,在写入的时候先把当前的数据以 RDB 的形式写入到文件的开头,再将后续的操作以 AOF 的格式存入文件当中,这样既能保证重启时的速度,又能降低数据丢失的风险。
在恢复时,先恢复快照方式保存的文件,然后再恢复追加文件中的增量数据。
版权声明: 本文为 InfoQ 作者【JavaPub】的原创文章。
原文链接:【http://xie.infoq.cn/article/42b3a11e3a85a2c17a12101ad】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论