1、entrypoint & cmd 指令的区别

这主要考察 Dockerfile 良好实践中关于容器启动时运行的命令。

entrypoint 和 cmd 命令都是设置容器启动时要执行的命令,但用法稍有不同。entrypoint 和 cmd 指令都是在 Dockerfile 中定义,但在镜像构建过程中并不会被执行,只有当容器启动时,entrypoint 和 cmd 指令设置的命令才会被执行。Dockerfile 中可以有多个 entrypoint 指令,但生效的只有最后一个 entrypoint 指令,cmd 指令也类似,两者的区别主要如下:

entrypoint 指令一般用来设置容器启动后要执行的命令,这对容器来说,往往是固定不变的。

cmd 指令一般用来设置容器启动后执行命令的默认参数,这对容器来说,往往是可以改变的,cmd 能够被docker run 后面跟的命令行参数替换,一般而言,两者是可以结合使用的。

举个例子


FROM baseimage:v1.0

ENTRYPOINT ["/usr/sbin/nginx"]

CMD [""]


从以上 Dockerfile 设置的 entrypoint 和 cmd 指令来看,容器启动时会运行 nginx 进程,而 cmd 指令可以在执行 docker run 传入参数进行覆盖,如 docker run --name:** -p **:** -g "daemon off",其中 -g "daemon off" 将会被作为命令参数追加到 entrypoint 后面的指令,也就是说最后容器的启动命令为:/usr/sbin/nginx -g "daemon off;",以前台进程来运行 nginx 进程。

2、如何覆盖 entrypoint 和 cmd 指令

这个问题是考察 entrypoint 和 cmd 的格式

CMD 有三种格式:


(1) Exec 格式:CMD ["executabel", "param1", "param2"],这是 CMD 的推荐格式

(2) CMD ["param1", "param2"],这种模式和 entrypoint 结合使用,为 entrypoint 提供额外的参数,此时 entrypoint 必须使用 exec 格式。

(3) Shell 格式:CMD command param1 param2


ENTRYPOINT 有两种格式:


(1) Exec 格式:ENTRYPOINT ["executable", "param1", "param2"],这是 ENTRYPOINT 的推荐方式

(2) Shell 格式:ENTRYPOINT command param1 param2


其中,CMD 无论是哪种格式,都会被 docker run 命令带的参数直接覆盖

而 ENTRYPOINT 无论是哪种格式,ENTRYPOINT 指令一定会被执行,并不会被覆盖,但 ENTRYPOINT 在选择格式时必须格外小心,因为这两种格式的效果差别很大。

Exec 格式


ENTRYPOINT 中的参数始终会被使用,而 CMD 的额外参数可以在容器启动时动态替换掉。


Shell 格式


ENTRYPOINT 的 shell 格式会忽略任何 CMD 或者 docker run 提供的任何参数。


3、ADD 和 COPY 指令有什么区别?推荐使用哪种方式

这几道面试题都是 Dockerfile 良好实践中的知识点,这道题主要考察在构建镜像时,如何向镜像拷贝文件。

ADD 指令


ADD 指令的功能是将主机构建环境(上下文)目录中的文件和目录,拷贝到镜像中,如果源文件是个归档文件(压缩文件,如tar, gzip, bzip2),ADD 指令会自动进行解压,如:

ADD /foo.tar.gz /tmp/

上述指令会将 foo.tar.gz 压缩文件解压到容器的 /tmp 目录下。


COPY指令


COPY 指令和 ADD 指令类似,都是负责拷贝文件或者目录到容器里,但 COPY 指令功能更简洁和易懂,COPY 是ADD 的一种简化版本,目的在于满足大多数人复制文件到容器的需求,在大多数情况下,都建议使用 COPY 指令,除非你明确需要ADD指令


4、sed、grep 和 awk 命令的区别

这道是考察 linux 常见运维命令。

