Go全栈面试题(7) -Docker面试题

title: Docker面试题
tags: Docker
author: Clown95

本文摘抄自 杨保华 戴王剑 曹亚仑编著的《Docker技术入门与实战》
镜像相关 如何批量清理临时镜像文件?
可以使用sudo docker rmi $ (sudo docker images -q -f dangling=true)命令。
如何查看镜像支持的环境变量?
可以使用sudo docker run IMAGE env命令。
本地的镜像文件都存放在哪里?
与Docker相关的本地资源都存放在/var/lib/docker/目录下,其中container目录存放容器信息,graph目录存放镜像信息,aufs目录下存放具体的镜像层文件。
构建Docker镜像应该遵循哪些原则?
整体原则上,尽量保持镜像功能的明确和内容的精简,要点包括:
  • 尽量选取满足需求但较小的基础系统镜像。
  • 清理编译生成文件、安装包的缓存等临时文件。
  • 安装各个软件时候要指定准确的版本号,并避免引人不需要的依赖。
  • 从安全角度考虑,应用要尽量使用系统的库和依赖。
  • 如果安装应用时候需要配置一些特殊的环境变量, 在安装后要还原不需要保持的变量值。
  • 使用Dockerfle创建镜像时候要添加.dockerignore 文件或使用干净的工作目录。
ADD 和 COPY 指令有什么区别?推荐使用哪种方式?
ADD 指令ADD 指令的功能是将主机构建环境(上下文)目录中的文件和目录,拷贝到镜像中,如果源文件是个归档文件,ADD 指令会自动进行解压。如果是个url,ADD又会自动下载文件,。 有趣的是,URL下载和解压功能不能一起使用。任何通过URL复制的压缩文件都不会自动解压缩。当前的ADD指令非常的神奇。它可以添加本地和远程文件。它有时会解压一个文件,它有时不会解压文件。如果某个文件是要复制的tar包,则意外解压缩它。如果该文件是一个压缩格式的tar包,需要解压,则意外复制它。
COPY指令COPY 指令和 ADD 指令类似,都是负责拷贝文件或者目录到容器里,但 COPY 指令功能更简洁和易懂,COPY 是ADD 的一种简化版本,目的在于满足大多数人复制文件到容器的需求。
在大多数情况下,都建议使用 COPY 指令,除非你明确需要ADD指令。
两个 namespace 如何进行通信?
我们都知道,Docker 是基于 LXC容器技术 namespace 来实现资源的隔离,基于 LXC容器技术 cgroups 来实现资源的限制,Docker 采用虚拟网络设置(Virtual Network Device)的方式,将不同命名空间的网络设备连接到一起,这种设备对都是成对存在的,一端作为容器的网卡eth0,一端连接到宿主机上的docker网桥 veth,从而实现 Docker 主机上不同 namespace通信。
简述 Docker 如何用 namespace 来进行资源隔离?
Docker 主要通过六大 Namespace 来实现资源的隔离,如下:
  1. Mount Namespace,挂载命名空间,用来隔离挂载目录,让不同 Namespace 拥有独立的挂载结构,而程序中对挂载信息的修改不会影响到其他 Namespace 中程序的运行。
  2. UTS Namespace,UTS Namespace,用来隔离主机名和域名,通过UTS Namespace,让不同 Namespace 拥有独立的主机名称和网络访问域名。
  3. IPC Namespace,进程通信命名空间,用来隔离进程间通信,主要作用于 消息队列、信号量或者是管道,IPC 只能做到同一个命名空间进行通信,无法做到不同命名空间进行信息交换通信。
  4. PID Namespace,进程命名空间,用来隔离进程的运行信息,PID Namespace 让命名空间拥有独立的进程号管理。
  5. Networt Namespace,网络命名空间,用来隔离网络协议栈,包括网络设备接口、IPV4 和 IPV6 协议等。
  6. User Namespace,用户命名空间,用来隔离用户和用户组信息,通过严格的用户隔离机制,避免 Namespace 中的程序直接操作到宿主机或者其他 Namespace 中的用户。
