Docker面试题

时间:2024-11-17 08:49:13

1、如何列出可运行的容器?
docker ps

2、启动nginx容器(随机端口映射),并挂载本地文件目录到容器html的命令是?
docker run -d -P --name nginx2 -v /home/nginx:/usr/share/nginx/html nginx

3、进入容器的方法有哪些?
1、使用 docker attach 命令
2、使用 exec 命令,例如docker exec -i -t 784fd3b294d7 /bin/bash

4、容器与主机之间的数据拷贝命令是?
docker cp 命令用于容器与主机之间的数据拷贝
主机到容器:
docker cp /www 96f7f14e99ab:/www/
容器到主机:
docker cp 96f7f14e99ab:/www /tmp/

什么是Docker

  • Docker是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在开发,测试或生产的任何环境中无缝运行。
  • Docker容器,将一个软件包装在一个完整的文件系统中,该文件系统包含运行所需的一切:代码,运行时,系统工具,系统库等可以安装在服务器上的任何东西。
  • 这可以保证软件始终运行相同,无论其环境如何。

如何使用Docker构建与环境无关的系统?

有三个主要功能有助于实现这一目标:

  • Volumes
  • 环境变量注入
  • 只读文件系统

什么是Docker镜像?

Docker镜像是Docker容器的源代码。换句话说,Docker镜像用于创建容器。使用build命令创建映像,并且在使用run启动时它们将生成容器。镜像存储在Docker注册表中,因为它们可能变得非常大,镜像被设计为由其他镜像层组成,允许在通过网络传输镜像时发送最少量的数据。

什么是Docker容器?

Docker容器包括应用程序及其所有依赖项,但与其他容器共享内核,作为主机操作系统上用户空间中的独立进程运行。Docker容器不依赖于任何特定的基础架构:它们可以在任何计算机,任何基础架构和任何云中运行。

什么是Docker Hub

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

Docker容器有几种状态?

Docker容器可以有四种状态:

  • 运行
  • 已暂停
  • 重新启动
  • 已退出

我们可以通过运行命令来识别Docker容器的状态:

docker ps –a

这将依次列出所有可用的docker容器及其在主机上的相应状态。从那里我们可以很容易地识别感兴趣的容器,以相应地检查其状态。

什么类型的应用程序 无状态或有状态更适合Docker容器?

最好为Docker Container创建无状态应用程序。我们可以从应用程序中创建一个容器,并从应用程序中取出可配置的状态参数。现在我们可以在生产和具有不同参数的QA环境中运行相同的容器。这有助于在不同场景中重用相同的图像。使用Docker Containers比使用有状态应用程序更容易扩展无状态应用程序。

解释基本的Docker使用流程

  1. 一切都从Dockerfile开始。Dockerfile是镜像的源代码。
  2. 创建Dockerfile后,您可以构建它以创建容器的镜像。镜像只是“源代码”的“编译版本”,即Dockerfile。
  3. 获得容器的镜像后,应使用注册表重新分发容器。注册表就像一个git存储库 - 你可以推送和拉取镜像。
  4. 接下来,您可以使用该镜像来运行容器。在许多方面,正在运行的容器与虚拟机(但没有管理程序)非常相似。

Dockerfile中最常见的指令是什么?

Dockerfile中的一些常用指令如下:

  • FROM:我们使用FROM为后续指令设置基本镜像。在每个有效的Dockerfile中,FROM是第一条指令。
  • LABEL:我们使用LABEL按照项目,模块,许可等组织我们的镜像。我们也可以使用LABEL来帮助实现自动化。在LABEL中,我们指定一个键值对,以后可用于以编程方式处理Dockerfile。
  • RUN:我们使用RUN命令在当前镜像之上的新图层中执行任何指令。使用每个RUN命令,我们在镜像顶部添加一些内容,并在Dockerfile的后续步骤中使用它。
  • CMD:我们使用CMD命令提供执行容器的默认值。在Dockerfile中,如果我们包含多个CMD命令,则只使用最后一条指令。