简单理解,grep 命令主要用于关键字的筛选,sed 指令是以行为单位的文本编辑工具,而 awk 指令通过指定分割符将一行(一条记录)划分为多个字段,以字段为单位来处理文本,一般结合 grep 命令来使用,比如只打印第一列,如:cat /etc/hosts | grep *** | awk '{print $1}',更详细的说明可以参考以下文档:

sed grep 和 awk的区别

5、两个 namespace 如何进行通信

这道题主要考察 Docker 主机两个 namespace(容器)或者是容器与主机如何进行通信的原理。

我们都知道,Docker 是基于 LXC容器技术 namespace 来实现资源的隔离,基于 LXC容器技术 cgroups 来实现资源的限制,Docker 采用虚拟网络设置(Virtual Network Device)的方式,将不同命名空间的网络设备连接到一起,这种设备对都是成对存在的,一端作为容器的网卡eth0,一端连接到宿主机上的docker网桥 veth,从而实现 Docker 主机上不同 namespace通信,详情可见下图:

 
多个network namespace通过bridge来进行通信

或者参考如下文档:docker namespace

6、简述 Docker 如何用 namespace 来进行资源隔离

这道题主要也是考察 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 中的用户。

除了 Namespace ,还有一项核心技术 Cgroups(控制组),可以参考这篇博客:Docker底层技术架构

7、glusterfs 分布式存储元数据不一致时,如何恢复处理

这道是考察存储相关的知识。

对存储底层了解的不多,因此到时这道题我就简单粗暴地说重启 glusterfs服务进程,明显没有 get 到面试官的点。

后来查阅相关的资料,说是跟时间戳有关系,但本人也没有验证过,详细可以参考这篇博客:glusterfs 数据不一致处理

8、service 对外提供服务的方式有几种

这道是考察外部如何访问 k8s 集群内的 service 服务。

目前来说总共有以下4种方式:

NodePort 方式


这种方式会将 Service 的端口映射到集群内的所有的 node节点,集群内的所有 node 节点都会起一个相同的随机端口,通过访问:${任一node节点IP}:${nodeport端口} 就可以访问到 k8s 集群内指定的 service 服务了,iptables 会捕获这种方式的请求,根据 iptables 中的规则转发到后端具体的 pod 实例上,这种方式简单,但会占用 node 节点的端口资源,并且 nodeport 没有一个负载均衡器进行路由分发,这也就衍生了第二种方式。


LoadBalancer 方式


这种方式,在nodeport的外部搭建一个负载均衡器(云服务提供商),但 LoadBalancer 需要 k8s 集群跑在支持的 Cloud Provider 上,这对于企业内部运行在私有云上的 k8s 集群不太适合。


Ingress 方式


Ingress 主要有两大组件, Ingress 和 Ingress Controller,其中 Ingress 解决的是服务和域名的对应问题,基本上一个 Ingress 对象,通过 yaml 文件进行创建和更新,而 Ingress Controller 是将 Ingress 的这种变化动态生成一段 nginx 的配置,并通过 apiserver 更新到 nginx 这个 pod 中,并自动 reload。


Router 方式


这种方式是 Openshift 特有的方式,通过为 k8s 集群内的每个 service 对象生成一个 Router 对象,就能实现外界访问 k8s 集群内的 service 服务了。


9、ovs 访问外部服务 ovs 网桥到物理网卡是如何连接的

这道是考察 sdn 网络 openvswitch的架构和组成。

正常跨节点之间的通信是通过 vxlan 隧道 或者是 gre连接来完成,见下图:

 
gre连接

但如果集群内的容器要访问外部服务,是通过ovs 的 tun0 端口来完成。

