2 容器技术概念入门篇

1、到底什么是容器
容器其实是一种沙盒技术,能够像一个集装箱一样,把你的应用装起来的技术,这样应用与应用之间,就因为有了便捷而不至于互相干扰。

2、容器是怎么实现的

  • 容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个边界。
  • 对于docker来说,cgroups技术是用来制造约束的主要手段,而namespace技术则是用来修改进程视图的主要方法

3、linux的namespace机制
linux系统中创建线程的系统调用时clone(),而这里面可以指定参数CLONE_NEWPID参数。这样新创建的这个进程将会看到一个全新的进程空间,这个进程空间里面,它的pid是1。这样就好像是新创建了一个虚拟机一样。这样就似乎是隔离起来了。
在这里插入图片描述

除了PID namespace,linux操作系统还提供了mount、uts、ipc、network和user这些namespace,用来对各种不同的进程上下文进行障眼法操作。这就是Linux容器最基本的实现原理了。

所以,容器,其实是一种特殊的进程而已。(不是我以前理解的精简版的虚拟机)

4、虚拟机和docker的架构对比:
如下docker画在跟应用同级别并且靠边的位置,意味着用户运行在容器里的应用进程,跟宿主机上的其他进程一样,都市宿主机操作系统统一管理,只不过这些被隔离得进程拥有额外配置过的namspace参数。
在这里插入图片描述

5、namaspace技术的缺点
隔离得不彻底,容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。

由于共享主机内核,那么容器给应用暴露出来的攻击面也是相当大的。而为了加固,对容器里面的系统调用增加的过滤,也一定会拖累容器的性能。

没人敢把运行在物理机上的linux容器直接暴露到公网上。

6、容器的限制问题
由于容器是一个特殊的进程,所以调度方面也是和其他进程正常竞争的(感觉这就不是容器该有的)

linux cgroups是Linux内核中用来为进程设置资源限制的一个重要功能。

Linux Cgroups的全称是Linux control group,它最主要的作用,就是限制一个进程组能够使用的资源上限,包括cpu、内存、磁盘、网络带宽等等。

linux cgroups简单理解,就是一个子系统目录加上一组资源限制文件的组合。对于docker 等Linux容器项目来说,只需要在每个子系统下面,为每个容器创建一个控制组,然后在启动容器进程之后,把这个进程的pid填写到对应控制组的tasks文件中就可以了。

容器是一个单进程模型。

7、容器里的进程看到的文件系统是什么样子的?
即使开启了Mount namespace,容器进程看到的文件系统也跟宿主机完全一样,因为mount namespace修改的,是容器进程对文件系统挂载点的认知。这意味着只有在挂载这个操作发生之后,进程的视图才会被改变。而在此之前,新创建的容器会直接继承宿主机的各个挂载点。

这就是Mount namespace跟其他namespace的使用不同的地方,他对容器进程视图的改变,一定是伴随着挂载操作才生效的。

实际上,mount namespace正是基于对chroot的不断改良才被发明出来的,他也是linux操作系统里的第一个namespace>

docker项目,最核心的原理实际上就是为待创建的用户进程做了下面几件事:

  1. 启用Linux namespace配置
  2. 设置指定的cgroups参数
  3. 切换进程的根目录

8、镜像的分层概念
docker在镜像的设计中,引入了层的概念,也就是说,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量rootfs

linux容器文件系统的实现方式,这种机制,正是容器镜像,也叫做rootfs,它只是一个操作系统的所有文件和目录,并不包含内核,最多也就几百兆,而相比之下, 传统虚拟机的镜像大多是磁盘的快照。

9、制作docker镜像的注意点

  • Dockerfile的设计思想,是使用一些标准的原语,描述我们所要构建的docker镜像,原语是按顺序处理的
  • entrypoint和cmd都是docker容器进程启动所必须的参数,统一称docker 容器的启动进程为entrypoint,而不是cm
  • dockerfile中的每一个原语执行后,都会生成一个对应的镜像层
  • 使用镜像,通过docker run命令启动容器,由于dockerfile中已经指定了cmd,所以不需要加具体的命令了

10、docker exec是怎么做到进入容器里的呢
一个进程,可以选择加入到某个进程已有的namespace当中,从而达到进入这个进程所在容器的目的,这正是docker exec的实现原理

11、数据卷-volume

  • 问题:容器里进程新建的文件,怎么才能让宿主机获取到?宿主机上的文件和目录,怎么才能让容器里的进程访问到?
  • volume机制,运行你将宿主机上指定的目录或者文件,挂载到容器里面进行读取和修改操作。
  • 如下是挂载的两种方式,第一种没有生命宿主机目录,默认会在宿主机上找一个临时目录;第二种情况docker就直接把宿主机的/home目录挂载到容器的/test目录上
    在这里插入图片描述
  • volume的原理:容器进程被创建之后,尽管开启了mount namespace,但是在执行chroot之前,容器进程一直可以看到宿主机的整个文件系统,所以只需要把握时机,在chroot之前挂载就可以了。
  • volumn里面的内容,在镜像commit的时候不会被提交的。

12、容器
实际上是一个由Linux namespace、linux cgroups和rootfs三种技术构建出来的进程的隔离环境

13、k8s项目要解决的问题是什么?

  • 大多数用户来说,希望K8s带来的效果:我有了应用的容器镜像,需要一个给定的集群把应用运行起来,而且需要提供网关、水平扩展、监控、备份、灾难恢复等一系列运维能力
  • k8s的全局架构图:有负责api服务的kube-apiserver、负责调度的kube-scheduler以及负责容器编排的kube-controller-manager。而集群持久化则由kube-apiserver处理后保存到etcd中。

在这里插入图片描述

  • 遇到了容器间紧密协作关系的难题,所以扩展到了pod
  • 有了pod之后,希望一次启动多个应用的实例,就需要deployment这个pod的多实例管理器
  • 有了一组相同的pod后,需要一个固定的Ip地址和端口以负载均衡的方式访问它,所以有了service
  • 如果两个不同的pod之间有访问关系,需要加上授权信息,所以提供了secret对象
  • 应用运行的形态也是重要因素,比如像一次性运行的pod被定义为了Job、每个宿主机上必须且只能有一个副本的守护进程服务被定为为了daemonSet。。

在这里插入图片描述

14、k8s项目如何启动一个容器化任务

  1. 编写一个yaml文件
  2. 执行如下命令进行启动
    在这里插入图片描述

15、k8s的本质
k8s项目的本质,是为用户提供一个具有普遍意义的容器编排工具

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值