Dockerfile中的命令COPYADD****命令有什么区别?

一般而言,虽然ADD并且COPY在功能上类似,但是COPY是优选的。

那是因为它比ADD更透明。COPY仅支持将本地文件基本复制到容器中,而ADD具有一些功能(如仅限本地的tar提取和远程URL支持),这些功能并不是很明显。因此,ADD的最佳用途是将本地tar文件自动提取到镜像中,如ADD /中所示。

解释一下dockerfileONBUILD指令?

当镜像用作另一个镜像构建的基础时,ONBUILD指令向镜像添加将在稍后执行的触发指令。如果要构建将用作构建其他镜像的基础的镜像(例如,可以使用特定于用户的配置自定义的应用程序构建环境或守护程序),这将非常有用。

Docker****镜像和层有什么区别?

  • 镜像:Docker镜像是由一系列只读层构建的
  • 层:每个层代表镜像Dockerfile中的一条指令。

下面的Dockerfile包含四个命令,每个命令都创建一个层。

​ FROM ubuntu:15.04 COPY . /app RUN make /app CMD python /app/

重要的是,每个层只是与之前一层的一组差异层(相同的就不再放到新层中)。

什么是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中使用。

如何在多个环境中使用Docker

可以进行以下更改:

  • 删除应用程序代码的任何卷绑定,以便代码保留在容器内,不能从外部更改
  • 绑定到主机上的不同端口
  • 以不同方式设置环境变量(例如,减少日志记录的详细程度,或启用电子邮件发送)
  • 指定重启策略(例如,重启:始终)以避免停机
  • 添加额外服务(例如,日志聚合器)

因此,您可能希望定义一个额外的Compose文件,例如,它指定适合生产的配置。此配置文件只需要包含您要从原始Compose文件中进行的更改。

docker-compose -f docker-com

为什么Docker Compose不会等待容器准备就绪,然后继续以依赖顺序启动下一个服务?

Compose按照依赖顺服启动和停止容器,决定依赖关系语句有 depends_on, links, volumes_from, 和network_mode: “service:…”.

但是,对于启动,Compose不会等到容器“准备好它运行“。这里有一个很好的理由:

  • 等待数据库(例如)准备就绪的问题实际上只是分布式系统更大问题的一个子集。在生产中,您的数据库可能随时变得不可用或移动主机。您的应用程序需要能够适应这些类型的故障。
  • 要处理此问题,请将应用程序设计为在发生故障后尝试重新建立与数据库的连接。如果应用程序重试连接,它最终可以连接到数据库。
  • 最佳解决方案是在启动时以及出于任何原因丢失连接时,在应用程序代码中执行此检查。

docker的优势:

提供一致的运行环境,容易迁移

使用分层和镜像的概念,容易维护,容易扩展

虚拟机需要完整的操作系统,资源消耗大,docker只是一个进程

1、如何批量删除或者停止运行的容器?

docker kill/rm docker ps -aq

2、如何查看镜像支持的环境变量?

使用sudo docker run IMAGE env

3、本地的镜像文件都存放在哪里

Docker相关的本地资源存放在/var/lib/docker/目录下,其中container目录存放容器信息,graph目录存放镜像信息,aufs目录下存放具体的镜像底层文件。

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

容器退出后会处于终止(exited)状态,此时可以通过 docker ps -a 查看,其中数据不会丢失,还可以通过docker start 来启动,只有删除容器才会清除数据。

在这里还要注意开启容器的时候是否添加了–rm参数

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

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

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

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

8、使用docker port 命令映射容器的端口时,系统报错Error: No public port ‘80’ published for …,是什么意思?

创建镜像时Dockerfile要指定正确的EXPOSE的端口,容器启动时指定PublishAllport=true

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

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

