摘要:而实际上在宿主机中也会同步启动一个进程,其在宿主机中是。如果其中的某一个容器正在执行密集型的任务,那么它就会影响其他容器的任务执行效率,导致多个容器相互影响并且抢占资源。
作者:荣幸
为什么是容器如果问你现在最热门的服务器端技术什么?想必很多人会不假思索的说是容器!
容器技术实际上并不是一个新鲜的名词,现在大家一提到容器马上想到的就是Docker,但是容器这个词并不是Docker公司发明的,早期的Pass项目如CloudFoundry,其底层就是基于namespace和cgroups的容器技术。
Docker在当时实际上是个小弟,并没有引起大家的注意,但是现在Docker已经成为容器事实上的标准,是什么让Docker发展成现在这样的程度呢?
这个功能就是Docker镜像。
早期的Pass平台最为人诟病的一个软肋就是应用的打包部署问题,一个应用包在本地部署的好好的,接入Pass平台后却问题重重,而Docker镜像解决了这个根本性问题。
容器到底是怎么回事前面我们说了容器实际上是很早以前就有的技术,主要用到的是Linux的namespace,cgroups和rootfs。
我们经常说沙盒或者集装箱,他们里面装的是货物,那容器这个沙盒装的又是什么呢?是进程!
我们把进程装进一个沙盒(容器)里面,给他制造边界,和盒子外面的世界隔离,所以我们会说容器实际上就是加了围墙的一个进程。
Namespace为进程制造边界就需要用到namespace技术,我们先运行一个docker进程看一下:
docker run -it busybox /bin/sh # -it 是提供一个tty的输入输出环境 # -d 后台运行程序 # -v 挂载外部存储 # -p 端口映射 # -e 参数变量 # busybox 轻量级的容器镜像
我们执行ps命令,可以看到有趣的现象,PID为1的就是我们的启动进程。
而实际上在宿主机中也会同步启动一个进程,其PID在宿主机中是22035。
这就是PID namespace实现的障眼法,它在Linux进程启动的时候(clone函数),会添加CLONE_NEWPID的参数,进程就会看到一个新的命名空间,所以进程ID就会变成1,实际上进程在宿主机上面还是22035。
除了PID namespace之外,还有很多的namespace,比如Network、Mount、User等,通过这些namespace对进程进行网络、储存、文件等进行限制,使这个进程看不到宿主机的真实情况,装在了盒子里,这就是容器的核心原理了。
Cgroups我们通过 Linux 的命名空间为新创建的进程隔离了文件系统、网络、宿主机器上的其他进程,但是命名空间并不能够为我们提供物理资源上的隔离,比如 CPU 或者内存。在同一台机器上可能运行着多个对彼此以及宿主机器一无所知的『容器』,但这些容器却共同占用了宿主机器的物理资源。
如果其中的某一个容器正在执行 CPU 密集型的任务,那么它就会影响其他容器的任务执行效率,导致多个容器相互影响并且抢占资源。如何对多个容器的资源使用进行限制就成了解决进程虚拟资源隔离之后的主要问题,而 Control Group(简称 cgroups)就能隔离宿主机器上的物理资源,例如 CPU、内存、磁盘 I/O 和网络带宽。cgroups介绍、应用实例及原理描述
容器是一个单进程的模型通过namespace和cgroups的学习我们知道了容器就是一个启用了多个namespace的应用进程,而这个进程能够使用的资源受到cgroups的限制。这里面有个很重要的概念:容器是一个单进程的模型。
由于容器本质上面是一个进程,即PID=1的进程,他是后续其他进程的父进程,这就意味着在一个容器内,你没有办法同时运行两个应用,除非找到一个公共的PID=1的父进程,并使用像systemd或者supervisor这样的软件替代PID=1的进程来做为容器的启动进程。
但是我们还是希望容器和应用是同生命周期的,因为如果容器是好的,而里面的进程却已经挂了,这样处理起来就会非常麻烦了。
通过上面对容器原理的了解,我们能不能分析出容器和虚拟机的区别?
虚拟机需要hypervisor层,在上面创建虚拟机是一个完整的OS
容器是Linux上的一个进程
虚拟机的OS资源消耗比容器大的多
容器使用的是宿主机上相同的内核
容器隔离不了时间等资源
镜像前面说了Docker能够成为容器现在的事实标准,主要是因为Docker创新了镜像这个东西,那么镜像在Linux系统里面是怎么存在的呢?
我们Docker的工作目录是/app/docker/docker/ ,其中有个overlay2子目录,它就是我们的镜像目录。
我们在这个目录下有三个目录和一个l的目录,如下:
我们可以进入其中一个目录,并查看该目录下diff子目录的内容:
到这里我们可以知道,镜像是由多个层组织并定义的,这些层本质上是文件,这些文件是只读的,每层具体的文件存放在层标识符下的diff目录下。
所以我们在制作镜像的时候就需要理解层的概念,提高镜像制作的效率和重复使用性。
以我们最常使用的Dockerfile制作镜像举例:
FROM node:8.16.0 RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo "Asia/Shanghai" >> /etc/timezone RUN date -R RUN mkdir -p /opt/app/ WORKDIR /opt/app RUN rm -rf /opt/app/node_modules/ COPY package.json ./ RUN npm install --registry=https://registry.npm.taobao.org
Dockerfile 中的每一条命令在最终生成的镜像中都会产生一层。Docker为了提高镜像分发效率,给镜像赋予了复用层的能力,在拉取,推送,build不同镜像时,不同镜像中内容相同的层可以被复用从而节省大量操作。
所以我们应该尽量把不变的命令放到 Dockerfile 的上层,这样会显著提高镜像的使用效率。
如果希望了解更多关于Docker或运维技术的知识,请关注徐徐运维的公众号
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/27880.html
摘要:月日,杭州站圆满收场。第二位嘉宾阿里巴巴移动安全专家何星宇,业界知名白帽子,本次的分享主题移动开发者所必须关注的安全那些事。杭州站分享已经结束,非常感谢大家的参与。 showImg(https://segmentfault.com/img/bVqWqG); 11 月 14 日,SegmentFault D-Day 杭州站圆满收场。虽然这次『云』议题比较高深,但丝毫没有影响到爱挑战的小伙...
摘要:月日数人云在上海举办金融沙龙,邀请上交所和近二十家来自银行保险证券的技术专家一同探讨容器技术在金融业中的最佳实践。数人云肖德时在会上将传统金融行业通过容器可以解决的四大问题做了逐一解读。如何动态的分配,就是刚才上交所介绍的一些治理的方法。 7月29日数人云在上海举办金融沙龙,邀请上交所和近二十家来自银行、保险、证券的IT技术专家一同探讨容器技术在金融业中的最佳实践。数人云CTO肖德时在...
摘要:对于商业市场来说,特别是中国这样一个云计算才刚刚起步的市场。反观云计算售卖的一些商品,目前主要还是以服务器为主。云计算的本质是将计算能力转化为标准化,可售卖的服务。可以说是云计算实践的一个经典案例。有的人会问,云计算厂商需要提供哪些服务。 2015年伊始,国内云计算市场可谓风起云涌。各路群豪纷纷涌入这个市场。其中最活跃的领域当属IAAS。阿里腾讯硝烟未尽,百度重新检讨了自己的PAAS战略后,...
摘要:所以借鉴大家惯用的传统运维思路,并配有一个与以前传统对接的点,广发银行有如下几个做法第一,操作系统。所以广发使用了一个配置文件包。版本流程这是广发银行持续集总的框架。 数人云上海&深圳两地容器之Mesos/K8S/Swarm三国演义的嘉宾精彩实录第一弹来啦。今天是广发银行数据中心的运维老兵沈伟康关于传统运维与容器适配的全方位分享,万字长文倾情奉上~ 沈伟康,广发银行数据中心 运维中年人...
摘要:的在调查发现问题在于的性能缺陷后,我们决定尝试解析器的性能,这是为我们的工具编写的。这意味着即使忽略任何优化,只是将解析器替换为解析器就可以缓解我们的性能瓶颈。 注: 转自 微信公众号高可用架构:从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例 导读:Python 被很多互联网系统广泛使用,但在另外一方面,它也存在一些性能问题,不过 Sentry 工程师分享的在关...
阅读 3034·2023-04-25 15:44
阅读 1818·2019-08-30 13:11
阅读 2798·2019-08-30 11:11
阅读 2949·2019-08-29 17:21
阅读 1276·2019-08-29 15:38
阅读 851·2019-08-29 12:49
阅读 1761·2019-08-28 18:19
阅读 3197·2019-08-26 14:01