Docker常见面试题汇总(持续更新中...)

1. 什么是 Docker 容器?

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

2. 什么是 DockerFile? 

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

3. 如何从 Docker 镜像创建 Docker 容器? 

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

$ docker run -it -d 
选项 选项简写 说明
–detach -d 在后台运行容器,并且打印容器id。
–interactive -i 即使没有连接,也要保持标准输入保持打开状态,一般与 -t 连用。
–tty -t 分配一个伪tty,一般与 -i 连用。

 4. Docker Compose 可以使用 JSON 代替 YAML 吗?

是的,我们可以对Docker Compose文件使用 JSON 文件而不是YAML

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

-f,–file FILE指定Compose模板文件,默认为docker-compose.yml,可以多次指定。

5. 什么是Docker Swarm? 

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

6. 如果你想使用一个基础镜像并对其进行修改,你怎么做? 

我们可以使用以下 Docker 命令将图像从 Docker Hub 拉到我们的本地系统上:

$ docker pull 

 7. 如何启动、重启、停止和终止容器?

要启动 Docker 容器,请使用以下命令:

$ docker start 

要重新启动 Docker 容器,请使用以下命令:

$ docker restart 

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

$ docker stop 

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

$ docker kill 

  8. 停止和终止容器的区别?

两个命令都是停止容器,不同之处在于:

docker stop: 先发 SIGTERM 信号给容器,允许其在一定时间(默认 10s)内进行一些操作,若这段时间内容器未停止,则发送 SIGKILL 信号强行杀掉容器;

docker kill: 直接发送 SIGKILL 信号杀掉容器。

这两个命令在实际使用时,通俗说法就是 stop 类似按关机键关机,kill 则相当于直接拔电源。

9. Docker save,export 与 commit区别 

这三个命令都是打包,不过各自有一些区别:

docker save:打包一个或多个镜像,命令格式为 docker save -o 文件名.tar 镜像名称 ,如果是多个镜像,则用空格隔开即可。

虽然理论上这条指令是用来打包镜像的,但指定对象为容器也可以,会自动打包容器背后对应的镜像。

打包后再载入的命令为 docker load -i 镜像名.tar,如果本地已经存在名称相同的镜像,则会被覆盖。

save 命令主要用途比较有限,就是镜像的单纯打包,比如一个应用是使用 docker-compose.yml 编排的多个镜像组合,然后要迁移到另一台无法联网的宿主机上,那么就可以使用此命令导出镜像,再导入到宿主机上。

save 命令打包的镜像会保留历史记录。


docker export:用于将容器打包成基础镜像,主要作用就是制作基础镜像,比如拉取了一个空白系统镜像,创建容器后安装了一堆自己需要的环境,就可以使用 export 命令打包成自己的基础镜像,作为后续使用。

export 打包的镜像,使用 import 命令进行导入,导入时可以指定新的镜像名称,本地如有相同名称的镜像,则原有镜像的名称会被拿掉,赋予给新导入的镜像,原镜像变成只能通过镜像 ID 进行管理。

export 导出的镜像不会保留历史记录


docker commit:commit 是一个综合性的容器打包命令,基本作用和 export 类似,也是将修改后的容器打包成镜像,而且打包时可以对镜像添加作者/版本号/仓库名等描述内容。

commit 命令主要常用于将打包好的镜像推送到仓库,以及对仓库里镜像推送版本更新。

 10. 解释 Docker 组件。

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

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

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

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

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

虚拟化

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

容器化

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

Docker常见面试题汇总(持续更新中...)_第1张图片

 12.Dockerfile保留字?

  • FROM:指定基础镜像
  • MAINTAINER:镜像维护者姓名及邮箱地址
  • RUN:容器构建时需要运行的命令
  • EXPOSE:当前容器对外暴露的端口号
  • WORKDIR:指定在创建容器后,终端默认登录进来的工作目录
  • ENV:用来在构建镜像过程中设置环境变量
  • ADD:将宿主机目录下的文件拷贝进镜像,ADD命令会自动处理URL和解压tar压缩包
  • COPY:拷贝文件、目录到镜像中。具体是将从构建上下文目录中的文件或目录复制到新一层镜像的<目标路径>位置 ,有两种写法:COPY src dest 或者 COPY ["src", "dest"]
  • VOLUME:容器数据卷,用于数据保存和持久化工作
  • CMD:指定一个容器启动时要运行的命令
    • 注意DockerFile中可以有多个CMD指令,但只有最后一个在启动时生效,CMD会被 docker run 之后的命令或参数覆盖
    • CMD指令的格式和RUN相似,也是两种格式:
      • shell格式:CMD <命令>
      • exec格式:CMD ["可执行文件", "参数1", "参数2" ...]
      • 参数列表格式:CMD ["参数1", "参数2", ...],在指定了ENTRYPOINT 指令后,用CMD指定具体的参数。
  • ENTRYPOINT:指定一个容器启动时要运行的命令,与CMD一样都是在指定容器启动程序及参数(下面通过实例2将他们的区别)。
  • ONBUILD:当构建一个被继承的DockerFile时运行命令, 父镜像在被子镜像继承后,父镜像的ONBUILD被触发。

Docker常见面试题汇总(持续更新中...)_第2张图片

13. 使用什么命令将新镜像推送到 Docker Registry?

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

$ docker push myorg/img

14.什么是Docker引擎?

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

  • Docker 引擎 REST API
  • Docker 命令行界面 (CLI)
  • Docker 守护进程

15. 如何访问正在运行的容器? 

进入Docker容器比较常见的几种做法如下:

  • 使用docker attach
  • 使用SSH
  • 使用nsenter
  • 使用exec

exec和attach命令的简单区别:

区别:是否开启一个新的线程

  • docker exec 进入容器后开启一个新的终端,可以在里面操作(常用)
  • docker attach 进入容器正在执行的终端,不会启动新的进程

 16.如何列出所有正在运行/全部的容器?

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

$ docker ps

列出全部容器,可以使用

$ docker ps -a

17. 描述 Docker 容器的生命周期。

Docker 容器经历以下阶段:

  • 创建容器
  • 运行容器
  • 暂停容器(可选)
  • 取消暂停容器(可选)
  • 启动容器
  • 停止容器
  • 重启容器
  • 杀死容器
  • 销毁容器

18. 什么是Docker对象标签(label)?

Docker 对象标签是存储为字符串的键值对。它们使我们能够将元数据添加到 Docker 对象,例如容器、网络、本地守护进程、图像、Swarm 节点和服务。

19. 使用Docker Compose时如何保证容器1先于容器2运行?

Docker Compose 在继续下一个容器之前不会等待容器准备就绪。为了控制我们的执行顺序,我们可以使用“取决于”条件,depends_on。这是在 docker-compose.yml 文件中使用的示例:

version: "2.4"

services:

 backend:

   build: .

   depends_on:

     - db

 db:

   image: postgres

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

TODO

 

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