10、如何控制容器占用系统资源(CPU,内存)的份额?

在使用docker create命令创建容器或使用docker run 创建并运行容器的时候,可以使用-c|–cpu-shares[=0]参数来调整同期使用CPU的权重,使用-m|–memory参数来调整容器使用内存的大小。

11、仓库(Repository)、注册服务器(Registry)、注册索引(Index)有何关系?

首先,仓库是存放一组关联镜像的集合,比如同一个应用的不同版本的镜像,注册服务器是存放实际的镜像的地方,注册索引则负责维护用户的账号,权限,搜索,标签等管理。注册服务器利用注册索引来实现认证等管理。

12 、从非官方仓库(如:)下载镜像的时候,有时候会提示“Error:Invaild registry endpoint :5000/v1/…”?

Docker 自1.3.0版本往后以来,加强了对镜像安全性的验证,需要手动添加对非官方仓库的信任。

DOCKER_OPTS=”–insecure-registry :5000”

重启docker服务

13、Docker的配置文件放在那里。如何修改配置?

Ubuntu系统下Docker的配置文件是/etc/default/docker,CentOS系统配置文件存放在/etc/sysconfig/docker

14、如何更改Docker的默认存储设置?

Docker的默认存放位置是/var/lib/docker,如果希望将Docker的本地文件存储到其他分区,可以使用Linux软连接的方式来做。

Docker与虚拟化

15、Docker与LXC(Linux Container)有何不同?

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

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

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

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

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

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

16 、Docker与Vagrant有何不同?

两者的定位完全不同
类似于Boot2Docker(一款运行Docker的最小内核),是一套虚拟机的管理环境,Vagrant可以在多种系统上和虚拟机软件中运行,可以在Windows。Mac等非Linux平台上为Docker支持,自身具有较好的包装性和移植性。

2.原生Docker自身只能运行在Linux平台上,但启动和运行的性能都比虚拟机要快,往往更适合快速开发和部署应用的场景。

17、开发环境中Docker与Vagrant该如何选择?

Docker不是虚拟机,而是进程隔离,对于资源的消耗很少,单一开发环境下Vagrant是虚拟机上的封装,虚拟机本身会消耗资源。

18 、如何将一台宿主机的docker环境迁移到另外一台宿主机?

停止Docker服务,将整个docker存储文件复制到另外一台宿主机上,然后调整另外一台宿主机的配置即可

19、Docker容器创建后,删除了/var/run/netns 目录下的网络名字空间文件,可以手动恢复它:

docker面试相关
/luyongchuan/article/details/88788315
面试题: Docker的优缺点
/developer/article/1457282

什么是Docker?

Docker是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中无缝运行。

CI(持续集成)服务器的功能是什么?

CI功能就是在每次提交之后不断地集成所有提交到存储库的代码,并编译检查错误

什么是Docker镜像?

Docker镜像是Docker容器的源代码,Docker镜像用于创建容器。使用build命令创建镜像

什么是Docker容器?

Docker容器包括应用程序及其所有依赖项,作为操作系统的独立进程运行

Docker容器有几种状态?

Docker容器可以有四种状态:

运行

已暂停

重新启动

已退出

Docker使用流程

1)创建Dockerfile后,您可以构建它以创建容器的镜像

2)推送或拉取镜像。

Dockerfile中最常见的指令是什么?

Dockerfile中的一些常用指令如下:

FROM:指定基础镜像

LABEL:功能是为镜像指定标签

RUN:运行指定的命令

CMD:容器启动时要运行的命令

Dockerfile中的命令COPY和ADD命令有什么区别?

COPY与ADD的区别COPY的只能是本地文件,其他用法一致

docker常用命令?

docker pull 拉取或者更新指定镜像

docker push 将镜像推送至远程仓库

docker rm 删除容器

docker rmi 删除镜像

docker images 列出所有镜像

docker ps 列出所有容器