Java SpringCloud Docker面试题
- 前言
- 1、什么是 Docker 容器?
- 2、一个完整的Docker由哪些部分组成?
- 3、Docker常用命令?
- 4、描述 Docker 容器的生命周期?
- 5、Docker的工作原理是什么?
- 6、Docker 与 虚拟机 有何不同?
- 7、进入容器的方法有哪些?
- 8、如何临时退出一个正在交互的容器的终端,而不终止它?
- 9、如何在生产中监控 Docker?
- 10、为什么docker镜像要采用这种分层结构呢?
- 11、如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如/etc下的文件,这时其他容器的/etc是否也会被修改?
- 12、什么是 DockerFile?
- 13、什么是Docker Swarm?
- 14、Docker在后台的标准运行过程是什么?
- 15、什么是Docker的数据卷?
- 16、Docker的镜像是什么?
- 17、Docker和虚拟机有什么区别?
- 18、接⼝限流⽅法?
- 19、什么是漏桶算法?
- 20、什么是令牌桶算法?
- 总结
前言
最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux…等等,会持续更新。
如果对老铁有帮助,帮忙免费点个赞,谢谢你的发财手!
1、什么是 Docker 容器?
- Docker 是一个开源的应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 服务器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。
2、一个完整的Docker由哪些部分组成?
- Docker Client 客户端:负责处理用户输入的命令与 Docker 的守护进程通信;
- Docker Daemon 守护进程:负责和Docker client交互;
- Docker Image 镜像:是创建容器的模板,同一个镜像可以创建多个不同的容器,如果把镜像比作程序里面的类,那么容器就是对象。可使用build 命令创建镜像。一个镜像是一个可执行的包,其中包括运行应用程序所需要的代码,依赖库、环境变量、和配置文件。
- Docker Container 容器: 是通过镜像生成的运行实例,不同容器之间是相互隔离、独立运行的,拥有自己的ip和文件目录;运行容器前需要本地存在对应的镜像,如果本地不存在该镜像则会去镜像仓库下载;
- Docker Registry 仓库:用来保存镜像,比如 DockerHub,可以将自己的镜像上传上去,每个镜像可以有不同标签(tag),可以理解为代码控制中的代码仓库。
3、Docker常用命令?
- 查看本机的所用镜像:
docker images
; - 搜索镜像:docker search mysql;
- 下载拉取镜像:docker pull mysql,没写 tag 就默认下载最新的 lastest;
- 将镜像推送至远程仓库:docker push mysql
- 清理一个或多个镜像:docker rmi -f 镜像id 镜像id 镜像id;
- 创建(并运行)容器:docker create(run), 通常一个容器就是一个应用或一个服务,也是我们常说的微服务;
- 启动/停止/杀死已有的容器:docker start/stop/kill <container_id>;
- 查看运行中/全部的容器:docker ps/ps -a;
- 导入/导出容器:docker import/export;
- 查看和配置仓库:cat /etc/docker/daemon.json;
- 容器与主机之间的数据拷贝:docker cp。
4、描述 Docker 容器的生命周期?
- Docker 容器经历以下阶段:
创建容器、运行容器、启动容器、停止容器、重启容器、杀死容器、销毁容器。
5、Docker的工作原理是什么?
- Docker是一个C/S架构的系统,docker守护进程运行在宿主机上,它从客户端接受命令并管理运行在主机上的容器,容器是一个运行时环境,也就是我们说的集装箱。
6、Docker 与 虚拟机 有何不同?
- 1、传统虚拟机是需要安装整个操作系统的,然后再安装应用,启动应用,通常需要几分钟,而docker是直接使用镜像来运行业务容器的,只需要几秒钟就可以启动了;
- 2、Docker消耗的资源更少,Docker容器和内核交互,几乎没有性能损耗,而虚拟机运行着整个操作系统,占用物理机的资源就比较多;
- 3、Docker更轻量,Docker的架构可以共用一个内核与共享应用程序库,所占内存极小;同样的硬件环境,Docker运行的镜像数远多于虚拟机数量,对系统的利用率非常高;
- 4、Docker隔离性会弱一些,Docker属于进程之间的隔离,而虚拟机是系统级别的隔离; Docker通过签名机制来对镜像进行验证隔离,并采用了cgroup技术(control groups),可以限制某个容器使用内存的上限、可以在哪些CPU上运行等等。
- 5、Docker安全性也弱一些,,Docker的租户root和宿主机root相同,一旦容器内的用户从普通用户权限提升为root权限,它就直接具备了宿主机的root权限,可以随意的操作。但虚拟机租户root和宿主机的root是分开的。
7、进入容器的方法有哪些?
- 1、使用docker attach 784fd3b294d7,attach是直接进入容器启动命令的终端,不会启动新的进程;
- 2、使用 docker exec -it 784fd3b294d7 /bin/bash,exec则是在容器里面打开新的终端,会启动新的进程;
一般建议用exec进入容器。
8、如何临时退出一个正在交互的容器的终端,而不终止它?
- 按Ctrl+p,后按Ctrl+q
如果按Ctrl+c会使容器内的应用进程终止,进而会使容器终止。
9、如何在生产中监控 Docker?
- Docker 提供 docker stats 和 docker events等命令来监控生产中的 Docker。
- Docker stats:可以获得容器的CPU,内存使用情况等。它类似于 Linux 中的 top 命令。
- Docker events:可以实时输出 Docker 服务器端的事件,包括容器的创建、启动、关闭等。
10、为什么docker镜像要采用这种分层结构呢?
最大的一个好处是:共享资源。
比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。
11、如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如/etc下的文件,这时其他容器的/etc是否也会被修改?
不会,在容器中修改已存在的文件时,Docker会从上往下依次在各镜像层中查找此文件,一旦找到,立即将其复制到容器层,然后修改它,这就是容器的copy-on-write特性;
所有对容器的改动,无论添加、删除、还是修改文件,都只会发生在容器层中,因为只有容器层是可写的,容器层下面的基础镜像都是只读的,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。
(如果不同层中有一个相同路径的文件,那么上层的会覆盖下层的,也就是说用户只能访问到上层中的文件)。
12、什么是 DockerFile?
- Dockerfile 是一个文本文件,其中包含我们需要运行以构建 Docker镜像的所有命令。
我们可以用docker build来自动构建镜像。
13、什么是Docker Swarm?
- Docker Swarm 是一个容器编排工具,它允许我们跨不同主机管理多个容器。
使用 Swarm,我们可以将多个 Docker 主机变成单个主机,以便于监控和管理。
14、Docker在后台的标准运行过程是什么?
当使用docker run来创建容器时,运行过程大概是:
- 1、检查本地是否存在指定的镜像。当镜像不存在时,会从镜像仓库下载;
- 2、利用镜像创建并启动一个容器;
- 3、分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
- 4、从宿主机配置的网桥接口中桥接一个虚拟机接口到容器中;
- 5、分配一个地址池中的 IP 地址给容器;
- 6、执行用户指定的应用程序,执行完毕后容器被终止运行
15、什么是Docker的数据卷?
数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于Linux下对目录进行的mount操作。
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。
容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。
16、Docker的镜像是什么?
- Docker镜像是Docker容器运行所需的一切,是一个独立的软件包,包含了应用程序、本地库、其他依赖项和预配置设置等。
- Docker镜像可以轻松地创建、部署、共享和存储,可以通过Docker Hub或私有仓库共享给其他用户或团队。
17、Docker和虚拟机有什么区别?
Docker与传统虚拟机的不同之处在于,虚拟机模拟了整个操作系统,而Docker只是模拟了容器。
这种容器化技术可以避免虚拟机的资源浪费和分布式环境下难以部署的问题,容器在系统层面上隔离,运行在同一系统内,但是不会干扰到其他容器和主机。
18、接⼝限流⽅法?
限制总并发数(⽐如:数据库连接池、线程池)
- 1、限制 瞬时并发数(如 nginx 的 limit_conn 模块,⽤来限制 瞬时并发连接数)
- 2、限制 时间窗⼝内的平均速率(如 Guava 的 RateLimiter、nginx 的 limit_req模块,限制每秒的平均速率)
- 3、限制 远程接⼝调⽤速率
- 4、限制 MQ 的消费速率
- 5、可以根据 ⽹络连接数、⽹络流量、CPU或内存负载等来限流。
19、什么是漏桶算法?
规则接口是IRule
漏桶算法思路很简单,请求先进入到漏桶里,漏桶以固定的速度出水,也就是处理请求,当水加的过快,则会直接溢出,也就是拒绝请求,因此漏桶算法能够限制请求调用的速率。
20、什么是令牌桶算法?
从某种意义上讲,令牌桶算法是对漏桶算法的一种改进,令牌桶算法能够限制请求调用的速率,同时还能防止一定程度的突发调用。在令牌桶算法中,存在一个桶,用来存放固定数量的令牌,以一定的速率往桶中放令牌,每次调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则只能进行等待或者直接拒绝。
如果桶中令牌数达到上限,就丢弃令牌,比如设置qps为100,那么限流器初始化完成后,桶中就已经有100个令牌了,等启动完成对外提供服务时,该限流器可以抵挡瞬时的100个请求,从而避免服务挂掉。
- 实现思路:可以准备一个队列,用来保存令牌,另外通过一个线程池定期生成令牌放到队列中,每来一个请求,就从队列中获取一个令牌,从而实现限流。
总结
都已经看到这里啦,赶紧收藏起来,祝您工作顺心,生活愉快!