容器相关 容器退出后,通过docker ps 命令查看不到,数据会丢失么?
容器退出后会处于终止( exited)状态,此时可以通过docker ps -a查看。其中的数据也不会丢失,还可以通过docker start 命令来启动它。只有删除掉容器才会清除所有数据。
如何停止所有正在运行的容器?
可以使用sudo docker kill $ (sudo docker ps -q)命令。
如何清理批量后台停止的容器?
可以使用sudo docker rm $ (sudo docker ps-a -q)命令。
如何给容器指定一个固定IP地址,而不是每次重启容器IP地址都会变?
使用pipework工具
也可以:https://yaxin-cn.github.io/Docker/docker-container-use-static-IP.html
如何临时退出一个正在交互的容器的终端,而不终止它?
按Ctrl-p Ctrl-g。 如果按Ctrl-c往往会让容器内应用进程终止,进而会终止容器。
很多应用容器都是默认后台运行的,怎么查看它们的输出和日志信息?
使用docker logs 命令,后面跟容器名称或ID信息。
使用“dockerport”命令映射容器的端口时,系统报错Error:Nopublicport’80’published for xxxxxx,是什么意思?
  • 创建镜像时Dockerfile 要指定正确的EXPOSE的端口。
  • 容器启动时指定PublishAllPort=true。
可以在一个容器中同时运行多个应用进程吗?
一般并不推荐在同一个容器内运行多个应用进程。如果有类似需求,可以通过一些额外的进程管理机制,比如supervisord来管理所运行的进程。
如何控制容器占用系统资源(CPU、内存)的份额? 答:在使用docker create命令创建容器或使用docker run创建并启动容器的时候,可以使用-cl--cpu-shares[=0]参数来调整容器使用CPU的权重; 使用-m|--memory [=MEMORY]参数来调整容器使用内存的大小。
仓库相关 仓库(Repository)、注册服务器(Registry)、 注册索引(Index)有何关系?
首先,仓库是存放一组关联镜像的集合,比如同一个应用的不同版本的镜像。注册服务器是存放实际的镜像文件的地方。注册索引则负责维护用户的账号、权限、搜索、标签等的管理。因此,注册服务器利用注册索引来实现认证等管理。
从非官方仓库下载镜像时候,有时候会提示“Error:Invalid registry endpoint …?
Docker自1.3.0 版本往后,加强了对镜像安全性的验证,需要手动添加对非官方仓库的信任。编辑Docker配置文件,在其中添加:DOCKER OPTS="--insecure-registry dl.dockerpool.com:5000"之后,重启Docker服务即可。
配置相关 Docker的配置文件放在哪里,如何修改配置?
Ubuntu系统的配置文件是/etc/default/docker,
Centos 系统的配置文件放在/etc/sysconfig/docker。
如何修改Docker默认存储位置?
Docker 的默认存储位置是/var/ lib/docker,如果希望将Docker的本地文件存
储到其他分区,可以使用Linux软连接的方式来完成。
Docker与虚拟化 Docker与LXC (Linux Container)有何不同?
LXC利用Linux上相关技术实现了容器。Docker 则在如下的几个方面进行了改进:
  • 移植性:通过抽象容器配置,容器可以实现从一个平台移植到另个平台;
  • 镜像系统:基于AUFS的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;
  • 版本管理:类似于Git的版本管理理念,用户可以更方便的创建、管理镜像文件;
  • 仓库系统:仓库系统大大降低了镜像的分发和管理的成本;
  • 周边工具:各种现有工具(配置管理、云平台)对,Docker的支持,以及基于Docker的PaaS、CI等系统,让Docker的应用更加方便和多样化。
Docker与Vagrant有何不同?
两者的定位完全不同.
  • Vagrant类似于Boot2Docker (一款运行Docker 的最小内核),是一套虚拟机的管理环境。Vagrant可以在多种系统上和虚拟机软件中运行,可以在Windows、Mac等非Linux平台上为Docker提供支持,自身具有较好的包装性和移植性。
  • 原生的Docker自身只能运行在Linux平台上,但启动和运行的性能都比虚拟机要快,往往更适合快速开发和部署应用的场景。
【Go全栈面试题(7) -Docker面试题】简单说:Vagrant适合用来管理虚拟机,而Docker适合用来管理应用环境。

    推荐阅读