【原创】docker & kubernetes问题总结的更多相关文章

  1. GitLab + Jenkins + Docker + Kubernetes。

    目前方案是GitLab + Jenkins + Docker + Kubernetes. 方案的工作流程如下:首先,开发人员提交代码代码提交:随后,GitLab 会自动触发Jenkins job,Je ...

  2. Docker&Kubernetes沙龙干货集锦:容器集群管理利器kubernetes详谈-CSDN.NET

    Docker&Kubernetes沙龙干货集锦:容器集群管理利器kubernetes详谈-CSDN.NET undefined Package - crawler undefined 科学网- ...

  3. 7月19日Docker&Kubernetes技术沙龙总结 - DockOne.io

    7月19日Docker&Kubernetes技术沙龙总结 - DockOne.io undefined

  4. Docker Kubernetes 项目

    Kubernetes 是 Google 团队发起并维护的基于Docker的开源容器集群管理系统,它不仅支持常见的云平台,而且支持内部数据中心. 建于Docker之上的Kubernetes可以构建一个容 ...

  5. Docker Kubernetes 环境搭建

    Docker Kubernetes 环境搭建 节点规划 版本 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 etcd存储版本:etcd-3. ...

  6. Docker Kubernetes 常用命令

    Docker Kubernetes 常用命令 增 # 通过文件名或标准输入创建资源. kubectl create # 读取指定文件内容,进行创建.(配置文件可指定json,yaml文件). kube ...

  7. Docker Kubernetes 查询字段说明

    Docker Kubernetes  查询字段说明 # 打印受支持的API版本 kubectl api-versions # 扩展 apiextensions.k8s.io/v1beta1 # 注册 ...

  8. Docker Kubernetes 命令行创建容器

    Docker Kubernetes 命令行创建容器 环境: 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 管理节点:192.168.1.79 ...

  9. Docker Kubernetes 创建管理 Pod

    Docker Kubernetes 容器扩容与缩容 环境: 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 管理节点:192.168.1.79 ...

  10. Docker Kubernetes 创建管理 Deployment

    Docker Kubernetes YAML文件创建容器 通过创建Deployment来管理pods从而创建容器.它会同时创建容器.pod.以及Deployment ! 环境: 系统:Centos 7 ...

随机推荐

  1. web测试误区:浏览器后退键退出系统会话失效

    通过最近测试的项目,认识到实际:浏览器后退键退出系统,会话仍旧有效.打破了之前认为浏览器后退键就会退出系统登录的认知. 一,了解Cookie和Session的作用,具体来说cookie机制采用的是在客 ...

  2. windows下的:开始→运行→命令

    开始→运行→命令 集锦                          winver---------检查Windows版本wmimgmt.msc----打开windows管理体系结构(WMI)wu ...

  3. [Usaco2007 Dec]Building Roads 修建道路

    题目描述 Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场).有些农场 ...

  4. 2V转3V的电源芯片电路图,2.4V转3V电路

    两节镍氢电池1.2V+1.2V是2.4V的标称电压,2.4V可以转3V输出电路应用. 在2.4V转3V和2V转3V的应用中,输出电流可最大600MA. 2V的低压输入,可以采用PW5100低压输入专用 ...

  5. linux 文件目录权限

    文件目录权限: 什么是文件权限: 在Linux中,每个文件都有所属的所有者,和所有组,并且规定了文件的所有者,所有组以及其他人对文件的,可读,可写,可执行等权限. 对于目录的权限来说,可读是读取目录文 ...

  6. linux串口编程

    按照对linux系统的理解,串口编程的顺序无非就是open,read,write,close,而串口有波特率.数据位等重要参数需要设置,因此还应该用到设置函数,那么接下来就带着这几个问题去学习linu ...

  7. python元组 列表 (取值、替换、插入、添加、删除)

    1.元组 列表 字典 元组( 元组是不可变的) hello = (1,2,3,4,5) type(hello)

  8. 3.kafka安装配置

    kafka安装配置 ### 1.集群规划 hadoop102 hadoop103 hadoop104 zk zk zk kafka kafka kafka jar包下载 http://kafka.ap ...

  9. 网络Devops探索与实践 流程管理分析师

    https://mp.weixin.qq.com/s/OKLiDi78uB8ZkPG2kUVxvA 网络Devops探索与实践 王镇 鹅厂网事 2020-09-23  9月16日举办的2020 ODC ...

  10. Redis 雪崩、穿透和击穿

    https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/redis-caching-avalanche-and ...