Linux运维工程师 50个常见面试题( 四 )


14、简单描述一下Dockerfile的整个构建镜像过程

  • 首先 , 创建一个目录用于存放应用程序以及构建过程中使用到的各个文件等;
  • 然后 , 在这个目录下创建一个Dockerfile文件 , 一般建议Dockerfile的文件名就是Dockerfile;
  • 编写Dockerfile文件 , 编写指令 , 如 , 使用FORM指令指定基础镜像 , COPY指令复制文件 , RUN指令指定要运行的命令 , ENV设置环境变量 , EXPOSE指定容器要暴露的端口 , WORKDIR设置当前工作目录 , CMD容器启动时运行命令 , 等等指令构建镜像;
  • Dockerfile编写完成就可以构建镜像了 , 使用docker build -t 镜像名:tag . 命令来构建镜像 , 最后一个点是表示当前目录 , docker会默认寻找当前目录下的Dockerfile文件来构建镜像 , 如果不使用默认 , 可以使用-f参数来指定dockerfile文件 , 如:docker build -t 镜像名:tag -f /xx/xxx/Dockerfile ;
  • 使用docker build命令构建之后 , docker就会将当前目录下所有的文件发送给docker daemon , 顺序执行Dockerfile文件里的指令 , 在这过程中会生成临时容器 , 在临时容器里面安装RUN指定的命令 , 安装成功后 , docker底层会使用类似于docker commit命令来将容器保存为镜像 , 然后删除临时容器 , 以此类推 , 一层层的构建镜像 , 运行临时容器安装软件 , 直到最后的镜像构建成功 。
15、Dockerfile构建镜像出现异常 , 如何排查?首先 , Dockerfile是一层一层的构建镜像 , 期间会产生一个或多个临时容器 , 构建过程中其实就是在临时容器里面安装应用 , 如果因为临时容器安装应用出现异常导致镜像构建失败 , 这时容器虽然被清理掉了 , 但是期间构建的中间镜像还在 , 那么我们可以根据异常时上一层已经构建好的临时镜像 , 将临时镜像运行为容器 , 然后在容器里面运行安装命令来定位具体的异常 。
16、Dockerfile的基本指令有哪些?
  • FROM 指定基础镜像(必须为第一个指令 , 因为需要指定使用哪个基础镜像来构建镜像);
  • MAINTAINER 设置镜像作者相关信息 , 如作者名字 , 日期 , 邮件 , 联系方式等;
  • COPY 复制文件到镜像;
  • ADD 复制文件到镜像(ADD与COPY的区别在于 , ADD会自动解压tar、zip、tgz、xz等归档文件 , 而COPY不会 , 同时ADD指令还可以接一个url下载文件地址 , 一般建议使用COPY复制文件即可 , 文件在宿主机上是什么样子复制到镜像里面就是什么样子这样比较好);
  • ENV 设置环境变量;
  • EXPOSE 暴露容器进程的端口 , 仅仅是提示别人容器使用的哪个端口 , 没有过多作用;
  • VOLUME 数据卷持久化 , 挂载一个目录;
  • WORKDIR 设置工作目录 , 如果目录不在 , 则会自动创建目录;
  • RUN 在容器中运行命令 , RUN指令会创建新的镜像层 , RUN指令经常被用于安装软件包;
  • CMD 指定容器启动时默认运行哪些命令 , 如果有多个CMD , 则只有最后一个生效 , 另外 , CMD指令可以被docker run之后的参数替换;
  • ENTRYOINT 指定容器启动时运行哪些命令 , 如果有多个ENTRYOINT , 则只有最后一个生效 , 另外 , 如果Dockerfile中同时存在CMD和ENTRYOINT , 那么CMD或docker run之后的参数将被当做参数传递给ENTRYOINT;
17、如何进入容器?使用哪个命令进入容器有两种方法:docker attach、docker exec 。
18、什么是k8s?说出你的理解K8s是kube.NETes的简称 , 其本质是一个开源的容器编排系统 , 主要用于管理容器化的应用 , 其目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署 , 规划 , 更新 , 维护的一种机制 。


推荐阅读